Skip to content

[Change] § 5.7: Bind each committed metric to the measurement source that settles it #38

Open

Description

@unreconciled

What kind of change?

Change a field's type or shape

Which section?

5.7 — Guarantees

Current text

§ 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 |
| `measurement_source` | Object | selectable | `available[]` of `{ vendor, attribution_window, qualifier }` with `pricing`. Lets a buyer transact in its own currency |

examples/line-item-display.yaml (§ 6.2):
committed_metrics:
  - { metric: viewable_rate, value: 0.70, basis: mrc }
measurement_source:
  available:    [{ vendor: "IAS", attribution_window: "30d" },
                 { vendor: "DoubleVerify", attribution_window: "30d" }]
  included:     ["IAS"]

examples/line-item-ctv.yaml (§ 6.3), serving_mode: ssai, no measurement_source:
committed_metrics: [{ metric: completion_rate, value: 0.95, basis: seller_reported }]

examples/line-item-audio.yaml (§ 6.4), serving_mode: dai, no measurement_source:
committed_metrics: [{ metric: completion_rate, value: 0.92, basis: seller_reported }]

Proposed text

Replace the two § 5.7 rows:

| `committed_metrics[]` | Array[Object] | requestable | `{ metric, value, basis, measurement_source_ref }` tuples. `viewable_rate` for display, `completion_rate` for video, audio and CTV, an audience-modeled metric for DOOH. `measurement_source_ref` MUST equal an `id` in `measurement_source.available[]`. A seller MAY declare more than one tuple for the same `metric`, one per `measurement_source` option, each with its own ceiling. The tuple whose `measurement_source_ref` matches the resolved `measurement_source` selection governs. If no tuple for a `metric` matches the resolved selection, the line item carries no commitment on that `metric`, and an agent MUST show it as uncommitted. The seller declares a ceiling; a buyer MAY request above it. `basis` keeps its current meaning; where it and `counts[]` differ, `counts[]` governs |
| `measurement_source` | Object | selectable | `available[]` of `{ id, vendor, attribution_window, qualifier, counts[] }` with `pricing`. Lets a buyer transact in its own currency. REQUIRED when `committed_metrics[]` is non-empty. MUST declare `max_select: 1`, and `included[]` MUST name exactly one option. In each option, `id`, `vendor` and `counts[]` are REQUIRED; `attribution_window` and `qualifier` are OPTIONAL. A seller that settles on its own data declares itself as an option with `vendor: seller`. `counts[]` is defined in § 5.7.1 |

Add § 5.7.1 What a measurement source counts

Each `measurement_source.available[]` option carries `counts[]`, one entry per metric it can settle:

| Key | Required | Values |
| :--- | :--- | :--- |
| `metric` | REQUIRED | As in `committed_metrics[]` |
| `numerator` | REQUIRED when `metric` ends in `_rate` | `impression` \| `start` \| `first_quartile` \| `midpoint` \| `third_quartile` \| `complete` \| `viewable_impression` |
| `denominator` | REQUIRED when `metric` ends in `_rate` | Same values as `numerator` |
| `tracking` | REQUIRED | `client` \| `stitched_client_tracked` \| `server` \| `unknown`. Same meanings as OpenRTB 2.6 `imp.ssai` values 1, 2, 3 and 0 |
| `ivt_filtration` | REQUIRED | `none` \| `givt` \| `givt_sivt` \| `unknown` |
| `accreditation` | REQUIRED | `{ status: accredited \| in_audit \| not_accredited \| unknown, body, scope }`. `body` and `scope` are OPTIONAL |
| `viewability_threshold` | REQUIRED when `numerator` is `viewable_impression` | `{ pixels, seconds, audio_required }`. `pixels` is a percentage, 0 to 100 |
| `audience_unit` | REQUIRED when `metric` is not a rate | `{ unit: device \| household \| person \| listener, modeled: true \| false }`. Same vocabulary as `frequency_cap.basis` (§ 5.5) plus `person` |
| `methodology_ref` | REQUIRED | A `catalog_ref` (§ 2.2), or a version-pinned URI whose content MUST NOT change once referenced. It MUST be readable by the counterparty before `agreed`. A public document is RECOMMENDED but not required |

`unknown` is a valid declaration. An agent MUST treat it as unknown and MUST NOT substitute a default.

A buying agent MUST NOT present two committed metrics as equivalent unless their `metric`, `numerator`, `denominator`, `tracking` and `ivt_filtration` match, and their `viewability_threshold` matches where present, and none of those values is `unknown`. Different `methodology_ref` values do not by themselves make two metrics non-comparable, but the agent MUST keep both visible. An agent MAY score unlike guarantees against a buyer's own objectives.

§ 2.1, add to the per-line-item Summary Representation:

`measurement_source.available[].{ id, vendor, counts[].tracking }`

`committed_metrics[]` is already in the summary and now carries `measurement_source_ref`.

§ 6.3, replace the committed_metrics line in examples/line-item-ctv.yaml with:

committed_metrics:
  - { metric: completion_rate, value: 0.95, basis: seller_reported, measurement_source_ref: seller }
  - { metric: completion_rate, value: 0.90, basis: mrc, measurement_source_ref: vendor-a }
measurement_source:
  available:
    - id: seller
      vendor: seller
      counts:
        - { metric: completion_rate, numerator: complete, denominator: impression,
            tracking: server, ivt_filtration: givt,
            accreditation: { status: not_accredited },
            methodology_ref: "examplepub/methodologies/ssai-completion@1" }
    - id: vendor-a
      vendor: "Vendor A"
      attribution_window: "30d"
      counts:
        - { metric: completion_rate, numerator: complete, denominator: impression,
            tracking: stitched_client_tracked, ivt_filtration: givt_sivt,
            accreditation: { status: accredited, body: mrc, scope: "CTV video completion" },
            methodology_ref: "https://vendor-a.example/methodology/ctv-video" }
  included: ["seller"]
  max_select: 1

Why

The basis key in the examples is doing two different jobs today. In the CTV example (§ 6.3) basis: seller_reported tells you who reports the number, and in the display example (§ 6.2) basis: mrc tells you which standards body is involved. Neither one tells a buying agent what is actually being counted, and that is the part it needs in order to compare two guarantees or settle one.

The draft's own examples show the problem:

  1. § 6.2 lets the buyer pick IAS or DoubleVerify, but there is a single viewable_rate of 0.70, and it is not clear whose 0.70 the seller is signing up for. Since measurement_source is selectable and resolves without seller assent (§ 3), the buyer's choice of vendor can quietly change what that requestable value means.
  2. § 6.3 and § 6.4 both commit to a completion rate with no measurement_source at all, so a buyer has nothing to select its own vendor against.
  3. § 6.3 is serving_mode: ssai, which is where this shows up most in practice; anyone who has reconciled an SSAI campaign against a third-party vendor report has likely run into it. With SSAI the tracking can come from the player (OpenRTB 2.6 imp.ssai 2) or from the stitcher (imp.ssai 3), and the MRC's SSAI and OTT Guidance (2021) treats those differently: counting has to be client-initiated, the ad has to begin to render, and anything short of that is reported separately and disclaimed as non-compliant. So two lines can both read completion_rate 0.95, seller_reported, and still be counting under different rules. Both approaches are in use and both can be legitimate, but a buying agent should be able to see which one it is buying.

To be clear about scope, this is not an attempt to reopen the proposed 4.0 deferral of measurement and verification in #20 and #25. There is no new methodology and no normalization here, and settlement windows, restatement and reconciliation stay with 4.0. The ask is narrower: record, in closed values a seller can fill in today, which source settles each committed value and what that source counts. Cross-channel normalization stays with the workstream § 8 points to (likely WS4; OQ-3, #4), and this would give that work defined inputs to start from.

I tried to keep the enumerations to values sellers already emit, namely OpenRTB 2.6 imp.ssai and the VAST tracking events, plus the MRC's terms for invalid traffic filtration and accreditation, so nobody has to invent a new vocabulary to fill them in.

Commenting in a personal capacity. Product leader in CTV, identity and data; I have led teams that built DSP bidding, household identity graphs, and CTV ad insertion and monetization platforms. I maintain OpenCTV, an open-source, non-commercial project on CTV ad delivery diagnostics.

Knock-on effects

Would this break an implementation already built to this draft?

Yes — breaking

Alternatives you considered and rejected

  • Renaming basis and turning it into a methodology object. That breaks every parser built against the examples, and it pulls methodology into the object model, which [Comment] Whole document — Feedback from the Agentic Bootcamp, 24 September 2026 #20 proposes leaving to 4.0.
  • Declaring the counting rules on each committed_metrics tuple instead of on the source. The same vendor's definition would then be repeated on every line item, and the link to the buyer's choice of currency gets lost.
  • A free-text basis. Easy to write, but an agent has no way to compare two of them.
  • Mandating one completion_rate definition in 3.0. Client-tracked and server-tracked SSAI measurement are both in use today, so a single definition would either shut some sellers out or paper over the difference. Asking sellers to declare which one they use avoids both problems.
  • Deferring all of it to 4.0. The § 6.2 example already offers two vendors against one value, so the ambiguity is in 3.0 whether or not the methodology work is.

You are commenting as

Individual, no organisational position

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.

Activity

  1. aleksUIX commented on Oct 21, 2026

    @aleksUIX

    In the proposed § 5.7.1, could the minimum equivalence check also compare audience_unit for non-rate metrics?

    The object requires { unit, modeled }, but the comparison paragraph does not include either. As a constructed example, two commitments with the same non-rate metric name and the same listed comparison fields could each say 1,000,000 while one counts households and the other counts persons. The declared unit exposes the mismatch, but the stated guard does not check it.

    Suggested addition:

    For non-rate metrics, a buying agent MUST NOT present two committed metrics as equivalent when their audience_unit.unit or audience_unit.modeled values differ. Matching these values is a necessary condition, not a complete test of methodological equivalence.

    It would also help to state that the numerator and denominator comparisons apply to rate metrics. A missing required audience_unit should fail validation rather than be treated as a matching empty value.

    This carries the unit distinction already raised in #39 into the comparison rule here. No conversion between households and persons is implied.

    Commenting in a personal capacity.

  2. unreconciled commented on Oct 22, 2026

    @unreconciled
    Author

    Agreed, the comparison rule should check the unit for non-rate metrics; as written it would treat a household count and a person count as equivalent. Folding in the suggested sentence, the § 5.7.1 equivalence paragraph would read:

    A buying agent MUST NOT present two committed metrics as equivalent unless their metric, tracking and ivt_filtration match; for rate metrics, their numerator, denominator and, where present, viewability_threshold also match; and for non-rate metrics, their audience_unit.unit and audience_unit.modeled also match. None of those values may be unknown, and a required key that is missing fails validation rather than matching. Matching these values is a necessary condition, not a complete test of methodological equivalence. Different methodology_ref values do not by themselves make two metrics non-comparable, but the agent MUST keep both visible. An agent MAY score unlike guarantees against a buyer's own objectives.

    Three filings from this week describe the same declarations from the audit and out-of-home side and could be considered together with this one: #51 (methodology, provider and measurement period for audience figures), #54 (forecast versus guaranteed audience) and #56 (third-party verification reference).

    On the breaking label, for adjudication: the only implementations affected are seller-side ones that emit committed_metrics[] without measurement_source, and each of those adds one vendor: seller option. basis is not renamed and keeps its meaning, so nothing that reads the current fields breaks.

  3. KonstantinMirin commented on Oct 22, 2026

    @KonstantinMirin

    Postindustria (IAB Tech Lab member) supports this, with the revised equivalence paragraph. Three points from our PRs bear on it.

    1. The tuple's names change. Our settlement PR, which closes [Change] § 5.7 — Make a guarantee settleable: direction, controlling measurement, remedy order #95, removes basis and renames value to level. A committed metric is a metric term, a level, and a direction. Each core metric term's definition names its standard. A measurement_source option names its provider in measured_by, in place of vendor. measured_by: seller covers what basis: seller_reported said. Which source settles a level stays this issue's rule.
    2. Name the audience once. Our pricing PR names a rated audience with a vocabulary term in cost_parameters.demographic, such as ratings.example:adults_25_54, beside its rating_source. A guarantee of 150 rating points among adults 25–54 is a CPP entry on a guaranteed line item, counted by that rating_source. The term's definition can state whom it counts, including whether co-viewers count: Nielsen counts co-viewers on CTV by default. This replaces the target object and the in_target_impressions and grp metrics we proposed.
    3. Count podcast ads as delivered. The IAB Tech Lab Podcast Technical Measurement Guidelines v2.3 count from server logs. The core impressions term counts DOOH only, so a podcast count is its own metric term, citing the guidelines' Ad Delivered count (§ 6.3). It never matches an impression. Until a core term exists, a seller defines one under its own domain. This replaces the download and ad_delivered values, the numerator SHOULD on counts, and our modeled reading.

    Points 2 and 3 add no key to counts[].

    Open questions:

    1. Answered in part by our pricing PR: Should co_viewing sit on the tuple's target or on the source's counts[] entry, as a boolean or an enum? No co_viewing key remains. Still open: must a demographic term's definition state co-viewing, or does the rating_source's methodology decide it?
    2. Answered in part by our settlement PR: Should this change add an in-target share (in_target_rate) with a new in_target_impression numerator? A share would be a metric term, with no numerator value. Still open: should it be added, or should shares stay out of this version?
    3. Answered in part by our pricing PR: Should age take an include_unknown flag? No age key remains. Still open: should a demographic term say whether impressions with unknown age count, or should the source's methodology decide that?
    4. Should a podcast CPM count delivered ads, keep counting impression as our pricing change request defines CPM, or get its own cost method?
    5. Does certification under the podcast guidelines' compliance program (§ 1.1) count as accreditation.status: accredited, or does it need its own status value?

    Details: Demographic and podcast counts: full rationale

    Revised 2026-11-03: A demographic term and a podcast metric term replace the target object, the two new metrics, and the new numerator values. Point 1 gives the names our settlement PR changes, and questions 1 to 3 are answered in part.

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

  4. aleksUIX commented on Oct 25, 2026

    @aleksUIX

    The revised equivalence paragraph in your reply already incorporates the audience-unit distinction I raised. I would build on that text with acceptance examples and one clarification about what passing its checks establishes.

    Proposed addition after that paragraph in § 5.7.1:

    Passing the comparison checks is a necessary condition for a claim of equivalence, not sufficient evidence of methodological equivalence. Missing required information is a validation failure. A declared unknown value MUST NOT be treated as an equal known value, including when both declarations use unknown.

    An agent claiming that two guarantees are equivalent MUST establish that their applicable measurement definitions and scopes are compatible, including the event or audience population and any relevant observation or attribution window. It MUST NOT infer that compatibility solely from equal metric names, equal values, the same vendor, or the same methodology reference. An unresolved relevant condition MUST remain explicit; it MUST NOT be silently defaulted.

    Different methodology references do not by themselves establish incompatibility. The references and measurement sources MUST remain distinguishable when the guarantees are presented. Scoring unlike guarantees against a buyer objective does not make their measurement definitions equivalent.

    This adds no window, population or methodology-version field to counts[]. The existing proposal's version-pinned methodology reference can define those conditions, alongside the resolved line-item context. If an implementation cannot establish them from the available declarations, it cannot assert equivalence. Structured population definitions and channel-specific counts can be considered with the existing comments here and #51, rather than introduced a second time.

    Constructed acceptance cases:

    1. Two 80% completion guarantees, one with denominator: start and the other with denominator: impression: incompatible definitions, despite the equal percentages.
    2. Matching rate declarations, but one is missing its required denominator: invalid declaration, not a match against an empty value.
    3. Both declarations have ivt_filtration: unknown: insufficient information, not equivalent filtration.
    4. One count has ivt_filtration: givt, the other givt_sivt: the existing comparison guard must reject equivalence. Apply filtration per counted metric; an impression's filtration does not establish a click's filtration.
    5. Two one-million audience commitments, one households and one persons: incompatible units. Two person counts with different modeled flags likewise fail the revised guard.
    6. Matching declared comparison fields but different methodology references: the minimum field checks pass; equivalence remains unestablished until the relevant definitions and scope are evaluated. Keep both references visible.
    7. The same vendor and methodology reference, but a known difference in the population or applicable attribution window: that shared identity does not erase the difference.

    The useful distinction for an implementer is between an invalid declaration, a known mismatch, an unresolved comparison, and passing the minimum checks. These are labels for the examples, not a proposed wire enum or a new ranking model. Passing the minimum checks must not be converted into an automatic equivalent=true result.

    An unresolved comparison does not make an otherwise valid offer invalid or prevent a buyer from selecting it. It limits the claim that the offer's guarantee is equivalent to another guarantee.

    These rules concern what the guarantees mean. They do not establish equal delivery outcomes, permit aggregating overlapping audiences, or identify the count used for invoicing. Controlling measurement and settlement remain separate work in #95. Cross-channel normalization remains with #4.

    These are proposed acceptance cases, not implementation test results.

    Member of the IAB Tech Lab Agentic Taskforce, commenting in a personal capacity.

  5. unreconciled commented on Oct 26, 2026

    @unreconciled
    Author

    Thanks for this, and for the acceptance cases. I agree with the proposed paragraphs and would put them into § 5.7.1 as written, right after the revised equivalence paragraph. They say out loud what the field checks already imply: matching fields are only the floor. In practice, when the methodology references don't settle population or window, an agent will usually have to report the comparison as unresolved, and I think that is the honest answer.

    On the seven cases, I would keep them as worked examples under § 5.7.1 rather than normative text. That way they help implementers without turning into a test suite the spec has to maintain. Scope is the same as you laid out: no new fields in counts[], settlement and the controlling count stay with #95, and normalization stays with #4.

  6. unreconciled commented on Nov 5, 2026

    @unreconciled
    Author

    Thanks for the revision. On point 1: if #147 is adopted, this change reads with its names (measured_by for vendor, level for value) and the basis sentence drops. The rule here does not change: measurement_source_ref names the option that settles each level, and that option's counts[] say what it counts.

    On the open questions, answered from the scope this change started with: declare what is counted, add no methodology.

    1. Co-viewing. The demographic term's definition should state whether co-viewers count, with unknown allowed. Who a guarantee counts is part of what is committed; how co-viewers are measured stays with the rating_source's methodology. Otherwise two guarantees on adults 25-54 from different rating sources read as equivalent when one includes co-viewers and the other does not.
    2. In-target share. I would leave it out of this version. As a metric term with no numerator, it gives the § 5.7.1 rate check nothing to compare, so two shares would match on name alone. If the working group adds it, its definition should state the numerator and the denominator, including how impressions the rating source could not measure are treated.
    3. Unknown age. Same answer as 1: the term states whether impressions of unknown age count, with unknown allowed, because that changes who is counted. How a source assigns age stays with its methodology.
    4. Podcast CPM. I'll leave the choice between a new cost method and a CPM on delivered ads to audio sellers. What I would avoid is a podcast CPM that keeps counting impression while the guarantee counts delivered ads; a line item should be priced on the unit it is counted and settled on.
    5. Certification. Its own status value, with its own body and scope. Buyers read accredited as an audited accreditation, and a compliance certification is a different claim.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    breakingWould break an implementation already built to this draftchange-requestProposes specific normative wordingnormativeChanges what the spec requiressection:5.7-guarantees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions