Browse the help center

Pricing precedence: which price is charged and paid

The order in which banner, campaign, revenue-share, fixed-price, CPA action and flat-fee prices resolve into gross and net, with worked examples.

Reference network manager Account → Advertisers → campaign → Pricing

Several cards can price the same event: a banner and its campaign on the demand side, revenue shares and fixed prices on the placement and its site on the supply side, and per-action rows for CPA. This page gives the order in which they are consulted, how gross and net are worked out for one event, and worked examples. How to fill each card in is on Configure pricing.

Who this is for

  • Network managers reading the Gross and Net columns who need to know which card produced a figure, or why a publisher is paid more than the advertiser is charged.
  • Advertisers checking whether a creative’s own price or the campaign’s applies.

Which price applies

Demand side — what the advertiser is charged

  1. The banner’s own price.
  2. Failing that, the campaign’s price.
  3. Failing that, 0.

A banner’s price only answers when all three of these hold: the banner has a pricing record, its pricing type matches the event being charged, and a price resolves for it. Within one entity the country row wins over the global price; an explicit 0 is a real price and stops the search, while Not set continues it.

There is no advertiser-level and no zone-level pricing — those entities have no Pricing card and no pricing table.

Whatever price is found is then passed through price adjustment rules, applied advertiser → campaign → banner, with the banner’s rule applied last.

Supply side — what the publisher is paid

Read top to bottom; the first rule that answers wins, and everything below it is ignored.

#Rule
1Placement revenue share bound to this campaign
2Placement revenue share bound to this advertiser
3Placement fixed price — country row, else global
4Placement blanket revenue share (advertiser Any, campaign Any)
5Site revenue share bound to this campaign
6Site revenue share bound to this advertiser
7Site fixed price — country row, else global
8Site blanket revenue share
90.00

Two consequences worth reading twice. Any rule on the placement answers before the site is consulted at all — a blanket revenue share on a placement hides every per-country fixed price on its site. And a share bound to one advertiser outranks a fixed price, so a carefully set US $1.00 still loses to a 60% share pinned to that advertiser.

Because the two are so easy to get the wrong way round, the edit page states the order itself whenever Revenue share and Pricing are both switched on, in a warning above the two cards:

Placement edit page showing the precedence warning above the Revenue share and Pricing cards

Revenue share is always a percentage of gross — the advertiser’s price for that same event, after price adjustment rules — never a percentage of some other payout.

For OpenRTB DSP creatives a bid floor marked Use as publisher price is consulted before all of this, banner then placement then site.

CPA — which action price applies

Within the entity that won above:

  1. This entity’s price for this action in this country
  2. This entity’s price for this action (any country)
  3. This entity’s All price for this country
  4. The network’s general price for this action in this country, or its All price for this country
  5. The network’s general price for this action (any country)
  6. This entity’s general (non-action) price — the Global row of All

Steps 4 and 5 are skipped unless Use general pricing is on for that entity, and step 5 is additionally skipped unless the entity’s own general price is unset or zero. An All row never beats a price the entity has for the action itself: step 3 answers only when step 2 found nothing.

Which price wins: gross and net, step by step

Every event — an impression, a click, a conversion — is priced on its own, at the moment it is counted. The ad server works out two figures: gross (what the advertiser is charged — the Gross column, and what a Budget limit counts) and net (what the publisher is paid — the Net column). Your margin is gross minus net. Each event asks for the price of its own type: an impression asks for a CPM price, a click for a CPC price, a conversion for a CPA price. A price of another type does not apply to that event at all.

How the advertiser price (gross) is chosen: banner, campaign or auction

  1. OpenRTB DSP banners use the auction: the gross is the price the DSP won at (the clearing price), not a card. Events the partner’s pricing model does not bill are priced at 0 on both sides.
  2. Banner Pricing card, if the banner has one switched on and its type matches the event: the country’s row, otherwise its Global price.
  3. Otherwise the campaign Pricing card, read the same way.
  4. Nothing matched → gross is 0. A CPM campaign earns nothing on clicks, a CPC campaign nothing on impressions.
  5. If the campaign allows it, a price passed in the click or impression URL replaces the card price (CPM values are passed per 1000).
  6. Price adjustment rules for the serving placement run last, in the order advertiser → campaign → banner, and only on events of the entity’s own pricing type.

How the publisher payout (net) is chosen: revenue share or fixed price

The placement is consulted first and the site only if nothing on the placement answers. At each level the order is:

  1. Revenue share pinned to this campaign, then pinned to this advertiser — a percentage of the gross.
  2. The fixed price on the Pricing card, if its type matches the event: the country’s row, otherwise Global. A Global left Not set does not answer.
  3. The blanket “Any” revenue share.

So the full order is: placement campaign/advertiser share → placement fixed price → placement blanket share → site campaign/advertiser share → site fixed price → site blanket share → 0. With every payout card on both levels switched off, net is 0. One exception comes before all of this: on an OpenRTB DSP banner’s impression, a Bid Floor with Use as publisher price on the banner, then the placement, then the site, pays that floor as the net.

Profit on programmatic (DSP) demand: why net is 0, or the whole price is profit

On an OpenRTB DSP banner the gross is the auction’s clearing price, so your profit depends only on what the publisher side pays — the same chain as above:

  • No payout card on the placement or site → net is 0, and the whole clearing price shows as profit. That is correct for your own inventory; for a publisher you pay, it means their payout was never set up.
  • A revenue share (pinned or blanket) → net is that percentage of the clearing price; the rest is your margin, and it moves with every auction.
  • A Bid Floor with Use as publisher price → net is the floor itself, whatever the bid cleared at; your margin is the clearing price minus the floor. Bids below the floor are rejected, so on open-auction impressions it cannot go negative — a PMP deal bid is exempt from the floor and can clear below it.
  • A fixed CPM pays that price per impression whatever the DSP paid — the one setup where a low-clearing auction loses money.

Events the partner’s pricing model does not bill (an impression on a CPC partner, for example) are priced 0 on both sides, so they carry neither revenue nor payout.

Worked example: CPM campaign, revenue share vs fixed price

A campaign priced at $4.00 CPM for every country; a price adjustment rule on the campaign sets Multiply 1.25 for placement Sports Daily — Top. One impression from Germany on that placement:

StepCalculationResult
Gross from the campaign card4.00 / 1000$0.0040
Adjustment rule (×1.25)0.0040 × 1.25$0.0050 gross
Net with a 70% blanket revenue share on the placement0.0050 × 70%$0.0035 net, $0.0015 margin
Net with a $2.50 fixed CPM on the placement instead2.50 / 1000$0.0025 net, $0.0025 margin
Net with both: $2.50 fixed CPM and a 70% share pinned to this advertiserthe pinned share answers first$0.0035 net

A revenue share is a percentage of the gross after adjustment rules, so a Multiply rule raises the publisher’s payout too; a fixed price does not move.

Why the publisher payout is higher than the advertiser price

This is almost always a type mismatch or a fixed price that ignores the demand. Check, in order:

  • The placement pays a fixed CPM but the campaign is CPC or CPA. Every impression pays the publisher the CPM while the advertiser is charged only for clicks or conversions, so net runs ahead of gross. Use a revenue share on such placements.
  • The placement’s fixed price is higher than the campaign’s price. A fixed price is paid whatever the advertiser pays — a $3 CPM payout on a $2 CPM campaign loses $1 per thousand. Use a minimum margin (CPM only) or a revenue share.
  • A revenue share was set on the site, but the placement has its own fixed price. The placement answers first, so the site share is never reached.
  • The campaign has no price at all. Gross is 0, so a fixed publisher price is pure loss and a Budget limit never fills — a budget counts gross.

Past figures are not re-priced when you change a card.

Can a placement pay a different CPM for each advertiser?

Not as a fixed price. A placement’s (or site’s) Pricing card holds one price per country — a Global row plus country rows (and per-action rows for CPA). It has no advertiser or campaign column, so a fixed CPM on a placement is the same whichever advertiser’s ad fills it.

What can differ per advertiser or per campaign on one placement:

You wantUseWhere
The publisher earns a different share of each advertiser’s moneyA revenue share pinned to the advertiser or campaign — it answers before the placement’s fixed pricePlacement (or site) → Revenue Share card → add a row for the advertiser or campaign
An advertiser pays a different price on this placement than elsewhereA price adjustment rule on that advertiser, campaign or banner with the condition Placement is … — Multiply the price or Set itAdvertiser / campaign / banner → Price Adjustment Rules (guide)
Different prices per countryCountry rows on the Pricing cardPlacement, site or campaign → Pricing

To get the effect of “advertiser A pays this placement $3 CPM, advertiser B $2 CPM”, combine the two: a price adjustment rule that Sets each advertiser’s CPM on that placement, plus a revenue share pinned to each advertiser on the placement. The payout is then the pinned share of the adjusted price — a predictable number per advertiser. Remember the order from above:

  1. Gross: banner or campaign price → URL price (if allowed) → adjustment rules (advertiser → campaign → banner, each feeding the next — a banner-level Set has the last word).
  2. Net: placement share pinned to the campaign → pinned to the advertiser → placement fixed price → placement “Any” share → the same three on the site → 0.

Corner case: a pinned revenue share beats the placement’s fixed price. Once you add an advertiser-pinned share, that advertiser’s events no longer get the fixed CPM — they get the percentage. Advertisers without a pinned row still fall through to the fixed price.

Corner case: a price adjustment rule only matches a placement; there is no site, zone or country condition. To change one advertiser’s price on a whole site, add one rule per placement (or use the campaign’s country rows if the difference is really by country).

Corner cases and gotchas

Corner case — “Use general pricing” does not switch anything off. The name reads as an either/or, and it is not one. With it on, this entity’s own action prices are still consulted first; the network’s general action prices only fill in where the entity has none. The network’s flat per-action price is additionally ignored unless the entity’s general price is unset or zero. So a campaign with its own CPA rows behaves identically whether the toggle is on or off — the toggle changes nothing until a row is missing.

Corner case — a banner price with the wrong model quietly disables the campaign’s rules. Suppose a banner is priced CPC and its campaign CPM. On an impression the banner’s price cannot answer (wrong model), so the campaign’s CPM price is used — correctly. But the engine still treats the banner’s model as the one in force, so the campaign’s CPM price adjustment rules do not fire and URL price overrides are ignored. If a rule “isn’t working”, check that the banner’s own Pricing card is either off or set to the same model as the campaign.

Corner case — flat fees are reported, not served. A Cost-per-day or Cost-per-month price is written into analytics by a scheduled job, not by ad serving, which has three consequences. A day with no impressions earns nothing, not the fee. Figures move as the period fills up, because the job recomputes the whole day (or the whole month) each time it runs — roughly every five hours during the day, with a final pass at 01:20 for the previous day and, for monthly pricing, at 01:50 on the 1st for the month just ended. And only daily analytics are rewritten: hourly reports for a flat-fee placement show zero revenue.

Corner case — for flat fees, the site overrides the placement. The job spreads placement fees first and site fees second, and the site pass rewrites every row under that site’s zones, whatever price the placement has: CPM, CPC, CPA or a flat fee of its own that the placement pass has just written. So the site’s figure is what survives in analytics, the exact inverse of the serving-time cascade, where the placement always wins. With different periods on the two levels the monthly fee wins, because the monthly pass runs after the daily one: a Cost-per-month placement under a Cost-per-day site keeps its own monthly fee, and every placement under a Cost-per-month site gets the site’s fee. Set a flat fee at one level only.

Corner case — OpenRTB DSP banners are CPM only. On an OpenRTB DSP banner the pricing-type dropdown offers CPM regardless of your CPC/CPA permissions, and unsupported pricing-model/event combinations pay the publisher 0. See OpenRTB DSP banners.

Related pages

Please disable Adblock
Are you using adblock? Disable it and reload the page to proceed to the destination page.

A registration has already been submitted from this page. Please try again in 10 minutes.