A contextual ad is chosen by what surrounds it, not by who is looking at it. When an ad slot loads inside a word puzzle app, the system reads signals about that moment: the app’s category, the language of the content, the device, and the country. It picks an ad that fits those signals. It does not consult a stored profile of the person holding the phone.
That single distinction draws the line between the 2 main approaches in mobile advertising:
- Contextual targeting reads the placement. The question it answers is “where is this ad showing, and what is around it right now?”
- Behavioral targeting reads the person. The question it answers is “what has this user done before, across apps and sessions, and what does that predict?”
Behavioral targeting needs a stable identifier to tie those past actions together: on iOS that was the IDFA, on Android the GAID. Contextual targeting needs none of that. The match happens from data about the content and the request, which is present whether or not a user has agreed to tracking.
A concrete example
Picture a free racing game in Germany. A player opens it on an iPhone, and an interstitial slot becomes available between levels. The bid request that goes out to buyers carries fields like app category (Games), keywords pulled from the app’s store listing and content, device type (mobile, iOS), language (de), and a coarse geo (Germany). A buyer running a campaign for a new racing title can match on those fields alone. The creative shown lines up with the context: a racing ad inside a racing game, in German, on the right device.
No part of that decision required knowing the player’s age, past purchases, or which apps they used yesterday. The relevance comes from the surroundings, not from a history.
Behavioral targeting would approach the same slot differently. It would look up the device ID, pull what that ID has done, a user who installed 3 racing games last month and spent in 1 of them, and bid based on that pattern. When the signal is available, it can be more precise. The cost is that it depends on the user having an ID that buyers can read, and on that ID being shared across the apps in question.
Contextual is not a watered-down version of behavioral. It answers a different question. A racing ad placed next to racing content can perform well because intent is visible in the moment: someone playing a racing game is, right then, interested in racing. The signal is current rather than historical.
The sections that follow show which fields carry these signals in a real bid request, why contextual moved from a fallback to a primary method after the ID changes of 2021 onward, and where it fits against behavioral targeting in a working UA stack.
How contextual targeting works under the hood
The match runs inside an auction that finishes in under 100 milliseconds. When an ad slot loads, the publisher’s SSP packages what it knows about the placement into a bid request and sends it to demand partners. Most of mobile programmatic runs on the OpenRTB spec from the IAB, so the fields in that request are standardized. Buyers read them, decide whether their campaign fits, and return a price. The whole exchange happens before the interstitial or banner finishes loading.
Contextual targeting works because the request already carries enough about the placement to make a decision without a user ID. Here are the signals that matter most and where they live in the request.
The fields that carry context
- App category. In OpenRTB this is the app.cat field, populated with IAB content taxonomy codes (for example IAB9-30 for video and computer games). A buyer can filter to game categories and skip everything else.
- Content keywords. The app.keywords and app.content.keywords fields hold terms pulled from the store listing, the app name, and sometimes the screen’s content. A racing game might carry “racing”, “cars”, “drift”, “multiplayer”.
- Device type and OS. The device object reports make, model, OS, and OS version. A campaign that only has an iOS creative filters on device.os = iOS; a low-end Android campaign can filter on model.
- Language. The device.language field (and sometimes content.language) gives an ISO code like de or tr. This decides whether a German creative or an English one gets served.
- Geo. The device.geo object reports country, and often region and a coarse lat/long. Without consent, this is usually limited to country and region level rather than precise coordinates.
- Connection and carrier. The device.connectiontype field separates Wi-Fi from cellular. A campaign with a 30 MB playable might only bid on Wi-Fi to avoid wasting installs on users who abandon the download.
None of these fields require the IDFA or GAID. They describe the placement and the device, not a stored history of the person. That is the structural reason contextual survives consent loss: the data it reads is present in the request whether or not the user opted into tracking.
How a match gets made
Take a campaign for a new racing title. The buyer sets up targeting on the DSP: category in games, keywords include “racing” or “cars”, OS is iOS, geo is Germany, language is German. When the bid request for the racing game slot arrives, the DSP checks each rule against the fields:
- app.cat contains a games code. Pass.
- app.keywords contains “racing”. Pass.
- device.os is iOS. Pass.
- device.geo.country is DEU. Pass.
- device.language is de. Pass.
All rules pass, so the DSP returns a bid with the German racing creative attached. The SSP runs its auction across all the bids it got back, picks the winner by price, and the creative renders. The decision used 5 fields and zero identity data.
The same machinery handles a no-match cleanly. If the request came from a finance app in France with French as the language, the keyword rule and the geo rule both fail, so the racing campaign does not bid. The slot goes to whichever campaign does match. This is why contextual reach is wide: any buyer whose rules fit the placement can compete, including for impressions where the user declined tracking.
Keyword quality decides relevance
The weakest part of contextual is keyword data, and it varies by source. Store-listing keywords are reliable but coarse, they describe the whole app, not the current screen. Some SSPs add page- or screen-level content signals through SDKs that read what is on display, which sharpens the match but adds integration work. A puzzle app whose store listing says “brain games” and “logic” gives a buyer something to target; an app that passes only a category code and no keywords gives much less.
Buyers handle this by combining signals rather than relying on one. Category plus language plus geo already narrows a campaign to a usable audience. Keywords add precision on top. The estimated effect is that a campaign matching on category, geo, and language reaches a broad set of placements, while adding keyword rules trims that set to the most relevant slots at the cost of volume.
What the request does not carry
Under contextual, the request does not include a device ID a buyer can use to look up past behavior, a list of other apps installed, or a frequency history tied to the person. It carries the moment and the surroundings. If a buyer needs to know that this device installed 3 racing games last month, contextual cannot tell them. That limit is the subject of the behavioral comparison later. For the auction itself, the fields above are enough to place a relevant ad and return a price in the time it takes the slot to load.
Why contextual got bigger after IDFA changes
For most of the last decade, behavioral targeting was the default in mobile. Buyers read a device ID, looked up what that ID had done, and bid on the pattern. That model assumed the ID was there to read. In 2021 that assumption stopped holding.
What ATT changed on iOS
Apple released App Tracking Transparency with iOS 14.5 in April 2021. From that point, an app has to show a prompt before it can access the IDFA, and the user has to tap “Allow.” If they decline, the IDFA returns a string of zeros, and the device is effectively unaddressable for cross-app tracking.
The opt-in rate landed lower than most buyers expected. Measurement firms that track the prompt have reported app opt-in rates clustering in the 20 to 30 percent range, with Adjust and AppsFlyer figures over 2021 to 2022 putting the average near 25 percent for many app categories. That means for roughly 3 out of 4 iOS users, there is no IDFA to read. A targeting method that depends on that ID loses most of its audience on iOS before the auction even starts.
The effect was not even across the stack. Behavioral retargeting, which needs an ID to recognize a returning user, took the hardest hit. Campaigns that relied on building lookalike audiences from past behavior lost the raw material those models ran on.
What is happening on Android
Android kept the GAID addressable for longer, so the pressure there has been slower but moving in the same direction. Google added a setting in Android 12 that lets users reset the advertising ID to zeros, similar to the iOS opt-out. Google’s Privacy Sandbox for Android, announced in 2022, is the larger shift: it replaces cross-app identifiers with on-device APIs like Topics and Protected Audience, which expose interest categories rather than a stable per-device ID. The timeline has moved more than once, but the direction is set. Buyers should not plan on a durable cross-app ID on Android either.
Why contextual was the signal left standing
Contextual targeting reads the placement, not the person, so none of these changes touch it. The fields that carry context, app category, content keywords, language, device type, and coarse geo, sit in the bid request whether or not the user granted tracking consent. A racing game in Germany sends the same app.cat and language fields to buyers regardless of how that player answered the ATT prompt. The match still works.
That property turned contextual from a fallback into a primary method. Before 2021 it was often the thing you fell back on when an ID was missing. After ATT, the missing ID became the common case rather than the exception, so the method that did not need an ID moved to the front.
The shift shows up in spend. The IAB and other industry trackers reported rising contextual budgets through 2021 and 2022 as buyers redirected money away from ID-dependent tactics. The exact figures vary by source, so treat any single percentage as estimated, but the direction is consistent across reports: contextual share went up as addressable inventory went down.
There is a second reason it held up. A contextual signal reads intent in the moment. Someone playing a racing game right now is interested in racing right now, and that signal does not depend on a consent prompt or a stored history. When the ID disappeared, the current signal stayed readable, and buyers leaned on it.
Contextual vs behavioral targeting: the tradeoffs
Neither method is strictly better. They trade the same 3 things against each other: privacy exposure, reach, and precision. Where a campaign lands on those axes decides which one to run.
Where contextual wins
Privacy and consent. Contextual reads the placement, so it works without an opt-in. On iOS, that matters because the App Tracking Transparency prompt is the gate for reading the IDFA, and opt-in rates have sat near 25 percent across consumer apps since ATT launched (AppsFlyer and Adjust both reported figures in that range through 2022 to 2023). Behavioral targeting can only address the consenting minority. Contextual addresses every impression.
Reach. Because the bid request carries app category, keywords, language, and geo whether or not the user agreed to tracking, contextual buyers can bid on the full inventory pool. Behavioral buyers bid on the slice that carries a readable ID, which on iOS is roughly 1 in 4 impressions. That gap in addressable volume is the single largest practical difference between the 2 approaches today.
No identity infrastructure. Contextual needs no ID graph, no cross-app linking, and no profile store. The match is computed from fields already in the request, so there is less to maintain and less regulatory surface under GDPR and similar rules.
Where behavioral wins
Retargeting. If you want to reach a user who installed your app, churned, and never came back, you need to identify that specific device again. Contextual cannot do this. It has no memory of who saw the ad before. Re-engagement campaigns, lapsed-payer winbacks, and frequency capping across apps all depend on a stable identifier.
Predicting value from history. Behavioral targeting can favor a device that installed 3 games in a genre and spent in 1 of them. That pattern predicts a higher chance of another paid install. Contextual sees only the current placement, so it cannot separate a likely spender from a likely non-spender inside the same app. When the goal is return on ad spend rather than raw installs, that historical signal carries real weight.
Lookalike modeling. Building an audience that resembles your existing payers requires profiles to model against. Without IDs, the model has nothing to learn from at the user level.
The cases that favor each
Run contextual when:
- You are acquiring new users at scale and intent is visible in the moment, such as a racing ad inside a racing game.
- Your inventory is mostly iOS, where opt-in rates limit behavioral reach.
- You operate in markets with strict consent enforcement and want to reduce compliance risk.
Run behavioral when:
- You are retargeting known users or capping frequency across apps.
- You optimize toward downstream revenue and need historical purchase signals.
- Your traffic is Android with readable GAIDs, or iOS users who opted in.
Most UA teams do not pick one. They run behavioral where IDs exist and consent is granted, and they fall back to contextual for the larger share of impressions that arrive without an identifier. The signal you have available at auction time, more than any preference, sets which method can bid.
Where contextual fits in a UA stack
Contextual placements don’t replace rewarded and offerwall inventory. They run beside them, filling slots that those formats don’t cover. A typical mobile UA mix has 3 layers, and each answers a different need.
- Rewarded video and offerwall. The user opts into an exchange: watch an ad or complete an action, get currency or an item back. Engagement is high because the user chose it. These slots carry their own context, the app category and the reward type, so contextual signals apply here too.
- Interstitial and banner. These load between levels or at the edges of the screen without an explicit opt-in. Contextual targeting does most of the work here, since many of these impressions arrive without a usable device ID.
- Contextual display across the open exchange. Standard programmatic inventory matched on app category, keywords, language, and geo, the fields covered earlier.
The point of running them together: rewarded and offerwall give you measured user intent, while contextual interstitials give you reach into the same audiences when no ID is present. On iOS, where ATT opt-in sits near 25 percent by most public estimates, the no-ID portion of your inventory is the majority. Contextual is what addresses it.
What you can measure without device IDs
Losing the IDFA does not mean losing measurement. It means changing what you count and how.
- SKAdNetwork and AdAttributionKit. Apple’s frameworks report installs and a coarse conversion value back to the ad network without exposing the user. You get aggregate counts per campaign, not per-person paths.
- Aggregate and geo-level lift. Hold out a region or a placement, compare install and spend curves against a matched group, and read the difference. This works without any user identifier.
- Placement-level metrics. Fill rate, win rate, eCPM, and viewability all attach to the slot, not the person. They tell you whether a contextual buy is reaching the inventory you wanted at the price you set.
- In-app event modeling. Where you have first-party consent, your own SDK still logs purchases and retention. You tie those to campaigns through aggregated and modeled attribution rather than a shared cross-app ID.
Setup decisions that affect performance
A few choices at configuration time move results more than creative does.
- Category and keyword targeting width. Narrow targeting raises relevance and lowers reach. Start wider than you think, read which app categories convert, then tighten. A racing campaign that only buys IAB game codes may miss puzzle and casual apps where racing fans also sit.
- Floor prices and bid pacing. Contextual inventory clears at lower CPMs than ID-based retargeting in many cases, so a floor set for behavioral buys can starve a contextual line of volume.
- Conversion value mapping. SKAdNetwork gives you a limited set of values. Decide early whether they encode an early action (registration) or a revenue band. You can’t easily change this mid-flight without losing comparability.
- Creative tied to context. The match is only as good as the creative behind it. A racing ad in a racing app earns its placement; a generic creative wastes it.
Treat contextual as the layer that keeps spending efficient when the ID is missing, measured through aggregate frameworks and placement signals, and tuned through targeting width and floors rather than user lookups.















