Publisher-Declared, Buyer-Selected Model
How It Works
- Publishers declare pricing options in their products via
pricing_optionsarray (each with uniquepricing_option_id) - Buyers discover available options through
get_products - Buyers select a specific option when creating a media buy via
pricing_option_id - Delivery is measured according to the declared
delivery_measurementprovider
Key Benefits
- Flexibility: Publishers can offer multiple pricing models for the same inventory
- Currency Support: Publishers specify supported currencies; buyers must match
- Market Standards: Each channel (TV, video, display, performance) can use its natural pricing unit
- Clear Expectations: Both parties agree on pricing before campaign launch
Measurement & Source of Truth
Measurement Provider as Source of Truth
The product declares the measurement provider, and the buyer accepts that provider as the source of truth for the buy. Publishers specify their measurement provider in the product:- Ad Servers: Google Ad Manager, Freewheel, SpringServe
- Attention Metrics: Adelaide, Lumen, TVision
- Third-Party Verification: IAS, DoubleVerify, Scope3
- TV/Audio Measurement: Nielsen, Comscore, iSpot.tv, Triton Digital
- DOOH: Geopath, Vistar, Place Exchange
Best Practices
For Publishers:- Clearly identify your measurement provider (ad server and any third-party verification)
- Explain your measurement methodology in plain language
- For DOOH, specify your audience measurement source (e.g., Geopath, venue sensors)
- Review the measurement provider before committing budget
- Ensure the provider meets your campaign requirements
- Negotiate audit rights in contracts if needed
Supported Pricing Models
CPM (Cost Per Mille)
Cost per 1,000 impressions - Traditional display advertising pricing. Use Cases: Display, native, banner advertising Example:vCPM (Viewable Cost Per Mille)
Cost per 1,000 viewable impressions - Payment only for impressions meeting MRC viewability standard. Use Cases: Display, native, video advertising with viewability guarantee Viewability Standard: MRC (Media Rating Council) standard requires:- Display ads: 50% of pixels in-view for at least 1 continuous second
- Video ads: 50% of pixels in-view for at least 2 continuous seconds
delivery_measurement field. Common providers include IAS (Integral Ad Science), DoubleVerify, MOAT, and Google Active View.
CPCV (Cost Per Completed View)
Cost per 100% video/audio completion - Payment only for fully completed views. Use Cases: Video campaigns, audio ads, pre-roll video Example:CPV (Cost Per View)
Cost per view at threshold - Payment when viewer reaches publisher-defined threshold. Use Cases: Video campaigns with shorter completion requirements Example:view_threshold: Decimal from 0.0 to 1.0 (e.g., 0.5 = 50% completion)
CPP (Cost Per Point)
Cost per Gross Rating Point - Traditional TV/radio buying metric. Use Cases: Connected TV, linear TV, radio, audio streaming Example:demographic: Target demographic (e.g., “A18-49”, “W25-54”, “M35+”)min_points: Minimum GRP commitment required
grps: Total Gross Rating Points deliveredreach: Unique individuals reachedfrequency: Average frequency per individual
- Nielsen DAR/TV: Industry-standard TV measurement
- Comscore: Campaign Ratings for CTV
- iSpot.tv: Advanced TV analytics
- Triton Digital: Audio/streaming measurement
CPC (Cost Per Click)
Cost per click - Performance-based pricing for engagement. Use Cases: Direct response campaigns, search ads, social advertising Example:CPA (Cost Per Acquisition)
Cost per conversion event - Advertiser pays when a defined conversion occurs. Use Cases: Retail media (pay per order), lead generation, app install campaigns, commerce media Example:event_type fires. The pricing option declares what event triggers billing — this is independent of optimization_goals, which controls delivery optimization.
Parameters:
event_type(required): The conversion event that triggers billing. Uses the standard event type enum (e.g.,purchase,lead,app_install,add_to_cart,subscribe).event_source_id(optional): When present, only events from this specific source count toward billing. Must match an event source configured viasync_event_sources. When omitted, any event of the specifiedevent_typecounts.
event_type (what triggers billing) is independent of the package’s optimization_goals (what the platform optimizes delivery toward). For example, a package can use CPA pricing on lead events while setting an event goal with event_sources containing purchase events and target: { kind: "per_ad_spend", value: 4.0 } — billing fires on leads, but delivery is optimized for downstream purchase return.
Refunds and adjustments: Refund handling and conversion adjustment policies are commercial terms between buyer and seller. The protocol does not govern clawbacks or billing credits for refunded conversions.
Note: CPA replaces the need for separate “CPO” (Cost Per Order) or “CPL” (Cost Per Lead) pricing models. A seller can offer multiple CPA options with different event types, event sources, and prices on the same product.
Flat Rate
Fixed cost - Single payment regardless of delivery volume. Use Cases: Sponsorships, takeovers, exclusive placements, branded content, DOOH fixed slots Example (sponsorship):parameters.type: "dooh"):
sov_percentage: Guaranteed share of voice as a percentage (0-100)loop_duration_seconds: Duration of ad loop rotation in secondsmin_plays_per_hour: Minimum guaranteed plays per hourvenue_package: Named collection of screensduration_hours: Duration of the slot in hours (e.g., 24 for a full-day takeover)daypart: Named daypart (e.g.,morning_commute,evening_rush)estimated_impressions: Audience impression estimate (informational, not a delivery guarantee)
parameters — the fixed price covers the placement without DOOH-specific constraints.
Time (Cost Per Time Unit)
Cost per time unit - Rate scales with campaign duration, enabling self-serve sponsorships. Use Cases: Homepage takeovers, section sponsorships, premium placements where price depends on booking duration Example:fixed_price x number of time_units in the campaign flight. For example, a 3-day campaign at $50,000/day = $150,000 total.
Parameters:
time_unit(required):"hour","day","week", or"month"min_duration(optional): Minimum booking duration in time unitsmax_duration(optional): Maximum booking duration in time units
| Time Unit | Calculation |
|---|---|
hour | rate x hours in flight |
day | rate x calendar days in flight |
week | rate x weeks (seller-defined rounding) |
month | rate x months (seller-defined pro-rating) |
| Aspect | Flat Rate | Time |
|---|---|---|
| Semantics | Fixed total cost | Rate x duration |
fixed_price means | Total campaign cost | Cost per time unit |
| Buyer flexibility | Must negotiate duration | Self-serve any duration |
| Use case | Fixed sponsorships | Scalable sponsorships |
Digital Out-of-Home (DOOH) Pricing
DOOH advertising uses existing pricing models—typically CPM or flat_rate—with optional parameters to describe the inventory allocation.Basic Concepts
- CPM for DOOH: Priced per thousand impressions, where impressions are calculated based on venue traffic (e.g., Geopath data)
- Flat rate for DOOH: Fixed cost for specific duration or allocation (hourly, daily, or exclusive takeover)
Simple Example: Billboard Takeover
DOOH parameters (optional)
For flat_rate DOOH inventory, publishers may include aparameters object with "type": "dooh". See the flat_rate pricing model section above for a complete example and full field list.
Note: DOOH measurement and buying practices vary by market. Publishers should clearly explain their measurement methodology and inventory allocation in the product description and delivery_measurement field.
Price Breakdown
When buyer and seller have negotiated discounts and commissions, theprice_breakdown object discloses how fixed_price was derived from the rate card. This is optional — sellers who don’t need breakdowns omit it entirely, with zero overhead to existing implementations.
price_breakdown is a planning-layer construct. It exists on pricing options and confirmed packages within AdCP — it does not propagate into impression-level OpenRTB bid requests or responses.
Structure
list_price— the rate card or base price before any adjustmentsadjustments— ordered list of adjustments, each categorized bykindfixed_price(on the parent pricing option) — must equal the result of applying allfeeanddiscountadjustments sequentially tolist_price
price_breakdown and its adjustments to support forward compatibility.
Adjustment Kinds
Adjustments fall into four kinds based on their economic effect:| Kind | Effect on buyer price | Effect on publisher revenue | When applied |
|---|---|---|---|
fee | Increases it | Increases it | Before quoting — walks list_price up toward fixed_price |
discount | Reduces it | Reduces it | Before quoting — walks list_price down toward fixed_price |
commission | None — budget includes it | Reduces it (revenue split) | Revenue allocation between intermediary and publisher |
settlement | None — post-invoice | Reduces actual payment | At invoicing or payment time |
list_price.
Discounts reduce what the buyer pays. Volume discounts, negotiated rates, and early booking discounts all lower both the buyer’s cost and the publisher’s revenue.
Commissions are revenue splits. The buyer’s price and budget don’t change — commission determines how the payment is divided between the intermediary (e.g., agency) and the publisher. Budgets are always managed inclusive of commissions. Multiple commission adjustments compound sequentially, like discounts — e.g., a 15% agency commission followed by a 5% trading desk fee means the publisher receives budget × 0.85 × 0.95.
Settlement adjustments are applied at invoicing or payment time (e.g., a cash discount for early payment). They don’t affect the committed price or budget. Retroactive rebates and performance incentives are out of scope for price_breakdown and would be handled through reconciliation workflows.
Beneficiary
Each adjustment may include an optionalbeneficiary field identifying who receives the adjustment’s value. This is most useful for commission adjustments in multi-intermediary chains:
Invariant
The invariant is:list_price with all fee and discount adjustments applied sequentially equals fixed_price. Commission and settlement adjustments don’t participate — they’re disclosed for transparency. If no fee or discount adjustments are present, fixed_price must equal list_price.
This invariant applies only when fixed_price is present on the parent object. For auction-based packages (where only bid_price exists), price_breakdown is informational — see On Confirmed Packages.
Fee and discount adjustments compound in array order using these formulas:
Rate vs. Amount
Each adjustment must include exactly one ofrate or amount:
rate— decimal proportion, strictly between 0 and 1 exclusive (0 < rate < 1), e.g., 0.15 for 15%amount— positive number (> 0) in the pricing option’s currency
Budgets and Commission
Budgets are always denominated at thefixed_price level, inclusive of commissions. If a buyer commits €10,000 at an €11.90 CPM, that €10,000 is the buyer’s cost. The agency takes their commission from that amount; the publisher receives the remainder.
This means a buyer agent comparing rates across sellers can use fixed_price directly — it’s the actual cost per unit, regardless of the underlying commission structure.
On Confirmed Packages
Theprice_breakdown field also appears on the package response (confirmed line item). It is seller-populated — buyer agents should treat it as read-only.
Fixed-price packages echo the pricing option’s breakdown:
price_breakdown to disclose commission and settlement terms against the clearing price. For auction packages, list_price is set to the clearing price since there is no rate card derivation to disclose. The discount invariant does not apply — the breakdown is informational only:
Eligible Adjustments
Publishers can declare which adjustment kinds apply to a pricing option usingeligible_adjustments. This tells buyer agents upfront whether discounts, commissions, or settlement terms are available — before any negotiation begins.
eligible_adjustments is present, the buyer knows which kinds of adjustments to expect or request. When absent, no adjustments are pre-declared — the buyer should check price_breakdown if present for any adjustments that were already applied.
This field pairs with price_breakdown: eligible_adjustments signals what is possible, while price_breakdown shows what was applied.
Multi-Currency Support
Publishers can offer the same product in multiple currencies:Fixed vs. Auction Pricing
Fixed Pricing (fixed_price present)
- Publisher sets a fixed price
- Price is guaranteed and predictable
- Common for guaranteed inventory
- Include
fixed_pricefield
Auction Pricing (fixed_price absent)
- Final price determined through auction
- Publisher provides
floor_price(hard minimum) and optionalprice_guidance(percentile hints) - Bid-based auction models (
cpm,vcpm,cpc,cpcv,cpv) may also include optionalmax_bid: trueto explicitly signalbid_priceis treated as buyer maximum willingness to pay (ceiling mode) - Common for non-guaranteed inventory
- Buyer submits
bid_pricein media buy request
Buyer Selection Process
Each package specifies its own pricing option, which determines currency and pricing model:- Package selects
pricing_option_idfrom product (e.g., “cpcv_usd_auction”) - Pricing option determines currency, pricing model, and fixed vs auction
- Package
budgetis in the pricing option’s currency - Auction-based pricing requires
bid_price; it is the exact honored price unlessmax_bid: true, which switches it to a maximum-willingness-to-pay ceiling - Sellers validate currency compatibility across packages
Reporting Metrics by Pricing Model
Different pricing models report different primary metrics:| Pricing Model | Primary Metric | Secondary Metrics |
|---|---|---|
| CPM | impressions | clicks, ctr, spend |
| vCPM | viewable_impressions | impressions, viewability_rate, spend |
| CPCV | completed_views | impressions, completion_rate, spend |
| CPV | views | impressions, quartile_data, spend |
| CPP | grps | reach, frequency, spend |
| CPC | clicks | impressions, ctr, spend |
| CPA | conversions | conversion_value, cost_per_acquisition, roas, spend |
| Flat Rate | N/A | impressions, reach, frequency |
| Time | N/A | impressions, reach, frequency |
Example: Multi-Model CTV Product
A publisher offering Connected TV inventory with multiple pricing options:Best Practices
For Publishers
- Offer relevant pricing models - Match pricing to your inventory type and buyer expectations
- Set appropriate minimums - Use
min_spend_per_packageto ensure campaign viability - Provide price guidance - For auction pricing, give realistic floor and percentile data
- Consider multi-currency - Support currencies of your target markets
- Document parameters - Clearly explain thresholds, demographics, and action types
For Buyers
- Select appropriate model - Choose pricing that aligns with campaign objectives
- Match currency - Ensure you select a currency the publisher supports
- Set realistic budgets - Account for minimum spend requirements
- Align goals with pricing - Set delivery goals that match your pricing model
- Monitor relevant metrics - Focus on the metrics that matter for your pricing model
Related Documentation
- Media Products - Product model reference
- Creating Media Buys - How to select pricing when buying
- Delivery Reporting - Understanding metrics by pricing model
- Glossary - Pricing and metric definitions