Skip to content

[Change] § 5.6, § 5.7 — DOOH: define a play, and whose multiplier turns plays into impressions #92

Open

Description

@KonstantinMirin

What kind of change?

Add a new field

Which section?

Whole document / more than one section

Current text

§ 5.6 and § 5.7:

§ 5.6: | `pricing[].cost_method` | Enum | seller-set | CPM, CPC, flat, etc. |

§ 5.6: | `availability` | Object | derived | `{ unit, basis, as_of, granularity, type: forecast \| reservable, quantity }`. Recomputed against the buyer's selection |

§ 5.7: | `committed_metrics[]` | Array[Object] | requestable | `{ metric, value, basis }` tuples — `viewable_rate` for display, `completion_rate` for video/audio/CTV, an audience-modelled metric for DOOH. Seller declares a ceiling; a buyer MAY request above it |

Proposed text

Our DOOH PR carries this text and closes this issue and #96. Our settlement PR adds the § 5.7.1 impressions metric and the rate-or-count rule.

§ 5.6, after the `availability` row:

| `delivery_counting` | DeliveryCounting | REQUIRED when `channel` is `dooh` | seller-set | How the line item counts plays and, when it counts impressions, turns them into impressions. See § 5.6.4 |

#### 5.6.4 Plays and impressions

On a `dooh` line item, a **play** is one display of an ad on one screen, inside
the screen's operating hours, that ends no more than `play_tolerance_ms` short of
the ad's full duration and that the proof-of-play log records. On a sync group
(§ 5.2.8), a display that meets those conditions on at least
`min_screens_per_play` of its screens is one play, not one per screen. An
**impression** is a play times the multiplier for that screen or sync group at
that time. Every impression count on the line item (`pricing[]`, `commitment`,
`availability`, `committed_metrics[]`) counts these. A line item counts
impressions when any of those counts is in impressions.

**`DeliveryCounting`** keys:

| Key | Type | Required | Meaning |
| :--- | :--- | :--- | :--- |
| `play_tolerance_ms` | Integer | REQUIRED | How far short of its full duration a play may end and still count |
| `proof_of_performance` | ProofOfPerformance | REQUIRED | Who logs the plays and what the buyer receives |
| `partial_play_credit` | VocabularyTerm | REQUIRED when a property has `sync_groups[]` | What a display on fewer than `min_screens_per_play` screens counts. Core terms: `none` (no play) \| `pro_rata` (screens played ÷ `min_screens_per_play`) |
| `impression_multiplier` | ImpressionMultiplier | REQUIRED when the line item counts impressions | What turns a play into impressions |

**`ProofOfPerformance`** keys:

| Key | Type | Required | Meaning |
| :--- | :--- | :--- | :--- |
| `logged_by` | Measurer | REQUIRED | Who keeps the proof-of-play log |
| `evidence[]` | Array[VocabularyTerm] | REQUIRED | What the buyer receives. Core terms: `play_log` \| `photo` \| `audit_report` |

**`ImpressionMultiplier`** keys:

| Key | Type | Required | Meaning |
| :--- | :--- | :--- | :--- |
| `impression_type` | Enum | REQUIRED | `gross` \| `viewable` \| `lts` \| `audience`: Gross, Viewable (OTS), Likelihood-to-See, or Audience impressions, as the MRC Out-of-Home Measurement Standards (Phase 1 & 2 Combined, December 2025) define them |
| `source_type` | Integer | REQUIRED | Who supplies the multiplier. A value from AdCOM 1.0 List: DOOH Multiplier Measurement Source Types other than Unknown (`0`). The value OpenRTB 2.6 `imp.qty.sourcetype` carries |
| `vendor` | RegistrableDomain | REQUIRED when `source_type` is not Publisher Provided (`2`) | The domain of the vendor or exchange that supplies the multipliers, as OpenRTB 2.6 `imp.qty.vendor` names a vendor |
| `dataset` | String | REQUIRED | The source's named data release. A new release is a new `dataset` |
| `settles_on` | Enum | REQUIRED | `declared` \| `restated`. `declared`: the value `dataset` gives that screen, or sync group, and hour when the play runs. `restated`: that value after any reissue of `dataset` by its source before the count is final (§ 5.7.1) |

The multiplier's source controls the count of impressions: `seller` when
`source_type` is Publisher Provided (`2`) or `vendor` is the proposal's
`seller.domain`, and `vendor` otherwise. Every impression count that settles or
invoices the line item MUST use its multipliers, and a committed `impressions`
level (§ 5.7.1) settles on that source's count.

Impressions MUST be summed unrounded over each invoice period and rounded once.

Why

A DOOH CPM doesn't say what it counts. Sellers multiply plays by an audience figure the line item doesn't name. #82, CPM based on opportunities to see, asks for this denominator.

Loop and operating hours set each screen's plays (#79, #96). Take 200 screens, one 10-second slot in a 60-second loop, 18 hours a day for 14 days: 3,024,000 plays. At CPM 8.00:

Read as Units Invoice (USD)
Per 1,000 plays 3,024,000 24,192.00
Impressions, publisher multiplier 4.2 12,700,800 101,606.40
Impressions, vendor multiplier 2.9 8,769,600 70,156.80

One record supports all three. It must name the multiplier's source, and that source counts what's invoiced.

OpenRTB 2.6 imp.qty carries a multiplier per bid request. The MRC Out-of-Home Measurement Standards define four impression levels and expect reissues.

A CPM's unit is a commercial term, so the proposed 4.0 deferral of measurement (#20) doesn't remove it from 3.0.

@premesh proposes sync groups, partial_play_credit, and one proof_of_performance object. The rate-or-count rule comes from @jaanijuk on #4.

Details and examples: Plays and impressions in DOOH: full rationale and examples

Knock-on effects

Open questions for the working group

  1. Should delivery_counting.impression_multiplier stay seller-set in 3.0, or become selectable under § 3.1 Selectable structure? A buyer could then pick the publisher's or a vendor's multiplier, with a price and pricing[].unit_bounds per option.
  2. Answered in our DOOH PR. Should settles_on: restated carry its own deadline for reissues, or is the final_after deadline in our settlement filing enough? A reissue counts only before the count is final, so final_after, when set, is the deadline.
  3. On a line item that counts only plays, should proof_of_performance.logged_by be the controlling counter of plays? Or may the buyer name a different counted_by in the controlling_measurement of our settlement filing?
  4. How should a buy at the Opportunity to See level of the MRC Out-of-Home Measurement Standards be priced? As CPM with impression_type: viewable, or as CPMV from our cost-method filing? And should viewable get a name that doesn't suggest digital viewability?
  5. Should proof_of_performance.evidence[] stay in 3.0 as a commercial term, or move to 4.0 with measurement if the proposed 4.0 deferral of measurement (#20) is accepted?
  6. Answered by @premesh. Under partial_play_credit: pro_rata, what share of a play does a sync group display on too few screens earn: screens_played ÷ min_screens_per_play, or ÷ the group's screens? @premesh's suggestion left it open. It's ÷ min_screens_per_play.

Would this break an implementation already built to this draft?

Yes — breaking

Alternatives you considered and rejected

  • Leave it to the bid stream. imp.qty names each request's source, not the agreed one, and a direct IO has none.
  • selectable, so a buyer picks its measurement provider. pricing[].unit_bounds sits on the pricing entry, so a provider option can't carry its own.
  • Inside measurement_source. Nothing ties pricing[], commitment, or availability to it, and it can't hold the play definition.

You are commenting as

Other — IAB Tech Lab member (Postindustria).

Before you submit

  • I have read CONTRIBUTING.md and agree my contribution may be published under this repository's licence.
  • This contains no confidential or commercially sensitive information.

Revised 2026-11-03: Rewritten to match our DOOH PR, which nests impression_multiplier under delivery_counting and renames sourcetype to source_type. Answers open question 2 and moves two rules to the rules issue.

Analyzed and generated with the help of Claude, fully reviewed by me.

Activity

  1. premesh commented on Oct 26, 2026

    @premesh

    Commenting as: seller. OUTFRONT Media, US out-of-home media owner (roadside static and digital, transit).

    A gap in the play definition: synchronized screens. We sell venues where several screens show the same ad at the same moment, and the buyer buys the venue, programmatic and direct. One play is one play against the venue, delivered on at least a contracted number of its screens. Under "one display of an ad on one screen", a ten-screen venue play counts as ten plays, and per-screen multipliers summed across those screens count the same audience ten times.

    This isn't specific to us. Synchronized screens sold as one play are common across out-of-home. Airports are the clearest case, where every screen in a baggage claim or gate area runs the same creative at the same moment, and the same goes for transit stations and platforms, malls and stadiums. So this belongs in the core DOOH property model, not in a seller-specific extension.

    Proposal:

    Open question: should a sync group play that confirms on fewer than min_screens_per_play count as no play, or as a partial play?

  2. premesh commented on Oct 27, 2026

    @premesh

    Answering my own open question above. A play that reaches fewer screens than min_screens_per_play shouldn't silently count as a full play, and it shouldn't disappear either.

    Suggest:

    • Every screen-level play is still logged as usual.
    • The venue play record carries screens_played alongside min_screens_per_play, so a shortfall is visible.
    • How a shortfall settles is a seller-set term on the line: partial_play_credit: none | pro_rata. Synced takeovers are usually sold as all-or-nothing. Some sellers will want pro-rata.

    @KonstantinMirin would it make sense to fold sync_group into #92's play definition and #96's screens model, rather than keep it as a separate object?

  3. KonstantinMirin commented on Oct 27, 2026

    @KonstantinMirin
    Author

    Yes, thank you, @premesh. We fold sync_group into this filing's play definition and #96's screens model, credited to you. We revise both in place, and the PLAY row of #94 to match.

    In our DOOH properties filing (#96), a property gains sync_groups, each with its screens and a min_screens_per_play. In this filing's play definition, a display on at least that many screens is one play, with one multiplier for the venue. frequency_cap with basis: screen counts the group as one screen. partial_play_credit is a seller-set term, with none and pro_rata as core terms of an open vocabulary.

    Our supporting material logs one record per play with screens_played, from your second comment, and keeps min_screens_per_play on the sync group. One point stays open, as open question 6. Under pro_rata, is a display on too few screens worth screens_played ÷ min_screens_per_play, or ÷ the group's screens?

    Analyzed and generated with the help of Claude, fully reviewed by me.

  4. premesh commented on Oct 28, 2026

    @premesh

    @KonstantinMirin thanks for folding it in. On OQ6: divide by min_screens_per_play. Any play at or above the minimum is a full play, so pro_rata only applies below it. Dividing by the group's screens would make credit jump at the threshold: a play one screen short of the minimum would be worth well under the full play it nearly was. screens_played ÷ min_screens_per_play rises to 1 at the minimum, and the buyer is paying for the minimum, not the whole group.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions