guide · running it safely

Frequency capping across channels, and why it usually is not happening

Seven platforms each capping at four is not a cap of four.

Frequency capping limits how many times one person or household sees the same advertising in a period. Nearly every platform does it within its own inventory, and nearly none does it across sellers, which means a plan running on seven channels with a cap of four on each is not capped at four — it is capped at up to twenty-eight, against households that appear in several of the seven. Doing it properly requires one exposure record that every channel writes into, keyed on something all of them can supply. That is a structural requirement rather than a setting, and it is the reason cross-channel frequency is claimed far more often than it is delivered.
The problem
Caps are per-seller
What it needs
One exposure record
Keys, coarse to fine
Four
Length
4 min read
evidenceNo campaign outcomes
Book a working session
Bring a real brief and everything described here runs against it: the compiled plans, the fidelity scores, and the question of whether the campaign can be proved at all.
Book a working session →
On this page
if you read nothing else

What to remember

The whole guide is below. These are the parts that change a decision.

  1. 01

    A cap set on each platform separately does not produce that cap in aggregate. The overlap is invisible to every platform involved.

  2. 02

    Cross-channel capping needs one record keyed on something every channel can supply — which in practice means degrading gracefully from household to postcode sector.

  3. 03

    The naive sum of each channel's reach is the most common inflated number in a media report, and it is inflated by exactly the overlap capping would have caught.

  4. 04

    It matters most at launch, because a launch buys the same people repeatedly across channels by design.

01

Why per-platform capping does not add up

Each platform can see its own delivery and nothing else. When it caps at four, it means four exposures within its own inventory, to the identifiers it recognises. It has no visibility of the same household being reached by a different seller an hour earlier.

The consequence compounds with the number of channels. Two channels overlap somewhat; seven overlap substantially, particularly when they are all targeting the same narrow audience — which is precisely what a well-briefed multi-channel plan does. The better your targeting, the worse the overlap.

None of this shows in a per-channel report. Each one reports its own frequency accurately, and the aggregate figure — the one a marketing director actually cares about — is not computed by anybody.

02

What a shared exposure record requires

To deduplicate across sellers you need every channel writing exposures into one record, keyed on an identifier they can all supply. The difficulty is that they cannot all supply the same one. A streaming platform can offer a household; a billboard can offer a postcode sector and nothing finer; a podcast can offer a delivery log.

The workable design is multi-key with graceful degradation: an opaque household key where available, a hashed advertising identifier where one exists, a consent-based identifier where the chain supports it, and a postcode sector as the coarsest key that always works. Precision varies by channel and the record says which key it used.

That degradation is not a compromise, it is the requirement. Advertising identifiers are a declining asset and a spine that depended on them alone would lose accuracy on a schedule set by Apple and Google. Multi-key is what keeps the record useful as that happens.

03

The privacy boundary this creates, and how to handle it

A single record of who saw what across seven channels is exactly the kind of dataset that deserves scrutiny, and the design decision that matters is where identity resolution happens.

The defensible arrangement is that the exposure record itself never performs an identity join — it stores whichever key it was given and never resolves it back to a person or across key spaces. Resolution happens in one separate module, which is then the only place a reviewer has to read to understand what is joined to what, and the only place a retention rule has to be enforced.

In AdBuyMCP that module holds hashed advertising identifiers for at most ninety days, after which the hash is persistently stripped from the event and the record re-graded to a coarser key rather than deleted. Being exact about the current state: the spine is designed, schema-backed and unit-tested, and is fed only by the deterministic sandbox today, because a live report proves aggregate delivery rather than household exposure and the system refuses to mint identities from one.

04

Where it matters most

A launch is the worst case and the best argument. Launch campaigns deliberately buy the same audience across several channels in a compressed window, which maximises overlap at exactly the moment somebody is going to report a combined reach figure to a board.

The second case is a narrow B2B audience. If your addressable market is fifty thousand people in three cities, seven channels targeting them will overlap heavily by construction, and the difference between the deduplicated and naive reach figures can be large enough to change a decision.

The case where it matters least is a broad national consumer campaign with genuinely different audiences per channel — which is rarer than media plans imply.

If the version of this that matters is the one about your own budget, that is a working session rather than a page.

Talk it through
what this guide does not claim

The limits, in the same size type as the rest

This guide describes how cross-channel capping works and what it requires. It does not claim AdBuyMCP is currently deduplicating live campaigns: the exposure ledger is designed, schema-backed and unit-tested, and today it receives data only from the deterministic sandbox. There is no inbound ingest route for viewshed panels, streaming logs or IP logs, and no shipped code path writes a hashed identifier, a consent-based identifier or a postcode sector from live data. Treat the journey explorer built on that ledger — the view showing a postcode sector exposed to a billboard and then to a CTV ad — as a working mechanism awaiting live input rather than as evidence about your campaign.

If one of those limits is disqualifying, it is better established now than in week three, and a call establishes it in forty-five minutes.

Talk it through
where this came from

Every figure above, and the file it was read from

Named rather than linked. A URL nobody opened on the day it was attached is a citation in appearance only, so this names the code, the data module or the dated research report instead, and you can go and check.

  • 01The four-key design, the identity boundary and the retention rule are read from the exposure ledger and key-translation modules in the product repository.
  • 02The sandbox-only ingest constraint is from the orchestrator, which writes exposure rows only for sandbox execution.

987words, counted from this page rather than claimed. Where the platform’s README and its code disagree, the code wins.

// bring a brief

Everything above, run against your own audience.

Forty-five minutes. One sentence compiles into seven channel plans in front of you, with the fidelity score, the lawful-basis manifest and the measurement eligibility on screen rather than described.

Book a working session

45 minutes. Bring a real brief and we compile it live. · Design-partner phase · the sandbox needs no card and no credentials

Questions this guide gets asked

Answered in full here, and indexed alongside every other question this site answers at /faq.

Can I just set the same cap on every platform?

You can, and it does not produce the cap you set. Each platform enforces it within its own inventory only, so the aggregate exposure for a household appearing on several channels is the sum rather than the maximum. Setting four on seven channels permits up to twenty-eight. There is no configuration that fixes this from inside the platforms, because none of them can see the others.