Skip to content

feat(schemas): five missing metric scalars (CPCV, CPM, downloads, units_sold, new_to_brand_units)#3507

Merged
bokelley merged 2 commits into
mainfrom
bokelley/missing-metric-scalars
Apr 29, 2026
Merged

feat(schemas): five missing metric scalars (CPCV, CPM, downloads, units_sold, new_to_brand_units)#3507
bokelley merged 2 commits into
mainfrom
bokelley/missing-metric-scalars

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Summary

Adds five scalar metrics production reporting carries today but that had no enum entry. Closes the missing-scalars sub-item of #3460.

Scalar Why it's needed
cost_per_completed_view CTV CPCV pricing scalar; parallels existing cost_per_click/cost_per_acquisition
cost_per_thousand CPM is universal across CTV/display/audio/DOOH; conspicuous absence before this PR
downloads IAB-standard for audio/podcast (Podcast Measurement Technical Guidelines 2.x); distinct from views
units_sold Retail-media commerce scalar; distinct from conversions (one transaction can carry multiple units)
new_to_brand_units Retail-media count of units sold to first-time buyers; parallel to existing new_to_brand_rate

All five added as type: number, minimum: 0 properties on delivery-metrics.json plus enum entries on available-metric.json. Doc list in optimization-reporting.mdx updated.

Other sub-items on #3460

  • Closed-vs-open enum — resolved by feat(schemas): vendor-metric extensions surface for measurement metrics #3492 (vendor-metric extensions). Closed enum stays closed; vendor-defined metrics live in the parallel structured vendor_metrics surface anchored on the vendor's brand.json.
  • completion_rate derived ratio — resolved by the drop-carve-out call in feat(schemas): required_metrics filter + missing_metrics accountability #3472's refactor. missing_metrics is the symmetric mirror of available_metrics with no carve-outs; sellers either report ratios or they appear in missing_metrics.
  • DBCFM cross-check — remains as a human follow-up (David Porzelt; whether engagements/follows/saves/profile_visits collide with DBCFM Reporting/Performance KPI codes). Not a code change.

Skipped

  • viewable_impressions/viewable_rate as scalars — already in the viewability namespace which is in the enum; adding scalars would duplicate. The namespace covers it: required_metrics: ["viewability"] on get_products matches products that report viewability data, and the seller emits the full viewability object on delivery.

Backwards compatibility

All additions are optional. Existing reports stay conformant; sellers populate the new fields when applicable.

Test plan

  • npm run build:schemas — clean
  • npm run test:schemas — 7/7
  • npm run test:examples — 34/34
  • npm run test:json-schema — 255/255
  • npm run test:composed — 32/32
  • npm run typecheck — clean
  • precommit + pre-push — green

Closes #3460.

🤖 Generated with Claude Code

bokelley and others added 2 commits April 29, 2026 06:43
…ts_sold, new_to_brand_units)

Adds five scalars production reporting carries today but had no enum entry:

- cost_per_completed_view — CTV CPCV pricing scalar
- cost_per_thousand — CPM (universal pricing scalar across CTV/display/
  audio/DOOH; conspicuous absence next to cost_per_click before this PR)
- downloads — IAB-standard scalar for audio/podcast (Podcast Measurement
  Technical Guidelines 2.x methodology); distinct from views
- units_sold — Retail-media commerce scalar; distinct from conversions
  (one transaction may carry multiple units)
- new_to_brand_units — Retail-media count of units sold to first-time
  buyers; parallel to existing new_to_brand_rate

All five added as type:number minimum:0 properties on delivery-metrics.json
plus enum entries on available-metric.json. Doc list in
optimization-reporting.mdx updated.

Closes the missing-scalars sub-item of #3460. Other sub-items already
resolved by recent merges:
- Closed-vs-open enum: resolved by #3492 (vendor-metric extensions)
- completion_rate derived ratio: resolved by drop-carve-out call in #3472
DBCFM cross-check remains as a human follow-up (David Porzelt).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… descriptions

Three review fixes per expert feedback on #3507:

1. Rename cost_per_thousand → cpm. Both protocol and product expert
   independently flagged that pricing-model.json:8 already uses the
   canonical "cpm" token; calling the scalar cost_per_thousand creates a
   translation mismatch. Operators say "CPM"; OpenRTB, GAM (eCPM),
   TTD all use cpm. Now buyers cross-walk pricing_model→reported scalar
   without a lookup table.

2. Remove real brand names from schema descriptions. delivery-metrics.json
   embedded a real list (Amazon Ads, Walmart Connect, Roundel, Sam's MAP,
   Instacart Ads, Target Roundel) that ships in the published spec —
   playbook policy bars real brand names in schemas. Replaced with
   neutral phrasing. (Bonus: Roundel IS Target's network, so the dup was
   confused.) Same for downloads (Megaphone/Art19/Spotify/Apple Podcasts
   list scrubbed).

3. Tighten descriptions:
   - cpm: fix operator-precedence prose to (spend / impressions) × 1000;
     expand channel list to include mobile/web video and native.
   - units_sold: note attribution windows are platform-specific; sellers
     SHOULD declare via measurement_windows or measurement_terms rather
     than encoding in the scalar name (no _14d/_30d sprawl).
   - new_to_brand_rate (existing field): clarify it's a fraction of
     conversions/transactions, distinguishing it from the new
     new_to_brand_units count.
   - new_to_brand_units: cross-reference the rate field for clarity.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley
bokelley merged commit 4f08ba1 into main Apr 29, 2026
18 checks passed
@bokelley
bokelley deleted the bokelley/missing-metric-scalars branch April 29, 2026 12:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expand available-metric enum: missing scalars + closed/open question + DBCFM cross-check

1 participant