Pricing reference
Every control of the Pricing card, the six pricing models side by side, the other pricing surfaces (Revenue share, Bid floor, CPM threshold, network defaults, general action pricing), the CSV upload format and the permissions the REST API checks — the companion to the Configure pricing guide.
The companion to Configure pricing. The guide has the steps, the caveats and the fix-it checklist; this page holds every control, the six models, the other pricing cards and the CSV format.
The six pricing models
Charged on is the event that books money; Per event is what the ad server records for one
such event, from a configured price.
| Model | Offered on | Charged on | Per event |
|---|---|---|---|
| CPM | campaign, banner, placement, site | every impression | price ÷ 1000 |
| CPC | campaign, banner, placement, site | every click | price |
| CPA | campaign, banner, placement, site | every conversion | the resolved action price, undivided |
| vCPM | campaign, banner, placement, site | every viewable impression | price ÷ 1000 |
| Cost per day | placement, site only | nothing at serve time | 0 — see below |
| Cost per month | placement, site only | nothing at serve time | 0 — see below |
vCPM pays on viewable impressions and on nothing else. An impression, a click and a conversion
are all worth 0 to the side on vCPM, and each viewable impression books price ÷ 1000. The two
sides are independent: a vCPM publisher can run a CPM advertiser, who is still charged per
impression, and the other way round. A vCPM price set on a site covers its placements without a
price of their own, and one on a campaign covers its banners, but a level below an entity priced on
other terms never adds a second payment: the CPM placement of a vCPM site is paid per impression
only. vCPM depends on the viewable impression being measured — see
What vCPM does not cover.
The flat-fee models are not an ad-serving price at all. Ad serving books 0 gross and 0
net for a Cost-per-day or Cost-per-month placement. A scheduled job then rewrites the day’s
publisher net in analytics: it divides the flat fee by the impressions the
placement (or site) actually took in the period to get a synthetic CPM, then spreads that back
over each row. The advertiser side is never touched, so a flat fee produces publisher payout
only — there is no advertiser-facing flat fee anywhere in the product. A site’s flat fee
overrides every price under it; details under
Pricing precedence — corner cases.
The Pricing card’s controls
In on-screen order: the top row, then the add bar.
| Control | Appears when | What it does |
|---|---|---|
| Card switch | always | Creates or deletes the entity’s pricing record, with its country and action prices. Off means “this entity sets no price”; switching off asks for confirmation. |
| Use general pricing | type is CPA | Lets the network-wide action prices fill in where this entity has none. It does not replace the entity’s own prices — see Pricing precedence. |
| Minimum margin / Margin value / Save | placement or site, type CPM or vCPM, Manage Minimum Margin enabled | The smallest gap the network requires between the advertiser price and the publisher payout. Margin value appears once the type is not None; Save commits both. See Set a minimum margin. |
| Upload CSV | type is CPM, CPC, CPA or vCPM | Bulk import. Adds and updates only the countries the file mentions; every other existing row is left untouched. Format below. |
| Pricing type | editable | The model. Options are filtered by your per-model permissions. Changing it deletes all existing prices. |
| Actions | type is CPA | Which conversion action the row prices. All means every action that has no price of its own. The grid column is headed Action. |
| Country | type is CPM, CPC, CPA or vCPM | Which country the row prices. Global writes the fallback price; a region or custom country group writes one row per member country. |
| Price | always | Accepts 0 to 1000000; stored to six decimal places. |
| Add | editable | Inserts the row, or overwrites the matching one. |
| Delete | rows selected | Removes the selected rows; the Global row is cleared rather than deleted. |
| eCPM optimization estimates | campaign only, type CPC or CPA, network optimization is eCPM with Burn-up, and Manage “eCPM Optimization” at enabled or read-only level | Seeds the optimizer before it has data: Estimated CTR and Min clicks on a CPC campaign, Estimated I2C and Min conversions on a CPA one, plus Start-Up period (h), Burn-Up period (h), Subperiod (h) and Subperiod weights. See Optimization. |
The Global row has three states: Not set (countries without their own row fall through to the next rule), an explicit 0 (a real price that stops the fall-through — nothing paid, nothing charged, no lower rule consulted), and a value. Clearing the Price cell returns the row to Not set.
The other pricing surfaces
| Card | Where | What it does |
|---|---|---|
| Revenue share | site, placement | Pays the publisher a percentage of the advertiser’s gross for the same event instead of a fixed price. Each binding names an advertiser and a campaign, either of which may be Any, and a Revenue share (%). |
| Bid floor | site, placement, banner | A per-country minimum CPM an OpenRTB DSP bid must clear; direct campaigns are not filtered by it. Use as publisher pricing makes the floor double as the payout. Needs Bid Floor Management, which only your network administrator can grant — see Set a bid floor. |
| Minimum margin | site, placement | Lives on the Pricing card itself. The ad-server counterpart of a bid floor for direct demand. |
| CPM Threshold | site | A per-country revenue floor for the publisher, applied in reporting and payouts. It does not stop direct campaigns serving. See Site CPM threshold. |
| Network defaults | Admin → Ad serving → Inventory & campaigns settings | A default fixed price (with its own country rows) and default revenue-share bindings, stamped onto every new site at creation. Changing them does not touch sites that already exist. |
| General action pricing | the conversion action’s own edit page | A network-wide CPA price per action, with its own country rows. This is what Use general pricing draws on. |
On a site or placement the two payout cards always read in the same order — Revenue share first, Pricing second. With both switched on, a warning above the pair states which wins.
The revenue-share pickers name only advertisers you manage. The advertiser and campaign
pickers offer every advertiser of the network, but one that is not shared with you (or that
Mask campaigns hides from you) is listed by id — ADVERTISER_12, CAMPAIGN_34 — and a private
advertiser you do not manage is not offered at all. The same masking applies to the names in the
card’s grid.
Revenue share has no real on/off. The Revenue share switch only opens the editor; the feature counts as enabled the moment the first binding row exists — any row, including one bound to a single advertiser or campaign, not only the blanket Any / Any row. Switching it on saves nothing by itself, so add at least one binding before you leave: a switch turned on with no binding reads off again the next time the page loads. Switching it off deletes every binding, which is not reversible by switching it back on — so, on a site and on a placement alike, it asks Turn this off? first.
Regions and country groups
The Country dropdown offers world regions (Western Europe, LATAM, Asia, …) and any custom country groups alongside Global and the individual countries, because it shares its list with targeting. Picking one in the Add bar writes a row for each member country at the price you typed, overwriting any that already exists; the region itself is never stored. A CSV upload and the REST API do not expand them: a country there must be an individual country, as an ISO code or an English name, and anything else is reported as not recognised. List the member countries individually in those.
CSV format
Two columns for CPM, CPC and vCPM, headers spelled exactly Country and Price. For CPA the
first header must be exactly _ and each further column is named after a conversion action
(its name, or All); a * country sets the Global price. The delimiter may be comma, tab or
semicolon and is detected automatically; the file must be UTF-8; a leading $ in a price is
ignored. In a tab- or semicolon-delimited file a comma in the price is read as a decimal
separator (1,50 → 1.50) as long as the value has no literal dot already — a comma-delimited
file never gets this treatment, since there a comma can only be a quoted thousands separator.
Countries are accepted as an ISO alpha-2 code or a full English name and are normalised to upper
case (gb/GB is stored as UK, matching the Country picker).
Upload adds and updates only the countries the file mentions — rows already on the grid that the file does not mention are left exactly as they were, on every entity, the same as adding a country from the toolbar. Unrecognised countries and unparseable prices are reported one per line, each tagged with its line number, and the rest of the file still applies — a partial import is the normal outcome, not an aborted one. A price outside 0–1,000,000 is reported the same way as an error, and a country listed twice in one file keeps its first value, with the later lines reported as errors. The flat-fee models have no country table and no upload.
Permissions over the API
A price cannot be added before the switch is on: an entity whose Pricing card has never been switched on has no pricing record, and the REST call is refused with a 400 — No pricing is set yet: set it first with POST …/pricing.do — with nothing written. On a banner the console has a second precondition: the creative’s file must be present in storage, and a banner whose uploaded file has gone missing refuses prices with no message at all.
Changing the pricing type deletes the global price and every country and action row, in the
console (after confirmation) and over the REST API alike: sending a different pricingType to a
campaign’s or a site’s …/pricing.do deletes their country and action prices (placements under
the site keep theirs). Over the API, choosing a pricing type also needs that type’s permission
(for example CPA_PRICING_TYPE), exactly as the console’s type picker does — including the first
time a campaign’s or banner’s pricing record is created, whether by …/pricing.do (CPM unless
pricingType is sent) or by …/actionPricing.do (CPA). Without it the call is a 403 naming the
permission and nothing is saved. In the console, adding a vCPM price to a campaign or banner (the
global price or a country price, including on an entity already on vCPM) needs vCPM Pricing
Type the same way: without it the add is a 403 naming VCPM_PRICING_TYPE. So do editing a
price inline and uploading a CSV on a campaign or banner that is on vCPM: the edit is refused
the same way, and the upload adds nothing and lists the missing permission as its error. On a
campaign, if the network runs eCPM optimization and the campaign has collected optimization
data, a second prompt offers to reset that data too. Adding or deleting a price can raise the
same prompt.
The calls themselves are on Pricing over the REST API and MCP.