Skip to content

feat: reach as a metric optimization goal, with frequency as optimization parameter not just suppression #1211

@bokelley

Description

@bokelley

Problem

frequency_cap in AdCP is a targeting overlay — a suppression tool that says "stop showing this user after N impressions." That's useful, but it's not the same as reach optimization.

Reach-optimized campaigns have a different objective: maximize the number of unique users/households exposed at a meaningful frequency level. Frequency isn't just a ceiling to enforce — it's a signal the optimizer uses to decide whether to bid on a given impression at all ("this household has already seen this ad 3 times, it has less reach value now, lower the bid").

This distinction matters significantly for:

  • CTV campaigns — household reach is often the primary KPI; every major DSP (DV360, TTD, Amazon DSP, Viant) has a first-class "maximize reach" mode for CTV
  • Brand awareness campaigns — reach at 3+ frequency is a standard media planning metric
  • Reach & frequency buying — many platforms offer guaranteed reach/frequency products that can't be expressed as a suppression cap

Current state

{
  "targeting_overlay": {
    "frequency_cap": { "max_impressions": 5, "per": "user", "window": "7d" }
  }
}

This suppresses delivery after 5 impressions but doesn't tell the seller to optimize for unique reach — it just caps frequency.

Proposal

Add reach to the metric optimization goal kinds, with reach_unit and an optional target_frequency that frames frequency as an optimization parameter rather than a hard cap:

{
  "kind": "metric",
  "metric": "reach",
  "reach_unit": "households",
  "target_frequency": { "min": 2, "max": 4 }
}

target_frequency here means: the seller should treat impressions toward users/households already within the target frequency band as lower-value, and impressions toward unreach users as higher-value. It's an optimization signal, not a suppression rule. A hard cap can still be layered via targeting_overlay.frequency_cap if the buyer also wants a ceiling.

The product declares:

{
  "metric_optimization": {
    "supported_metrics": ["reach", "views", ...],
    "supported_reach_units": ["individuals", "households", "devices"]
  }
}

Why not just use frequency_cap + maximize impressions?

Maximizing impressions with a frequency cap doesn't optimize for reach — it optimizes for total delivery volume while suppressing excess. A reach optimizer actively de-prioritizes re-reaching known users and shifts budget toward fresh inventory. These produce measurably different campaign outcomes.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions