---
title: "Pricing reference"
description: "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."
type: "reference"
audience: [network-manager, advertiser]
keywords: [pricing reference, pricing card controls, pricing models, CPM, CPC, CPA, vCPM, cost per day, cost per month, flat fee, revenue share card, bid floor card, CPM threshold, network defaults, general action pricing, pricing CSV format, CSV upload, decimal comma, VCPM_PRICING_TYPE, CPA_PRICING_TYPE]
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 reference

The companion to [Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md). 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](https://epom.com/ad-server/docs/guides/delivery/pricing.md#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](https://epom.com/ad-server/docs/guides/delivery/pricing-precedence.md#corner-cases-and-gotchas).

## 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](https://epom.com/ad-server/docs/guides/delivery/pricing-precedence.md#corner-cases-and-gotchas). |
| **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](https://epom.com/ad-server/docs/guides/delivery/pricing-bid-floor-and-margin.md#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](https://epom.com/ad-server/docs/guides/delivery/optimization.md). |

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](https://epom.com/ad-server/docs/guides/delivery/pricing-bid-floor-and-margin.md#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](https://epom.com/ad-server/docs/guides/delivery/cpm-threshold.md). |
| **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](https://epom.com/ad-server/docs/guides/delivery/pricing-over-the-api.md).

## Related

- [Configure pricing](https://epom.com/ad-server/docs/guides/delivery/pricing.md) — the guide
- [Pricing precedence: which price is charged and paid](https://epom.com/ad-server/docs/guides/delivery/pricing-precedence.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)
- [Site CPM threshold](https://epom.com/ad-server/docs/guides/delivery/cpm-threshold.md)
- [Conversion actions](https://epom.com/ad-server/docs/guides/conversions/conversion-actions.md)