Skip to content

[Change] § 5.9, § 5.6, § 2.1 — Add delivery_type: guaranteed, share_of_voice, non_guaranteed #93

Open

Description

@KonstantinMirin

What kind of change?

Add a new field

Which section?

5.9 — Execution

Current text

§ 5.9: | `transaction_mechanism` | Object | selectable | `available[]` from `DIRECT_IO` \| `PROGRAMMATIC_GUARANTEED` \| `PREFERRED_DEAL` \| `PRIVATE_AUCTION` \| `OPEN_AUCTION`. A seller MAY offer the same inventory through more than one |

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

Proposed text

§ 5.9, `transaction_mechanism` row: each `available[]` entry becomes an option
`{ id, delivery_type }`. `id` is the mechanism. `delivery_type` is REQUIRED:
`guaranteed` \| `share_of_voice` \| `non_guaranteed`. The value on the
mechanism in effect (the buyer's selection, or its `included[]` value when
unset, § 3.1) applies to the line item.

§ 5.9, after the `transaction_mechanism` row:

| `sov_basis` | Enum | seller-set | REQUIRED when an option's `delivery_type` is `share_of_voice`. `impressions`: a share of the line item's eligible impressions (digital placements, pooled DOOH products). `loop_time`: a share of each named screen's loop time (fixed-loop DOOH spots) |
| `sov_share` | Fraction | seller-set | REQUIRED when `sov_basis` is `impressions`; absent under `loop_time`. The promised share, greater than 0 |

After the table:

**Delivery type.** What the seller promises to deliver, independent of how
the line item transacts and how it is priced.

- `guaranteed`: the seller reserves the committed units for the flight, or,
  on a flat-fee entry, which has no units, the days of the flight.
- `share_of_voice`: the seller reserves a fixed share of the inventory, up to
  all of it, for the flight. With a `daypart` (§ 5.5), the share is of the
  daypart's hours only, read in the line item's `time_zone`. Sponsorships,
  roadblocks, takeovers, and DOOH loop and rotary buys.
- `non_guaranteed`: the seller reserves nothing.

An option's `delivery_type` MUST be one its mechanism allows:

| `transaction_mechanism` | `delivery_type` |
| :--- | :--- |
| `direct_io` | Any |
| `programmatic_guaranteed` | `guaranteed`, `share_of_voice` |
| `preferred_deal` | `non_guaranteed` |
| `private_auction` | `non_guaranteed` |

A domination, every screen and static face in a location, is `guaranteed`
with an included `exclusivity` term of `scope: sole` (§ 5.6), not
`share_of_voice` at 100%.

`sov_basis: loop_time` requires `properties.available[].allocation: all` on
every DOOH property.

Under `loop_time`, the share derives from the loop: `slots_per_loop` ×
`slot_s` ÷ `length_s` (#96). Under `impressions`, `sov_share` states it. Its
denominator is impressions; a share counted in plays is a different product
and doesn't use this basis. On DOOH, its eligible screens are the line item's
screen set, the pool the seller allocates from under
`properties.available[].allocation: seller_allocated`. Its scope is the line
item's flight and `daypart`.

§ 5.6, `availability` row, append:

`certainty` MUST be `forecast` when the line item's `delivery_type` is `non_guaranteed`.

Names and types follow the coming PRs, listed in the rationale. The settlement PR carries this text.

Why

For direct_io, a line item never says whether the seller promises delivery. For programmatic_guaranteed, it never says whether the promise is units or a share. We ask for one seller-set value that says it, per mechanism.

transaction_mechanism (§ 5.9) implies whether delivery is promised, except for direct_io. An IO can reserve an impression goal, take over a home page, or run best effort. Downstream, OpenRTB 2.6 deal.guar and Deals API 1.0 terms.guar flag a guaranteed programmatic deal. OpenDirect 2.1, the § 1.1 direct-buy target, puts OpenDirect 2.1 Product.deliverytype on the Product each Line books; an OpenProposal line item has no equivalent. Google Ad Manager line item types are guaranteed as Sponsorship (a percentage of impressions) or Standard (an impression goal); Network, Bulk, and Price priority are non-guaranteed. availability.certainty describes a recomputed number, not a promise.

Terms depend on the type, not only on the cost method. The IAB/4A's Standard Terms and Conditions, Version 3.0 set cancellation notice by it. Under § V(a), notice is 14 days guaranteed, 7 non-guaranteed, including "some non-guaranteed CPM Deliverables", and 30 flat-fee or fixed-placement, including share-of-voice. A makegood applies when Deliverables "fall below guaranteed levels" (§ VI(b)). Under non_guaranteed no units are promised, so, as our settlement change request states in § 5.7, delivery below the commitment owes no makegood.

A share of voice has one of two bases, as @premesh (OUTFRONT Media) points out on share of voice for DOOH (#79). A fixed loop spot is a share of loop time on named screens. A rotary product is a share of impressions across a pool of screens. They deliver and price differently, so sov_basis says which one a line item sells. It stays one delivery type, because T&Cs § V(a)(iii) treat share of voice as one class for notice. Only a fixed loop derives its share, as @premesh notes on #134, so the seller states a pooled share. Its denominator, pool, and scope follow @premesh's answer to @jaanijuk's question. @premesh's later input on #79 adds two cases. A share of part of the day follows the line item's own § 5.5 daypart, and open question 6 asks whether it should. A domination's static faces have no loop or impressions to share, so, as @premesh suggests, it is guaranteed plus § 5.6 exclusivity.

§ 6.2 offers one line item as programmatic_guaranteed or preferred_deal, so the type follows the mechanism in effect.

Knock-on effects

  • cancellation_policy and shortfall_remedy stay the line item's actual terms; the type tells a buyer which T&Cs default they depart from. A seller needing different terms per type publishes separate line items.
  • § 6.2 gives each mechanism option its delivery_type. § 6.3 holds a non_guaranteed line item; the holds PR offers it no hold, and open question 4 asks whether a rule should require that.
  • delivery_type, sov_basis, and sov_share are offered terms, so they fall inside record_digest (#63, #64). Appendix A/B gain two seller-set fields. Related: #54 (guaranteed audience delivery) and #79 (share of voice for DOOH).
  • allocation is in our DOOH properties change request (#96). Daypart windows and the line item's one time_zone are in our reply on typed targeting values (#58). § 5.6 exclusivity terms are typed in our cancellation and exclusivity change request (#98).

Open questions for the working group

  1. Should delivery_type keep share_of_voice as a third value, or use the exclusive value of OpenDirect 2.1 Product.deliverytype (a 100% share only) instead? Or should it carry two values, as OpenRTB 2.6 deal.guar does?
  2. Should delivery_type be REQUIRED for every mechanism, as we propose, or only for direct_io and programmatic_guaranteed, where the mechanism alone doesn't say what is promised?
  3. Answered in part by @premesh on #134: Under share_of_voice, should delivery below commitment.amount be a shortfall, or only a missed share? Our settlement change request counts it only under guaranteed and defines no share metric. Delivered share belongs in the settlement record, against the same denominator and pool as the promised share, as the delivery type and settlement PR states. Still open, and among the rules we left out of the text: whether a delivered share below sov_share is a shortfall.
  4. Answered in part in our lifecycle change request (#65) and by @EvgenyAndroid, with @premesh, on [Change] § 5.6.2 — hold_status needs refused and re-entry to requested #66: What should a hold on a non_guaranteed line item, such as the § 6.3 CTV line item example, firm (hold states (#66), commitment acceptance (#67))? The offered terms only, or nothing, so that holds apply only under guaranteed and share_of_voice? Open question 4 on [Change] § 5.6.2 — hold_status needs refused and re-entry to requested #66 records the answer: a hold firms its version's offered terms, and held always means reserved inventory. A seller that reserves nothing offers no hold (hold_terms.available: false, or no hold_terms) and states the expiry in pricing[].price_valid_until. Still open, among the rules we left out: whether non_guaranteed rules out a hold, in what form, or leaves it to seller policy. The holds PR shows the § 6.3 example with hold_terms.available: false.
  5. Should guaranteed also cover a promised audience quantity, as guaranteed audience delivery (#54) asks for OOH and DOOH? Or is a committed impressions value enough, even on a non_guaranteed line item? Our DOOH plays and impressions change request and our settlement change request provide one.
  6. Should a share of voice follow the line item's own daypart, as proposed, or carry a separate seller-set scope, as @premesh suggests on #79? With a separate scope, a buyer who narrows the daypart under our reply on typed targeting values (#58) can't narrow the share.
  7. Answered by @premesh. A domination sells static and digital faces together, one line item per channel, as @premesh answered on #102. A sole term in our cancellation and exclusivity change request (#98) separates only within one line item. Does each line item carry its own sole term, or does one exclusivity term name the location across them? One term, they suggest, at the proposal or package level, with line items referencing it, so the terms can't drift apart. Open question 6 on #98 asks whether the spec adds it, and static OOH continues in its own thread (#125). Our reply on #146 keeps each line item independent and asks for the business case.

Would this break an implementation already built to this draft?

Yes — breaking

Alternatives you considered and rejected

A single scalar (breaks § 6.2), three direct_io values (mixes how with what), inferring from availability.certainty (recomputed), ad-server priorities (seller-internal), two share-of-voice types (one class under the T&Cs): Delivery type and hold terms: full rationale and examples.

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-05: Question 7 points to our reply on #146. delivery_type sits on each mechanism option, and guaranteed covers a flat-fee entry.

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

Activity

  1. KonstantinMirin commented on Oct 23, 2026

    @KonstantinMirin
    Author

    Revision, from seller input on #79. @premesh (OUTFRONT Media) points out that a share of voice is measured over one of two bases. A fixed loop spot is a share of loop time on named screens. A rotary product is a share of impressions across a pool of screens. Labeled with one share_of_voice, the two compare at the same CPM and share, although they deliver and price differently.

    We revise the share_of_voice bullet to:

    - `share_of_voice`: the seller reserves a fixed share of the inventory, up to
      all of it, for the flight. Sponsorships, roadblocks, takeovers, and DOOH
      loop and rotary buys.
    
    | `sov_basis` | Enum | seller-set | REQUIRED when the applicable `delivery_type` is `share_of_voice`. `impressions`: a share of the line item's eligible impressions (digital placements, pooled DOOH products). `loop_time`: a share of each named screen's loop time (fixed-loop DOOH spots) |
    
    `sov_basis: loop_time` requires `allocation: all` on every DOOH property.

    We keep one delivery type rather than two. The IAB/4A's Standard Terms and Conditions 3.0, § V(a)(iii), treat share of voice as one class for notice. The basis changes what is counted, not the promise. allocation is in our DOOH properties change request (#96), which takes the matching revision.

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

  2. KonstantinMirin commented on Oct 25, 2026

    @KonstantinMirin
    Author

    Second revision, from seller input on #79. @premesh (OUTFRONT Media) names two cases that our sov_basis revision doesn't fully cover, and how they'd model each.

    1. A share of part of the day. A seller can sell a share of voice for a daypart only, such as one advertiser owning a screen through morning drive. A share of 100% from 06:00 to 10:00 isn't 100% of the day. Roadblocks sold as a share of a daypart are the same case.
    2. Dominations. A station or venue domination sells every unit in the location, static and digital. As @premesh notes, static faces have no loop and no impressions to share, so it isn't a share of voice. Their model is guaranteed units plus exclusivity.

    We take both. For the scope, we use the line item's own § 5.5 daypart rather than a separate field, so the hours a line item runs and the hours its share covers can't differ. We revise the share_of_voice bullet again and add one line after the bullets:

    - `share_of_voice`: the seller reserves a fixed share of the inventory, up to
      all of it, for the flight. With a `daypart` (§ 5.5), the share is of the
      daypart's hours only, read in the line item's `time_zone`. Sponsorships,
      roadblocks, takeovers, and DOOH loop and rotary buys.
    
    A domination, every unit in a location, static faces included, is
    `guaranteed` units with an included `exclusivity` term of `scope: sole`
    (§ 5.6), not `share_of_voice` at 100%.

    Daypart windows and the line item's one time_zone are in our reply on typed targeting values (#58). § 5.6 exclusivity terms are typed in our cancellation and exclusivity change request (#98).

    Open questions:

    1. Should a share of voice follow the line item's own daypart, as proposed, or carry a separate seller-set scope, as @premesh suggests on #79, so that a buyer who narrows the daypart under our reply on typed targeting values (#58) can't narrow the share?
    2. Answered by @premesh. A domination sells static and digital faces together, one line item per channel, as @premesh answered on #102. A sole term in our cancellation and exclusivity change request (#98) separates only within one line item. Does each line item carry its own sole term, or does one exclusivity term name the location across them? One term, they suggest, at the proposal or package level, with line items referencing it, so the terms can't drift apart. Open question 6 on #98 asks whether the spec adds it, and static OOH continues in its own thread (#125).

    Revised 2026-10-27: @premesh answered open question 2, which is open question 7 in the issue body. They suggest one exclusivity term per location, at the proposal or package level. Open question 6 on #98 asks whether the spec adds it.

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

  3. premesh commented on Oct 27, 2026

    @premesh

    On OQ7: from the seller side, one exclusivity term should name the location and apply to every line item it covers, static and digital. A station or venue domination is often sold as several line items: digital screens, static panels, sometimes floor or wall graphics. If each line carries its own exclusivity term, they can drift apart in negotiation, and the buyer thinks they own the location when they own half of it.

    Suggest exclusivity lives at the proposal or package level, scoped by location, with line items referencing it. This connects to #98: separation needs a location value (no competitor anywhere in the venue) and a loop value (no competitor in the same digital loop) for dominations to be expressible.

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