Skip to content

RFC: add time-based video view metrics (time_based_views) to delivery reporting #6430

Description

@pkras

Problem

Delivery reporting exposes video completion only on a completion-percentage basis (quartile_data.q1_viewsq4_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

  1. threshold_seconds — open numeric (RECOMMEND 2/6 in prose) or constrained to a recommended set (2/6/15/30)? Leaning open-numeric.
  2. number vs integer for threshold_seconds? (number keeps sub-second thresholds open and matches viewability.viewed_seconds.)
  3. 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?
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.media-buyIssue concerns the media-buy protocol domainneeds-wg-reviewBlocked on a working-group decision — surface in WG meeting agendasrfcProtocol change — auto-adds to roadmap boardschemaJSON Schema source-of-truth: definitions, codegen artifacts, validation, hygiene

    Type

    No type

    Projects

    Status
    No status

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions