Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .changeset/print-delivery-evidence-circulation.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
"adcontextprotocol": minor
---

Add experimental `print_metrics` to `core/delivery-metrics.json` for print proof-of-insertion and circulation reporting: `page_delivered`, `position_delivered`, `circulation_delivered`, `circulation_basis` (`audited` | `seller_modeled`), and a `placement-evidence` tearsheet `evidence`. `by_installment` rows inherit it, so each issue reports its own evidence and circulation. All fields are optional; `print_metrics` is added to the `available-metric` enum so sellers can commit to it and report a gap through `missing_metrics`. Documents the SHOULD-populate guidance for guaranteed print products and the rule that circulation falls back to the product's declared `delivery_measurement` absent a per-issue figure in `print.mdx`. Closes #5684, #5687.
Add experimental `print_metrics` (registered with the existing `ooh_metrics` under experimental feature id `media_buy.offline_delivery_metrics`) to `core/delivery-metrics.json` for print proof-of-insertion and circulation reporting: `page_delivered`, `position_delivered`, `circulation_delivered`, `circulation_basis` (`audited` | `seller_modeled`), and a `placement-evidence` tearsheet `evidence`. `by_installment` rows inherit it, so each issue reports its own evidence and circulation. All fields are optional; `print_metrics` is added to the `available-metric` enum so sellers can commit to it and report a gap through `missing_metrics`. Documents the SHOULD-populate guidance for guaranteed print products and the rule that circulation falls back to the product's declared `delivery_measurement` absent a per-issue figure in `print.mdx`. Closes #5684, #5687.
2 changes: 1 addition & 1 deletion docs/creative/channels/ooh.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ Static OOH artwork uses `custom`, like [print](/docs/creative/channels/print): p

The product or publisher declaration should document what pixels cannot express: physical dimensions (a standard bulletin is 14'×48'), bleed, substrate, CMYK profile, production overage counts, and material deadlines (printed materials are customarily due five business days before the scheduled posting date; painted bulletins thirty days — OAAA Bulletin Net Contract §2.2). Panel location, posting period, and audience measurement remain media-buy facts.

Static units have no play event and cannot fire trackers. Flights run in posting periods against published industry calendars, with posting customarily completed within five business days of the scheduled date and display terms running from the average posting date when materials were timely (§2.2 — reported as `average_posted_date` + `materials_timely`). Delivery is a modeled audience estimate from the measurement currency declared on the product/package (`measurement_terms.billing_measurement` — Geopath, Route, MOVE, COMMB); reconciliation uses `ooh_metrics` in delivery reporting, whose posting records are the channel's settlement artifact. Evidence follows the OAAA Proof of Performance clause (§3.5, a separate obligation from §2.2's posting deadline): a photo per bulletin within five *calendar* days of posting and after each rotation, and one representative close-up per creative design variation for poster showings.
Static units have no play event and cannot fire trackers. Flights run in posting periods against published industry calendars, with posting customarily completed within five business days of the scheduled date and display terms running from the average posting date when materials were timely (§2.2 — reported as `average_posted_date` + `materials_timely`). Delivery is a modeled audience estimate from the measurement currency declared on the product/package (`measurement_terms.billing_measurement` — Geopath, Route, MOVE, COMMB); reconciliation uses `ooh_metrics` in delivery reporting (experimental, feature id `media_buy.offline_delivery_metrics` in [Experimental status](/docs/reference/experimental-status), shared with print's `print_metrics`), whose posting records are the channel's settlement artifact. Evidence follows the OAAA Proof of Performance clause (§3.5, a separate obligation from §2.2's posting deadline): a photo per bulletin within five *calendar* days of posting and after each rotation, and one representative close-up per creative design variation for poster showings.

See [Print](/docs/creative/channels/print), [Canonical formats](/docs/creative/canonical-formats), [Creative manifests](/docs/creative/creative-manifests), and [Media products](/docs/media-buy/product-discovery/media-products).
2 changes: 1 addition & 1 deletion docs/creative/channels/print.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ For an installment scheduled at **09:00 UTC on Monday, October 12, 2026**, the b

## Delivery evidence and circulation

Print has no impression event. What a buyer reconciles against an insertion order is proof that the insertion ran, where it ran, and the circulation it ran against. A seller reports these on the existing `by_installment` breakdown of [`get_media_buy_delivery`](/docs/media-buy/task-reference/get_media_buy_delivery), one row per issue, using the optional `print_metrics` object that every `by_installment` row inherits from `delivery-metrics.json`. `print_metrics` is [experimental](/docs/reference/experimental-status) in AdCP 3.3.
Print has no impression event. What a buyer reconciles against an insertion order is proof that the insertion ran, where it ran, and the circulation it ran against. A seller reports these on the existing `by_installment` breakdown of [`get_media_buy_delivery`](/docs/media-buy/task-reference/get_media_buy_delivery), one row per issue, using the optional `print_metrics` object that every `by_installment` row inherits from `delivery-metrics.json`. `print_metrics` is [experimental](/docs/reference/experimental-status) in AdCP 3.3 under the feature id `media_buy.offline_delivery_metrics`, which also covers `ooh_metrics`. A seller that reports it declares that id in `experimental_features`.

| Field | Meaning |
|-------|---------|
Expand Down
24 changes: 24 additions & 0 deletions docs/media-buy/media-buys/optimization-reporting.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,30 @@ The seller's bidding stack steered toward higher Adelaide attention scores; the

If Adelaide's coverage on the inventory dropped below the seller's confidence threshold and they couldn't populate `vendor_metric_values` for this period, the same `(vendor, metric_id)` shows up in `missing_metrics` — same key across the entire lifecycle, so buyer reconciliation is a row-level join.

## Where did this number come from

A delivery or audience figure can carry several independent provenance fields. Each answers a different question, and none substitutes for another: the provider that produced a row is not the demographic notation it is written in, and neither says how the figure was derived. Read them together.

| Field | Question it answers | Value | Where it rides | Scope |
|---|---|---|---|---|
| `measurement_source` | Which audience-measurement **provider's data** produced this row? | Lowercase provider slug (`nielsen`, `geopath`, `barb`) | Row-level on [`delivery-metrics.json`](https://adcontextprotocol.org/schemas/v3/core/delivery-metrics.json), mirroring `delivery-forecast.json` so a forecast and its delivery reconcile on the same declaration | One delivery row (measured channels: radio, broadcast, OOH) |
| `vendor` | Which **vendor defined and computed** this vendor-defined metric? | BrandRef resolving to the vendor's `brand.json` and its `measurement` agent catalog | `reporting_capabilities.vendor_metrics[]` (declaration), `committed_metrics[]`, and `vendor_metric_values[]` (delivery) | One `(vendor, metric_id)` metric |
| `vendor_relationship` | How is that vendor related to the **seller**? | `first_party`, `affiliated`, or `third_party`; absence means undeclared, never `third_party` | Declared on `reporting_capabilities.vendor_metrics[]`; optionally echoed on `vendor_metric_values[]` | One `(seller, vendor)` pair |
| `completion_source` | Who **attested to the completion event** behind `completion_rate`? | `seller_attested` or `vendor_attested` | `qualifier.completion_source` on commitments, missing metrics, and delivery values | The `completion_rate` metric only |
| `demographic_system` | What **notation** is the demographic code written in? | Notation enum (for example `nielsen`, `barb`, `nmo`, `videoamp`, `custom`) | `by_demographic` rows, demographic reporting capability, forecasts, and `cpp` pricing | One demographic code. Notation only: it does not say whose panel produced the number. |
| `estimation_basis` | How was `estimated_impressions` **derived** (static OOH)? | `currency_measured` or `seller_modeled` | `ooh_metrics.estimated_impressions` (experimental) | One OOH delivery row |
| `circulation_basis` | How was `circulation_delivered` **derived** (print)? | `audited` or `seller_modeled` | `print_metrics.circulation_basis` on `by_installment` rows (experimental) | One print installment |
| `match_rate_basis` | Did the platform **report** `effective_match_rate`, or did the seller compute it? | `platform_reported` or `derived` | Each audience in a [`sync_audiences`](/docs/media-buy/task-reference/sync_audiences) result, beside `audience_size` and `targetable_size` | One audience match result |

How the fields combine:

- **Provider versus vendor.** `measurement_source` names a provider as a slug on a measured-channel row. `vendor` names a vendor as a BrandRef on a vendor-defined metric, and `vendor_relationship` says how that vendor stands relative to the seller. Neither is a quality ranking, and neither implies the other.
- **Tier, not provider.** `estimation_basis` and `circulation_basis` record how a figure was derived. The provider rides `measurement_source`, so an `audited` circulation figure still names its auditor there. Currencies change over time, so tier values stay stable while provider slugs vary.
- **Notation, not provenance.** `demographic_system` only fixes how `P25-54` or `M25-54` is written. Report the provider that measured the audience in `measurement_source`.
- **Attestation.** `completion_source` and `vendor_relationship` both distinguish seller-produced from independent figures. `completion_source` applies to `completion_rate` only. `vendor_relationship` applies to every vendor-defined metric.
- **Basis of a rate.** `match_rate_basis` qualifies a rate, not a count: a `derived` rate computed from approximate or bucketed `audience_size` values is itself approximate.
- **Different provenance, different measurement.** Rows that differ on `measurement_source`, `vendor`, `completion_source`, or a `*_basis` value are different measurements. Compare them with care rather than summing them into one figure.

## Performance Monitoring

### Real-Time Metrics
Expand Down
1 change: 1 addition & 0 deletions docs/reference/experimental-status.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ Schemas marked with `x-status: experimental` are the authoritative source. The c
| `signals.signal_lifecycle` | The optional `signal_status` (`enums/signal-status.json`: `processing`, `ready`, `failed`; absent means `ready`) and `source_audience_id` fields on [`get_signals`](/docs/signals/tasks/get_signals) results, the matching `fields` projection values, and the `signals.features.signal_lifecycle` capability flag on [`get_adcp_capabilities`](/docs/protocol/get_adcp_capabilities) (#5409; see [Custom segments built from a seed audience](/docs/signals/tasks/get_signals#custom-segments-built-from-a-seed-audience)) | Readiness and seed lineage for segments a signal agent builds on demand, driven so far by a single named adopter. The wholesale-feed-version and buyer-scoping rules, and the `processing` vocabulary shared with `audience-status`, may change once more signal agents build segments. |
| `media_buy.collection_lists` | The `collection_lists` and `collection_lists_exclude` fields on `targeting.json` and `targeting-input.json`, and the matching `overlay_support` / `required_overlay_support` keys with `max_references` ([#7834](https://github.com/adcontextprotocol/adcp/issues/7834)). See [Combining several collection lists](/docs/governance/collection/index#combining-several-collection-lists-experimental). | One buyer-side adopter so far, and the WG has not ratified the intersection/union semantics or the `max_references` shape. The singular `collection_list` fields are stable and unchanged. |
| `signing.web_bot_auth` | The [Web Bot Auth request-signing profile](/docs/building/by-layer/L1/wba-profile): the `web-bot-auth` value in `request_signing.profiles` and `webhook_signing.profiles` on [`get_adcp_capabilities`](/docs/protocol/get_adcp_capabilities), and `signing_profile` on every webhook registration, adopted by DR-0023 | The profile follows an IETF draft that is still changing. The draft revision it pins and the `Signature-Agent` form may change before graduation. |
| `media_buy.offline_delivery_metrics` | The `ooh_metrics` delivery block on `core/delivery-metrics.json` (panels, posting periods, posting records, share of voice, modeled `estimated_impressions` with `estimation_basis`; added in 3.2 and documented in [Out-of-home](/docs/creative/channels/ooh)), and the `print_metrics` delivery block (`page_delivered`, `position_delivered`, `circulation_delivered`, `circulation_basis`, `evidence`; added in 3.3 and documented in [Print creative](/docs/creative/channels/print#delivery-evidence-and-circulation)). Both carry `x-status: experimental`, both are addressable as `ooh_metrics` / `print_metrics` in the `available-metric` enum, and both reuse the channel-neutral `core/placement-evidence.json` artifact. | Delivery reporting for channels with no play or impression event — static OOH posting records and print proof-of-insertion with circulation — rests on one named adopter per channel and on contract conventions (OAAA proof of performance, tearsheets, circulation audits) that have not been field-tested across parties. `ooh_metrics` shipped in 3.2 without a registry row; this row registers it with `print_metrics` as a clarification, so a seller on 3.3 that reports either block declares the id. A seller on a 3.2 schema that already reports `ooh_metrics` is not made non-conformant retroactively. Field shapes, the `estimation_basis` / `circulation_basis` tier vocabularies, and the shared evidence artifact may change before they freeze. |

Graduation progress and notice of upcoming breaking changes will be called out in the [release notes](/docs/reference/release-notes) for each 3.x release starting with 3.0 GA.

Expand Down
Loading
Loading