---
title: "Pricing precedence: which price is charged and paid"
description: "The order in which banner, campaign, revenue-share, fixed-price, CPA action and flat-fee prices resolve into gross and net, with worked examples."
type: "reference"
audience: [network-manager]
keywords: [pricing precedence, gross, net, gross to net, revenue share, fixed price, CPA action price, use general pricing, flat fee, cost per day, cost per month, margin, DSP profit, price per advertiser]
ui_path: "Account → Advertisers → campaign → Pricing"
---

Fetch the complete documentation index at: https://epom.com/ad-server/docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Pricing precedence: which price is charged and paid

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](https://epom.com/ad-server/docs/guides/delivery/pricing.md).

## 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](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md), 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 |
|---|---|
| 1 | Placement revenue share bound to **this campaign** |
| 2 | Placement revenue share bound to **this advertiser** |
| 3 | Placement fixed price — country row, else global |
| 4 | Placement blanket revenue share (advertiser *Any*, campaign *Any*) |
| 5 | Site revenue share bound to **this campaign** |
| 6 | Site revenue share bound to **this advertiser** |
| 7 | Site fixed price — country row, else global |
| 8 | Site blanket revenue share |
| 9 | `0.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](https://epom.com/docs-images/ad-server/pricing/placement-pricing-card.webp)

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](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md)** 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:

| Step | Calculation | Result |
|---|---|---|
| Gross from the campaign card | 4.00 / 1000 | $0.0040 |
| Adjustment rule (×1.25) | 0.0040 × 1.25 | **$0.0050** gross |
| Net with a 70% blanket revenue share on the placement | 0.0050 × 70% | **$0.0035** net, $0.0015 margin |
| Net with a $2.50 fixed CPM on the placement instead | 2.50 / 1000 | **$0.0025** net, $0.0025 margin |
| Net with both: $2.50 fixed CPM and a 70% share pinned to this advertiser | the 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](https://epom.com/ad-server/docs/guides/delivery/pricing-bid-floor-and-margin.md#set-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 want | Use | Where |
|---|---|---|
| The publisher earns a different share of each advertiser's money | A **revenue share pinned to the advertiser or campaign** — it answers before the placement's fixed price | Placement (or site) → **Revenue Share** card → add a row for the advertiser or campaign |
| An advertiser pays a different price on this placement than elsewhere | A **price adjustment rule** on that advertiser, campaign or banner with the condition *Placement is …* — **Multiply** the price or **Set** it | Advertiser / campaign / banner → **Price Adjustment Rules** ([guide](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md)) |
| Different prices per country | Country rows on the Pricing card | Placement, 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](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md) 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](https://epom.com/ad-server/docs/guides/advertising/banner-openrtb-dsp.md).

## Related

- [Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md)
- [Set a bid floor and a minimum margin](https://epom.com/ad-server/docs/guides/delivery/pricing-bid-floor-and-margin.md)
- [Pricing over the REST API and MCP](https://epom.com/ad-server/docs/guides/delivery/pricing-over-the-api.md)
- [Price adjustment rules](https://epom.com/ad-server/docs/guides/delivery/price-adjustment-rules.md)
- [CPM, eCPM and RPM explained](https://epom.com/ad-server/docs/concepts/revenue-metrics-cpm-ecpm-rpm.md)
- [Campaigns](https://epom.com/ad-server/docs/guides/advertising/campaigns.md)
- [Placements](https://epom.com/ad-server/docs/guides/inventory/placements-create.md)