Problem
Delivery reporting exposes video completion only on a completion-percentage basis (quartile_data.q1_views–q4_views = 25/50/75/100%). But a large class of video inventory reports "views" on a time basis, not a completion basis:
- Meta — 2-second view
- TikTok / YouTube — 6-second view
- IAB video viewability standard is itself time-based — 2 continuous seconds at 50% in view
None of these are representable today, so a seller running this inventory literally cannot return its primary view metric. views is a single billable-threshold scalar and can't carry multiple time thresholds; quartile_data is percentage-based and doesn't apply.
This is not just social
The behavioral class is autoplay / skippable / scroll-away video, where a time threshold — not completion — is the native view currency. Against enums/channels.json, that spans:
social — Meta 2s, TikTok 6s.
olv — the biggest beneficiary after social. Its own enum description is "pre-roll, outstream, in-app video"; outstream/in-feed web video and skippable pre-roll (YouTube's 6s threshold is olv) are counted on 2s/6s views.
display and retail_media — where they carry in-feed / in-app autoplay video (rich-media and native video, sponsored in-feed video on commerce apps). Same behavior.
Explicitly not a CTV/cinema metric. ctv, cinema, and largely gaming are lean-back, full-screen, sound-on, mostly non-skippable — completion (quartiles / completion rate) is the right currency there and time_based_views adds little. This RFC does not propose it as their primary view metric.
Proposed change (additive, backward-compatible)
Add a declarative array to core/delivery-metrics.json rather than hardcoding platform thresholds:
"time_based_views": {
"type": "array",
"description": "Time-based video view counts. Each entry reports views that met a continuous in-view duration threshold, rather than a completion-percentage threshold (percentage-based completion is quartile_data). 2 and 6 are RECOMMENDED cross-platform standards (Meta 2s / IAB viewable minimum; TikTok & YouTube 6s); any publisher-defined threshold is permitted. At most one entry per threshold_seconds.",
"items": {
"type": "object",
"properties": {
"threshold_seconds": { "type": "number", "exclusiveMinimum": 0 },
"views": { "type": "number", "minimum": 0 }
},
"required": ["threshold_seconds", "views"]
}
}
Add time_based_views to the enums/available-metric.json enum so sellers declare support, exactly like every other capability-gated delivery metric (quartile_data, viewability, dooh_metrics already set the precedent for object/array-shaped declared metrics).
Why an array over discrete views_2s / views_6s fields: time thresholds are open-ended and platform-specific — a fixed-shape pair hardcodes today's platforms and forces a schema PR for every new threshold. The array is future-proof. Trade-off: like quartile_data, the array is not sortable/breakdownable (only flat numeric fields are in sort-metric.json). If per-threshold sorting ever becomes a hard requirement, targeted flat fields can be added then.
Backward compatibility: purely additive. quartile_data unchanged; all new fields optional and capability-gated.
Open questions for maintainers
threshold_seconds — open numeric (RECOMMEND 2/6 in prose) or constrained to a recommended set (2/6/15/30)? Leaning open-numeric.
number vs integer for threshold_seconds? (number keeps sub-second thresholds open and matches viewability.viewed_seconds.)
- Duplicate-threshold handling: draft-07
uniqueItems compares whole objects, so it can't enforce one-entry-per-threshold. Enforce via normative prose ("buyers MAY treat duplicates as a seller conformance bug"), like the vendor_metric_values dedup rule?
- Audio analog: the same pattern (count an engagement at N continuous seconds) generalizes to audio — the classic ~30s stream/"play" qualification, verified listen vs. raw download — but "views" is the wrong word for
streaming_audio / podcast / radio. Keep this video-only and add a separate audio concept later, or generalize now to a channel-neutral "time-based engagements" shape? Leaning video-only to keep the term honest.
Prior art
IAB Viewable Video (50% pixels / 2 continuous seconds); existing viewability.viewed_seconds + viewability.standard are the in-repo precedent for time/threshold-governed view metrics.
Split from a broader proposal; the individually-addressable-quartiles half is a separate RFC.
Problem
Delivery reporting exposes video completion only on a completion-percentage basis (
quartile_data.q1_views–q4_views= 25/50/75/100%). But a large class of video inventory reports "views" on a time basis, not a completion basis:None of these are representable today, so a seller running this inventory literally cannot return its primary view metric.
viewsis a single billable-threshold scalar and can't carry multiple time thresholds;quartile_datais percentage-based and doesn't apply.This is not just social
The behavioral class is autoplay / skippable / scroll-away video, where a time threshold — not completion — is the native view currency. Against
enums/channels.json, that spans:social— Meta 2s, TikTok 6s.olv— the biggest beneficiary after social. Its own enum description is "pre-roll, outstream, in-app video"; outstream/in-feed web video and skippable pre-roll (YouTube's 6s threshold is olv) are counted on 2s/6s views.displayandretail_media— where they carry in-feed / in-app autoplay video (rich-media and native video, sponsored in-feed video on commerce apps). Same behavior.Explicitly not a CTV/cinema metric.
ctv,cinema, and largelygamingare lean-back, full-screen, sound-on, mostly non-skippable — completion (quartiles / completion rate) is the right currency there andtime_based_viewsadds little. This RFC does not propose it as their primary view metric.Proposed change (additive, backward-compatible)
Add a declarative array to
core/delivery-metrics.jsonrather than hardcoding platform thresholds:Add
time_based_viewsto theenums/available-metric.jsonenum so sellers declare support, exactly like every other capability-gated delivery metric (quartile_data,viewability,dooh_metricsalready set the precedent for object/array-shaped declared metrics).Why an array over discrete
views_2s/views_6sfields: time thresholds are open-ended and platform-specific — a fixed-shape pair hardcodes today's platforms and forces a schema PR for every new threshold. The array is future-proof. Trade-off: likequartile_data, the array is not sortable/breakdownable (only flat numeric fields are insort-metric.json). If per-threshold sorting ever becomes a hard requirement, targeted flat fields can be added then.Backward compatibility: purely additive.
quartile_dataunchanged; all new fields optional and capability-gated.Open questions for maintainers
threshold_seconds— open numeric (RECOMMEND 2/6 in prose) or constrained to a recommended set (2/6/15/30)? Leaning open-numeric.numbervsintegerforthreshold_seconds? (numberkeeps sub-second thresholds open and matchesviewability.viewed_seconds.)uniqueItemscompares whole objects, so it can't enforce one-entry-per-threshold. Enforce via normative prose ("buyers MAY treat duplicates as a seller conformance bug"), like thevendor_metric_valuesdedup rule?streaming_audio/podcast/radio. Keep this video-only and add a separate audio concept later, or generalize now to a channel-neutral "time-based engagements" shape? Leaning video-only to keep the term honest.Prior art
IAB Viewable Video (50% pixels / 2 continuous seconds); existing
viewability.viewed_seconds+viewability.standardare the in-repo precedent for time/threshold-governed view metrics.Split from a broader proposal; the individually-addressable-quartiles half is a separate RFC.