Skip to content

RFC: frequency_capping capability declaration — what does a seller need to commit to? #4640

@bokelley

Description

@bokelley

Open question

targeting.frequency_cap (core/targeting.json#L174) lets a buyer request a frequency cap on a package. There's no corresponding capability declaration on the seller side — buyers can't discover whether a seller will actually honor the cap, what dimensions it caps on, or what time windows it supports.

Compare to collection_list on the same schema, which explicitly notes "Seller must declare support in get_adcp_capabilities." Frequency capping doesn't have that hook.

Two questions for the WG:

1. What does "I support frequency capping" mean?

Possible shapes:

(A) Presence-only object — same pattern as conversion_tracking. Mere presence of frequency_capping: {} means the seller honors targeting.frequency_cap. Minimal, but doesn't communicate dimensions/granularity.

(B) Capability object with declared dimensions:

\"frequency_capping\": {
  \"supported_scopes\": [\"impression\", \"reach\"],    // cap on raw impressions vs unique users
  \"supported_windows\": [\"hour\", \"day\", \"week\", \"month\", \"campaign\"],
  \"min_cap\": 1,
  \"max_cap_per_period\": null,
  \"enforces_within\": \"package\" | \"buy\" | \"account\"
}

(C) Boolean — just frequency_capping: true. Cheapest, least informative.

Shape (B) is honest about what's variable in the field. Many sellers cap per-impression-per-day but not per-reach-per-week; some only enforce at the package level; some can only enforce within a single ad server's view.

2. How does this compose with target_frequency on reach goals?

optimization-goal.json declares target_frequency for reach optimization — a soft "prefer fresh reach" signal that's distinct from a hard cap. Does a seller advertising frequency_capping automatically support target_frequency, or are these independent capabilities?

My read: independent. frequency_cap is a hard targeting constraint; target_frequency is an optimization signal. A seller can support one without the other.

3. Does this need product-level or seller-level declaration?

metric_optimization is declared per-product; conversion_tracking is declared per-seller. Frequency capping could be either — different products on the same agent may have different caps. Most likely per-seller for the dimension declaration, per-product for limits (min/max).

Why now

media_buy_seller/frequency_cap_enforcement is on the storyboard backlog under #4637 — it would assert that a buy with targeting.frequency_cap set produces delivery whose observed frequency stays at-or-below the cap. The scenario needs a capability gate; without a declaration shape, the gate has nowhere to point.

Asks of the WG

  1. Which shape — (A), (B), or (C)?
  2. Should target_frequency support inherit from the same capability or stay independent?
  3. Seller-level vs product-level (or both)?

Out of scope

  • The storyboard scenario itself. That lands once the capability shape is settled.
  • Reach measurement methodology. Frequency capping is a control, not a measurement.

Refs

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.enhancementNew feature or requestrfcProtocol change — auto-adds to roadmap board

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status

    Shipped

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions