DeepContext lets an advertiser buy media where the content fits the brand, not where a person was tracked. Someone in ad operations describes the brand in plain words; AdZoic reads the sites and apps we are offered, scores each one for fit, explains why, and turns the best into a list that a campaign buys on — with no cookies and no user IDs. This post walks through how it works, step by step, and the problems it was built to avoid.
The problem
Targeting built on following people is breaking, and it was never a good fit for our markets.
- Identifiers are disappearing. Phones ask before they allow tracking, browsers block third-party cookies, and most of our traffic arrives from apps with limited or no device IDs.
- Privacy rules keep tightening. Every campaign that depends on a profile of a person carries legal and reputational risk — for the advertiser and for us.
- Context was a black box. Older contextual tools took a fixed list of top websites, scored them once, and could not say why a site was in or out. Advertisers could not check the work.
- Brand safety came too late. Unsafe pages were often found after the money was spent, in a report nobody could act on.
- Nobody knew what we could actually buy. A plan built on sites a market does not offer us delivers nothing, and the gap was found only after launch.
How it works, in six steps
Three parts share the work. The dashboard holds the brief. A separate context engine does the reading and scoring, ahead of time. The bidder — the part of our system that decides whether to buy an ad — applies the result to live bids. The picture at the top of this post is the whole flow; here it is in order.
- Write the context. Pick the advertiser and describe the brand and the audience in plain words. Choose countries and languages. Add guardrails: keywords and content categories to prefer or exclude, a brand-safety level, and a minimum fit score.
- Name the publishers you already know. A seed list of sites, pages and apps that every run checks first — even before our own traffic has shown them to us.
- Run it. The context engine reads the sites and apps the exchanges actually offer us in that market, busiest first, and scores each one while you watch.
- Read the results. Every row has a fit score from 0 to 100, a summary, keywords, topics, language and brand-safety risk — and the reason for the score. Search, filter and sort; the engine suggests keywords and categories to add or exclude.
- Build the inventory. Each run adds to the context's stored inventory instead of starting again, and after you edit the brief, only what changed is scored again.
- Make a group. The matches above the minimum score become a group. Ad ops can add a known publisher by hand, and it stays pinned.
- Attach it to a campaign. From the group's page or from the campaign's own settings. From then on the bidder buys only on the group's sites and apps, and the group refreshes itself every week. Detaching is one click, from either side.
The line that makes a group. Everything above the minimum score is in; a publisher you add by hand is pinned, whatever its score. Scores are illustrative.
Exclude first, score second
Scoring is the part that costs — it means reading a site or an app and reasoning about it. So the guardrails run first. A site in the wrong language, an app in an excluded category, a page carrying an excluded keyword or a brand-safety risk is dropped at the gate, with the reason recorded, before any scoring effort is spent on it. Only what gets through is read and scored.
Guardrails are free and run first; scoring costs and runs last. Proportions are illustrative.
The same thrift applies across contexts. A page or app is read and profiled once, and that profile is reused by every context that asks about it. Each new run only pays for what the engine has not seen before — which is why a brand's second brief is faster and cheaper than its first. How we rebuilt our context engine explains the thinking behind that design.
The bidder buys only there
A group is not a suggestion. Once attached, it becomes the campaign's list of sites and apps, and the bidder treats that list as “only these”. A request from a site or app on the list can be bought; a request from anywhere else is not. A request that names no site or app at all cannot be on the list either, so it is not bought — the bidder never waves through what it cannot check.
One rule mattered enough to build on purpose. An empty group — attached before anything matched, or emptied by a weekly refresh — buys nothing, never everything. A target list that silently opens up is the worst failure a targeting tool can have, so the group page also warns when a group is empty.
The gate. In the group: bought. Not in the group, or unnamed: not bought. Empty group: nothing bought, with a warning on the page.
Two habits make this safe to operate. Attach a new group to a paused campaign first and look at what it would buy. And remember that every change to a group — a refresh, a pin, a removal — is pushed straight to every campaign using it, so the bidder never holds a stale list.
Problems we solved along the way
Each design choice answers a failure we saw in older tools or in our own first versions.
| Problem | What DeepContext does |
|---|---|
| Scoring a fixed “top sites” list, not what we can buy | Reads our own bid stream: every site and app the exchanges offer us, ranked by how often it appears |
| Paying again for pages already analysed | A page or app is read and profiled once, then reused by every context; each run only adds new inventory |
| Unclear yes/no verdicts | One fit score from 0 to 100, with the reason, keywords, topics and risk shown for every item |
| Unsafe content found after spend | Language, category, keyword and brand-safety exclusions applied before any scoring, with the reason shown |
| Crawling that gets blocked or ignores site rules | A crawler that says who it is, respects the rules sites publish for crawlers, and backs off from sites that refuse it |
| A market with no fitting supply | Says so plainly — “limited matching inventory” — and offers to broaden the brief, instead of buying the wrong places |
| Agencies seeing each other's clients | Every context, run, inventory and group is walled to the agency's own advertisers |
| A target list that silently opens up | An empty group buys nothing, never everything, and the group page warns about it |
What each side gets
| Who | What they get |
|---|---|
| Advertisers | Ads beside content that fits the brand, with the reason for every placement; no dependence on cookies or device IDs; safety rules applied before spend. |
| Agencies | A repeatable workflow from brief to campaign; their clients' work walled off from other agencies; a clear, shareable explanation for clients. |
| Ad ops | One place to brief, run, review, group and attach; groups that refresh themselves weekly; attach and detach from the group or the campaign. |
| People seeing the ads | Relevant ads without being tracked across sites and apps. |
A real run, and the most useful answer it gave
In one recent run for a consumer brand, in a market where the inventory we are offered is almost entirely apps of the wrong kind, the best fit score was low, a broadened brief still found no match, and the engine advised against stretching the brief to content that did not fit. The answer was “not here, not yet”.
That is the answer a good targeting tool should be willing to give. Instead of spending the budget on poorly fitting inventory, the team knew before launch that contextual targeting in that market needed new web supply first — and that is now the work.
What comes next
- Beyond our own exchanges. A group's sites and apps becoming placements on partner networks, with the context's keywords and categories becoming that network's content targeting, kept in sync as the group changes.
- More supply in thin markets. Adding web publishers where the bid stream is app-only, so a brief like the one above has something to buy.
- Results, once measured. We will publish how DeepContext's scores compare with human review, and what they do for campaign outcomes, when each has run long enough to be measured honestly — and not before.
A target list should say exactly what it will buy, and nothing else — including nothing at all when it has nothing to say. And the most valuable thing a targeting tool can tell you is sometimes “not here, not yet”, before the money moves rather than after.
See DeepContext on your own brief
The fit score is DeepContext's own 0-to-100 scale, not an industry measure. Every chart's proportions are illustrative, and no site, app, publisher, exchange, client or brand is named. The real run described above is anonymised on purpose: no market, category, figures or brief details are given. No accuracy or campaign-performance claims are made, because none have been measured yet; they will be published when they have. Product behaviour described here — the weekly refresh, the default minimum score, the warning on an empty group — is how DeepContext works today and may change. DeepContext uses no cookies and no device identifiers; this describes our own product and is not advice for yours.