guide · buying the awkward channels

Buying UK DOOH without a movement-data licence

A billboard cannot know who you are. It can know who tends to walk past it, and when.

Digital out-of-home is sold with audience language that mostly rests on mobility data: a licensed panel of location signals used to say which screens over-index on a given segment. If you do not hold that licence — and we do not — you can still build a defensible out-of-home plan from three things that are entirely aggregate: the venue type of each screen, the geographic polygons you want to be seen in, and the hours you want to be seen at. That is a claim about a place and a time rather than about a person, which is exactly how it should be described. AdBuyMCP grades out-of-home 50 out of 100 at geo-cohort level, fixed regardless of how well the brief matched, and its compiler returns an empty screen-ranking list rather than an invented one, because the ranking is the part that needs the licence.
Fidelity
50 / geo-cohort, fixed
Screen ranking
Empty by design
Copy limit
7 words, enforced
Length
10 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

    Venue type, polygon and daypart are aggregate and defensible. Movement-derived audience indices are the part that needs a licence and a lawful basis.

  2. 02

    A daypart does most of the work an audience index promises. Commuter hours at a rail station is a claim you can support; "IT decision makers" on a billboard is not.

  3. 03

    AdBuyMCP's compiler emits an empty screen ranking rather than a fabricated one, and the fidelity rationale names the ranking as intended design rather than shipped behaviour.

  4. 04

    No DOOH rail here can be driven end to end from a compiled persona in live mode. Activation needs vendor unit identifiers, and there is no verified translation from venue semantics to them.

  5. 05

    Out-of-home is the channel a geo-lift design suits best, which is the compensation for a targeting claim that stops at the postcode.

01

What the audience language in a DOOH pitch is resting on

Programmatic out-of-home is sold, almost universally, with audience segments: business professionals, affluent shoppers, IT decision makers. Underneath those labels sits a mobility dataset — location signals from mobile devices, licensed from a data company, used to build an index of which screens are passed disproportionately often by devices belonging to a given segment.

That is a real technique and it produces genuinely useful rankings. It also carries two costs that rarely appear in the pitch. It requires a commercial licence, which is expensive enough to be a real barrier. And it requires a lawful basis, because device-level location signals are personal data under UK rules and a business-to-business purpose does not exempt them: person-level targeting built on device identifiers is consent territory, not legitimate-interest territory.

So the honest question to ask of any out-of-home proposal is which of its claims survive without that dataset. The answer is: most of the useful ones.

02

What you can plan honestly without a licence

Four inputs carry an out-of-home plan. Three of them touch no personal data at all; the fourth carries whatever basis its provider attested, and the manifest names that provider.

Venue types
The standard OpenOOH classification: rail stations, underground, roadside digital billboards, office buildings and lifts, gyms, shopping malls. A venue type is a fact about a screen's location, published by the industry.
Geographic polygons
Postcode-district polygons rather than a radius. A polygon is a boundary you drew; it makes no claim about who is inside it.
Dayparts
The hours the screen plays your ad. This is the input doing most of the work an audience index promises, and it is entirely a property of the schedule.
Aggregate audience layers
Where an audience layer is used, the manifest records the provider that attested it rather than implying AdBuyMCP verified it. The consent-attested movement contract behind the sharpest of these does not exist here, so no movement data reaches the product at all.
03

Dayparts do the work the index was promising

The claim "this screen reaches business professionals" is, in almost every case, a compressed version of "this screen is in a place business professionals pass through, at hours when they pass through it". Once you say it the long way, you can build it out of a schedule.

AdBuyMCP does exactly that, and the rule is visible in the compiler. Where the brief carries firmographics — a sector, a seniority, a business audience of any kind — the plan buys the two commute windows, roughly half past six to ten in the morning and half past four to eight in the evening. Where it does not, the plan buys the long daytime and evening window instead. Nothing about that requires a movement panel; it requires knowing what a commute is.

The claim you are left with is weaker and true: you have bought a rail station concourse at commuter hours because business professionals are known to be there in numbers, not bought business professionals. That distinction is the difference between a plan you can defend to a data protection officer in one sentence and one that needs a paragraph.

04

Why the screen ranking comes back empty

AdBuyMCP's out-of-home compiler returns a targeting specification with audience segment identifiers, venue types, geographic polygons, dayparts — and an empty screen-ranking list. That empty array is deliberate and it is documented as such on the channel page: the rationale describes screens ranked by persona over-index using movement data, and the product says plainly that this half of the rationale describes the intended design rather than shipped behaviour.

It would have been easy to fill. A seeded number between 105 and 168 next to each screen would look exactly like a real index, and nobody reviewing a plan would query it. That is precisely the argument against doing it: a fabricated index is indistinguishable from a measured one at the point of sale and only distinguishable afterwards, when it is too late to matter.

The compensating control is that manual selection is a first-class path rather than a fallback. Picking billboards, venues and screens by hand is fully supported in the product, and where a screen list matters more than an algorithmic ranking — which, without movement data, is most of the time — that is the honest route.

05

The rails, and where they actually stop

Three rails reach out-of-home in AdBuyMCP, and their states differ enough to matter.

The Perion (Hivestack) buyer-side API is the one with real published documentation, and the live client is written against it: campaign and line-item creation, availability checks against unit identifiers, pause, and a unit catalogue. Two details from that integration are instructive for anyone building against the same API. Line items target numeric unit identifiers, so a plan expressed in venue types and postcode polygons has to be translated into specific units before it can be activated. And dayparts are a bit field of 168 whole hours, so a daypart of half past six to ten in the morning covers three whole hours rather than three and a half — the adapter includes only fully covered hours rather than widening the range, because widening a daypart silently buys inventory the buyer did not ask for.

Vistar Media is a stub. Every one of its live methods — forecast, activate, pause, creative submission, reporting, inventory listing — throws before making any request, and the reasons are specific: no published demand-side campaign endpoint matching the shape this platform sends, a creative endpoint limited to approved third-party bidders needing an offline-issued key, and a reporting response contract that has to be observed against a real seat before it can be normalised. Our own README once described this connector as having a live client; the code is right and the README was stale.

The third is not a dedicated out-of-home integration at all. StackAdapt carries DOOH on the same GraphQL seat as its CTV and audio inventory, which makes it the broadest single rail in the product and the only one where an out-of-home line can sit in the same buy as the video and audio lines. Its grade is client-built, like the rest of that connector: the client is written and passes tests against mocked responses, and no vendor has accepted a call from it. One limit travels with it — the client reports that StackAdapt publishes no inventory-browse API, so any out-of-home catalogue it shows you is a sandbox catalogue rather than a screen list you could buy from.

The practical upshot is stated on the channel page and repeated here because it is the sort of thing a buyer should hear twice: no DOOH rail can be driven end to end from a compiled persona in live mode today. Activation needs hand-picked unit identifiers, because venue and postcode semantics have no verified translation into vendor identifiers.

06

Creative that survives four miles an hour

Out-of-home creative fails in a way no other channel's does: the reader is moving. The constraint that follows is not aesthetic, it is arithmetic, and AdBuyMCP enforces it in code rather than advising it in a checklist — a headline is capped at seven words.

The formats are fixed by the screen rather than by the seller: portrait at 1080 by 1920, landscape at 1920 by 1080, banner at 1400 by 400. The studio renders to the exact screen resolution rather than scaling a stretched asset into it, which matters more on out-of-home than anywhere else because a rescaled asset on a high-resolution portrait screen is visibly soft at the distance people actually read it from.

The rule of thumb worth keeping whatever tool you use: one idea, one image, a brand that is legible at a glance, and no telephone number. A headline nobody can read at four miles an hour is not creative, it is spend.

07

Proving it, which is where out-of-home gets its own back

Out-of-home has the weakest targeting claim of the digital channels and the strongest position on causal measurement, and those two facts are related. Because the buy is geographic, it can be held out geographically, and a matched-market test needs nothing from the medium except the ability to buy some places and not others.

Proof of play comes from the seller: a record that the creative played on a screen at a time. That is delivery evidence, not exposure evidence, and it should be labelled as delivery. The exposure ledger in AdBuyMCP writes out-of-home exposures at postcode-sector level, which in principle supports frequency deduplication against cinema and connected TV in the same area and a sequential journey view across them. Today that ledger is fed only by the deterministic sandbox: there is no inbound ingest route for viewshed panels, so the journey view is a working mechanism awaiting live input rather than evidence about a campaign.

If you want out-of-home to prove something, budget for the holdout at the same time as the media, and run the power calculation before the flight rather than after it.

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

AdBuyMCP holds no movement-data licence and no movement data reaches the product. The screen-ranking field in a compiled DOOH plan is empty, and the fidelity rationale's reference to ranking by over-index describes intended design rather than shipped behaviour. Vistar has no live client here: every live method throws. Hivestack activation requires hand-picked numeric unit identifiers because there is no verified translation from venue and postcode semantics into vendor identifiers, so no DOOH rail can be driven end to end from a compiled persona in live mode. Nothing here has spent money through a live out-of-home rail. Blindspot and AdQuick both have better screen-level inventory tooling than we do today, and if screen-level selection is your requirement you should know that before they start.

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.

  • 01packages/core/src/compilers/compilers.ts — the fixed score of 50, the venue-type and segment selection, the polygon geography, the two daypart sets and the empty screen-ranking array
  • 02packages/core/src/registry/catalogues.ts — the OpenOOH venue-type catalogue
  • 03packages/adapters/src/vendors/hivestack.ts — the buyer-side API v2 client, the numeric unit identifiers and the 168-bit daypart encoding that refuses to widen a partial hour
  • 04packages/adapters/src/vendors/vistar.ts — every live method and the specific reason each one fails closed
  • 05packages/core/src/policy/policy-engine.ts — the rule that device-level identifiers are consent territory and a B2B purpose does not exempt them
  • 06src/data/channels.ts and src/data/supply.ts on this site — the published band, the creative limits, the plan floor and the rail grades

2,179words, 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 DOOH really target business decision makers?

It can buy screens in places where business decision makers are disproportionately present, at hours when they are there. That is a statement about a place and a time, and it is a legitimate way to reach a business audience. It is not targeting a person, and any proposal that describes it as though a screen knows who is in front of it is describing something that does not exist. AdBuyMCP grades the whole channel 50 out of 100 at geo-cohort level for exactly this reason, and the score does not move.

Do I need a movement-data licence to buy out-of-home?

No. You need it to make audience-index claims about specific screens. Without it you can still select by venue type, by polygon and by daypart, which covers most of what a plan actually needs, and you can still buy through the exchanges. What changes is the language on the plan: you describe the place and the hours rather than an audience percentage, and the claim you make afterwards is correspondingly smaller and correspondingly defensible.

Why can't a compiled persona activate a DOOH campaign end to end?

Because the vendor APIs target specific numeric unit identifiers and there is no verified translation from venue types and postcode polygons into those identifiers. Producing one would mean matching a semantic venue class against a vendor's own inventory taxonomy and trusting the result enough to spend money on it. Until that translation is contract-tested against a live catalogue, activation requires hand-picked units, and this site describes the rail as built rather than as live.