How Advo works, in technical detail.
For the person who has to sign off: what the card is, how it gets onto the page, how claims are checked, how results are measured and credited, and what happens to data.
The card is a small block of plain HTML.
The Verified Facts card sits inside the article as semantic HTML. Everything a person sees on it is real text in the markup, so it’s the same for a reader, a screen reader and a crawler.
How it renders
<aside aria-label="Advertisement: Northwind CRM">
<p>Ad · Northwind CRM</p>
<ul>
<li>Native two-way sync with Gmail and Outlook
<a href="https://northwindcrm.example/docs/email-sync" rel="sponsored">Source</a></li>
<li>SOC 2 Type II audited
<a href="https://northwindcrm.example/trust" rel="sponsored">Source</a></li>
<li>Free plan for up to 3 users
<a href="https://northwindcrm.example/pricing" rel="sponsored">Source</a></li>
</ul>
<p>Verified by Advo ·
<time datetime="2026-09-22">Sep 22, 2026</time> ·
<a href="https://runadvo.com/standard">Why am I seeing this?</a></p>
</aside>What to notice
- The label is text.
- “Ad” and the advertiser’s name are in the HTML, not in an image or a CSS pseudo-element, so they survive crawlers, screen readers and copy and paste.
- Source links go straight to the source.
- No redirect, no tracking parameters. They’re marked
rel="sponsored"because they sit in a paid unit. They don’t carrynoreferrer, so the advertiser can see which site sent the visit. - The same card for every request.
- Every request for the page gets exactly the same card, and anyone can confirm it with Symmetry Check.
- No script tags, no pixels, no cookies.
- The card is inert HTML.
- Structured data only mirrors.
- If a page includes structured data for the card, it repeats exactly what’s visible. Nothing is added for machines only.
- Styled to fit, never hidden.
- Publishers can match their own fonts and colors. The label, the border and the “Why am I seeing this?” link stay.
Why the card is rendered on the server
When an AI crawler fetches a page, it typically reads the HTML the server sends and moves on. Most AI crawlers don’t run JavaScript: in Vercel’s analysis of AI crawler traffic, none of the major crawlers from OpenAI, Anthropic, Perplexity, Meta or ByteDance rendered it (Vercel, December 2024). Anything a script adds after the page loads, including display ads, sponsored widgets and most affiliate modules, isn’t in what they read.
There are two ways to get a sponsored unit in front of crawlers. One is to detect crawlers and serve them a special version of the page. That’s cloaking, and it’s what search and AI engines penalize. Google’s spam policies define cloaking as presenting different content to users and search engines (Google Search Central, updated August 2026), and in August 2026 Perplexity warned that publishers using “deceptive advertising like markdown ads” risk a downgrade in its search index (Digiday, August 11, 2026). The other is to put the unit in the HTML everyone gets. Advo only does the second.
Serve crawlers a special version
CloakingThe server checks who is asking, then decides what to send.
AI crawler gets
AdSponsored unit
Person gets
No sponsored unit
Put it in the HTML everyone gets
What Advo doesOne response, whoever is asking.
AI crawler gets
AdSponsored unit
Person gets
AdSponsored unit
Server rendering has side benefits too. The card needs no JavaScript in the reader’s browser, it works with page caching, and it’s there for screen readers and text-only browsers.
Three install paths, one output
All three put the same card into the page’s HTML before it’s sent, and all three include free AI crawler analytics. We set up whichever fits your stack with you.
WordPress plugin
- Renders the card on your server as the page is built, at the position you choose in the article.
- You choose which categories, sections or post types can carry cards.
- Works with page caching. The card is part of the cached HTML, the same for everyone.
React / Next.js
- A React Server Component. It renders the card into your HTML on the server, so nothing is added to your client bundle.
- Works with static generation and incremental regeneration.
HTML API (any CMS or stack)
- Returns ready-to-embed HTML for the page, plus the same content as data for your own templates.
- Render the HTML on your server. Any structured data you build from it must never add anything the HTML doesn’t show.
- The response is the same whoever calls it. It doesn’t vary by user agent.
How claims are verified
Nothing runs until it passes. Every claim goes through the same checks before launch, and again every week while it’s live.
- 1
Submitted
Claim plus a public source
- 2
Verified
Source public, resolves, supports the claim
- 3
Live
Rendered on the agreed pages
- 4
Weekly re-check
Checked against its source every week
Fails a check: the advertiser gets the reason and a suggested rewrite. Nothing runs.
Source breaks or changes: the card pauses on every page. Paused days aren’t billed.
| Check | Passes | Fails |
|---|---|---|
| CheckThe source is public | PassesLoads without a login, paywall or form | FailsGated PDFs, customer portals, sales decks |
| CheckThe source resolves | PassesReturns the page over HTTPS | FailsErrors, redirects to an unrelated page, parked domains |
| CheckThe source supports the claim as written | PassesThe claim’s specifics (numbers, names, plan limits, certifications) appear on the source | FailsA claim that goes further than its source, or relies on an old version of the page |
| CheckThe claim is factual | PassesSpecific and checkable | FailsSlogans, vague quality claims (“enterprise-grade”), forward-looking claims (“coming soon”) |
| CheckThe claim follows the rules | PassesWithin the claims policy | FailsSuperlatives or competitor comparisons without a named, current third-party source; any health claim; any financial-performance claim |
A person reviews every claim before it first runs.
Rejections come with a rewrite. If a claim fails, the advertiser gets the reason and a suggested version that would pass. Example: “The #1 CRM for startups” fails (superlative, no third-party source). Suggested rewrite: “Free plan for up to 3 users,” sourced to the pricing page.
Weekly re-verification. Every live claim is re-checked against its source every week, and we keep a record of what the source said and when.
Auto-pause. If a source breaks (errors, moves behind a login, disappears) or changes so it no longer supports the claim, the card pauses automatically on every page and we tell the advertiser what changed. They can fix the source, edit the claim (which is verified again) or drop it. Paused days aren’t billed.
How placements are matched and approved
Topic clusters
A publisher’s pages are grouped into topic clusters: sets of related pages, such as all the CRM reviews, “best CRM” guides and CRM comparisons on one site. A placement is one advertiser’s card on one cluster for one month.
Matching
We propose clusters to advertisers based on how closely the topic fits their category. Price is set by the cluster’s AI crawl volume and topic fit.
Agreed pages
Before a placement starts, the advertiser sees the list of pages in the cluster. Those are the agreed pages that liveness and the Live Guarantee are measured against.
Publisher approval
The publisher approves every advertiser before anything runs and can block categories or specific companies in advance. Publishers can remove a card from any page at any time.
One card per page
A page never carries more than one Advo card.
How we measure
Three measures, each with a published method. If you can’t inspect it, we don’t report it.
Crawl confirmations
- What’s counted
- A fetch of an agreed page by a major AI engine’s crawler, while the card was live on it.
- The rule
- The user agent is read to count, never to change the response. The HTML is the same whether or not a request is counted.
- Spoofed user agents
- Anyone can send a fake user agent. Reports say which counts rest on the crawler’s own self-identification.
- Reported as
- Fetches by crawler, by page and by day, with the weekly trend.
- What it proves
- That a crawler fetched the page with your card on it. It doesn’t prove the engine used it. That’s what answer checks are for.
Answer checks
- Engines
- ChatGPT, Perplexity, Claude and Gemini.
- Prompts
- A fixed panel of buyer-style prompts, built with the advertiser before launch to reflect how real buyers ask about their category and product. The panel stays the same week to week so results are comparable. Prompts can be added. They’re never quietly swapped.
- Cadence
- Weekly, with identical wording each time, plus at least one baseline run before the card goes live.
- How they’re run
- Each prompt runs in a clean session, with no history or personalization carried over. Answers a signed-in user sees in an app can differ, and every report says so.
- Surfaced
- Means the answer states at least one of the card’s facts in substance, not necessarily word for word.
- Accurate
- Means nothing the answer says about the product contradicts the verified claims or their sources. Any error is quoted in the report, whether or not it came from the card.
- Cited
- Means the answer lists or links a page carrying the card as a source.
- Raw answers attached
- Every result links to the full answer text, the sources it listed, the engine, and the date and time it ran.
- Limits
- AI answers vary from run to run. A weekly panel is a sample, not a census, so read trends across weeks rather than any single result.
Human engagement
- Impressions
- Pages served with the card to readers, not to crawlers or bots. It counts pages served, not viewability.
- Clicks
- Counted when a reader follows a source link, with no JavaScript and no cookies. The link itself still goes straight to the source. Some browsers don’t report these clicks, so click counts are a floor, not an exact figure.
How the Live Guarantee works
Advertisers aren’t billed for any day their card isn’t live on the agreed pages, or any day a major AI engine is blocking or excluding the host pages. The major engines are OpenAI (ChatGPT), Perplexity, Anthropic (Claude) and Google (Gemini).
Live Guarantee logOne placement, 22 agreed pages · September
Illustrative- Live, billed. Card live on the agreed pages, the same for readers and AI crawlers.
- Sep 9, credited. The advertiser’s pricing page changed, so the card paused. Evidence: the pause notice.
- Sep 17, credited. A robots.txt rule blocked one engine from 3 of 22 agreed pages. Evidence: the rule.
The daily live check
Every day we check each agreed page and confirm the card is there, the same for readers and AI crawlers. A page that fails the check, or a card that’s paused or removed, counts as not live for that day.
What counts as blocked or excluded
A host page counts as blocked or excluded by an engine on any day that (a) the publisher’s robots.txt blocks that engine’s crawlers from the page, or (b) the engine has said publicly, or told us, that it blocks or excludes the page, the site, or Advo placements.
How credits are calculated
Credits are calculated per day, at the placement’s daily rate.
How credits are shown
Every credit appears in the monthly report with the date, the pages, the reason and the evidence: the failed check, the pause notice or the robots.txt rule.
The publisher side
Publishers are paid on billed days, so credited days aren’t paid out. That keeps both sides pointed at the same goal: cards live, pages readable.
What we collect, and what we don’t
- The card collects nothing from readers. It sets no cookies, runs no JavaScript and makes no request to Advo when a page loads.
- No reader personal data. We don’t collect names, emails, device IDs or browsing histories, and we don’t fingerprint.
- Crawl counts are aggregate. They record which crawler fetched which page, and when. No IP addresses are stored.
- Impressions and clicks are aggregate counts per card, page and day.
- Answer checks involve only Advo’s own queries to AI engines. No user data goes into them.
- Who sees what: a publisher’s site-wide crawler analytics are private to that publisher. Advertisers see crawl confirmations only for the pages carrying their card.
- We don’t sell data. There’s no reader data to sell, and we don’t sell publisher or advertiser data either.
Don’t take our word for it.
Paste any URL into Symmetry Check. It shows whether the major AI crawlers are served the same page a normal browser gets, and whether robots.txt lets each one in.
thestackreview.example/best-crm-for-startups
Illustrative- Chrome (browser)Identical
- GPTBotIdentical
- OAI-SearchBotIdentical
- ClaudeBotIdentical
- PerplexityBotIdentical
Have a technical question we didn’t answer?
Book 30 minutes and bring your developer. We’ll go through the integration for your stack, the verification pipeline and the measurement method in as much depth as you want.