Ad Verification 101: How Brands Check Their Ads Actually Ran
Digital advertising has a trust problem with a number attached to it: industry estimates put wasted ad spend — fraud, misplacement, non-viewable impressions — in the tens of billions annually. Every brand paying for campaigns faces the same question eventually: did my ad actually appear, where it was supposed to, looking the way it was supposed to?
Most advertisers never check. The ones who do use a technique called ad verification — and the core of it is a geographic problem disguised as an analytics problem.
Why You Can't Just... Look
Here's the catch that surprises everyone: you cannot see your own ads reliably.
Geo-targeted campaigns only serve to users in the target region. If your team is in Shanghai checking a campaign aimed at Brazil, the ad simply doesn't exist for you. Search ads vary by user location and query. Programmatic placements rotate. Retargeting logic shows different creatives to different people.
The result: the advertiser — the person paying — is structurally the least able to observe their own campaign. Every "it looks fine from here" is a statement about your vantage point, not the campaign's reality.
What Ad Verification Actually Is
Verification means loading pages, searches, and apps as a user in the target market would and recording what appears. Concretely:
- Search ads: run the campaign's target queries from the target country, capture the sponsored results, compare against what was bought
- Display and programmatic: load placements on target-market sites, screenshot the ad units, verify creative, position, and viewability
- Competitive monitoring: same fetches, but cataloging competitor ads to detect ad-hijacking (affiliates bidding on your brand terms and stealing the clicks you paid to earn)
The technical requirement is the same in every case: requests that exit from a residential IP in the target market, so the ad server makes the same serve/no-serve decision it makes for a real local user.
The IP Layer Is Where It's Won or Lost
Ad platforms are the most aggressive geo-checkers on the internet — geo-targeting is their core product, so they verify IP location rigorously. A verification crawler from a datacenter IP gets one of two bad outcomes: either it's flagged as a bot and served nothing (false negative — you report your ad didn't run when it did), or it's geo-redirected to a default market (false positive — you record the wrong creative).
Residential IPs solve both: the request looks like a local user on a local ISP, and the ad server serves it exactly what it would serve anyone else in that market.
import requests
# Verify a search campaign in three target markets
CAMPAIGN = {"queries": ["best running shoes", "running shoes sale"],
"markets": ["us", "uk", "de"],
"expected_creative": "spring-sale-banner-v3"}
def check_query(query: str, market: str):
user = f"{PROXY_USER}-country-{market}"
proxies = {"https": f"http://{user}:{PASS}@gate.thordata.com:9000"}
r = requests.get(
"https://www.google.com/search",
params={"q": query, "gl": market},
headers=HEADERS, proxies=proxies, timeout=30,
)
return extract_sponsored(r.text) # titles, urls, position
for market in CAMPAIGN["markets"]:
for q in CAMPAIGN["queries"]:
ads = check_query(q, market)
log(market, q, ads) # expected creative present? competitors bidding?
The Four Findings That Pay for the Program
Running verification across markets surfaces four recurring findings, in rough order of frequency:
1. Ads not serving in markets you're paying for. Budget pacing, bid floors, or approval issues silently zero out a region. Weeks can pass before anyone notices in aggregate numbers — or no one notices, and the "underperforming market" narrative becomes conventional wisdom.
2. Ad hijacking. Affiliates or resellers bidding on your brand keywords, so clicks you intended for organic results (or cheaper branded campaigns) go to someone paying for the privilege. Verification queries on your own brand terms make this visible immediately.
3. Creative mismatches. The localized creative never shipped, the fallback English version is serving in Germany, or an old promo ended but the creative didn't. Each is invisible in the ad platform's reporting, which reports what was configured, not what rendered.
4. Competitor encroachment. New entrants appearing on your category terms, market by market, earlier in the rotation than aggregate share-of-voice reports would reveal.
Building a Small Verification Loop
The minimum viable version: a daily job per market that runs your top queries, captures sponsored results, diffs against expectations, and alerts on change. Storage is one table — (market, query, timestamp, observed_ads_json). The alerting that matters: expected creative missing, new competitor domain appearing, or sponsored count dropping to zero.
Scale the loop with your spend. Traffic-wise this is a light workload — a few hundred light search pages per day, well under a GB of residential proxy traffic. At $0.65/GB (Thordata's rotating rate, which I use for this exact workload), verifying five markets daily costs cents. Compare that to one week of undetected ad hijacking on a brand campaign. (Trial traffic for new accounts covers the pilot; thor020 takes 10% off paid plans.)
The Honest Caveat
Verification from residential IPs tells you what a user in that market would see. For viewability metrics and MRC-compliant measurement you'll eventually want a measurement vendor — that's a compliance layer, not a replacement for the basic "is my ad even there" check that most brands skip entirely.
Start with the dumb question. The dumb question, asked from the right country, is worth more than the sophisticated report nobody verifies.
Disclosure: my verification crawlers run on Thordata's geo-targeted residential proxies (190+ countries, city-level targeting, rotating from $0.65/GB). The patterns work with any equivalent provider.








