You get the same ad ten times in one evening. That campaign almost certainly had a frequency cap set well below ten. A cap counts an identifier, and you keep arriving as a different identifier.
In the bidder a cap is a lookup. A request comes in, the bidder reads a counter for this person and decides whether to bid. For that number to mean anything, the request has to carry something that points at the same person as yesterday, and the impression from an hour ago has to be in the count already. Both of those fail often enough to explain the ten.
Start with the identifier. A bid request can carry a person in four ways, and any of them can be missing. The exchange’s own ID for you (user.id), usually taken from its cookie, which it may rotate under its own privacy policy. Your own ID, mapped for you by the exchange (user.buyeruid), which exists only where a cookie sync ran first. The advertising ID from the phone or TV operating system (device.ifa), which anyone can reset from settings, and which arrives as a string of zeros on iOS when the user declines tracking. And IDs from third party graphs like RampID, ID5 or UID2 (user.eids), which arrive encrypted and encoded for one specific buyer, readable only with an agreement and the keys.
Those graph IDs carry a note saying how the match was made. Some come from an email login. Some come from a cookie sync. One of the values means the match was inferred from IP address and user agent, so the ID is a guess about who this is. A cap counts against a guessed ID the same way it counts against a real one.
When none of them arrive, what is left is the IP address and the user agent string (device.ip, device.ua). An IP is rarely one person. A home router puts the whole family behind one address. Mobile operators run carrier grade NAT, where thousands of subscribers share a single public address. The address does not hold still either: a home lease runs from a day to a week and can change when it renews or the router restarts. The user agent stopped separating people too, because every Chrome on Android now reports the same made up device.
Then there is the delay. The counter moves when the impression is booked as spend, which happens after the ad renders, and rendering can wait. A video prefetched during a game level plays when the level ends. An ad stitched into a podcast sits in the file until someone reaches that minute. On the web that gap is short. On formats that get cached or stitched into a stream it runs far longer. Everything you bid in that window is decided on the old count.
A frequency cap is worth no more than the identifier it hangs on. The harder it gets to recognise a person, the more of the same ad that person potentially sees.




