# Personalization and A/B tests: what AI agents see

> AI agents see your default page as a stranger from a data center; here is how tests, personalization, geo-pricing and caching can mislead them.

By Ghost Agent Lab · Readability · https://ghostagentlab.com/articles/personalization-ab-tests-ai-agents/

## Key takeaways

- An AI agent sees your default page with no cookies, no sign-in and a data center's location, then reports that version to the shopper.
- Vary layout and copy as much as you like, but keep price, stock, delivery and returns the same for every visitor to a URL.
- Client-side tests can hide the whole page while they load and add content agents never see, so keep the control content in the HTML.
- Serving automated visitors a different or stripped-down page means agents describe a store people never see, and search engines may treat it as cloaking.
- This week, list every live test and personalization rule and mark the ones that change price, stock, delivery or returns.

An AI agent shopping for someone doesn't see the page that person would see. It has no cookies, no history, no sign-in, and it visits from a data center. This guide explains how A/B tests, personalization, location-based pricing, bot-specific pages and caching can give agents a different version of your store, and how to keep the facts the same for everyone.

## The agent isn't the customer

Personalization assumes it knows who is visiting. With an AI agent, most of what it would normally use is missing or wrong:

- **No cookies or history.** Assistant fetchers often make a fresh request each time. The shopper's past orders, loyalty tier and saved currency are invisible.
- **No sign-in.** Member prices and account-only offers stay hidden. See [login walls and gated content](https://ghostagentlab.com/articles/login-walls-ai-agents/).
- **The wrong location.** The request comes from the assistant's servers, often in another country. Search crawlers are similar: Google says Googlebot's default addresses appear to be in the USA and it sends no Accept-Language header, so it [may not see every locale version](https://developers.google.com/search/docs/specialty/international/locale-adaptive-pages) of an adaptive page. See [geo-blocking and AI agents](https://ghostagentlab.com/articles/geo-blocking-ai-agents/).
- **Often no JavaScript.** Many fetchers read the HTML your server sends. Anything changed or added by script afterwards, they don't see.

So the agent sees your default page, from somewhere else, as a stranger. Then it tells the shopper what it saw. If your default page differs from what that shopper would see in a browser, the shopper gets the wrong answer, and doesn't know it.

**What the shopper would see:**

- ✓ Signed in, member price $42
- ✓ Prices in Canadian dollars
- ✓ Test variant B: "Free returns" badge

**What the agent sees:**

- ✗ No sign-in, public price $48
- ✗ Prices in US dollars, from a US data center
- ✗ Control variant, or a blank page while the test loads

**Two visitors, one URL.** The agent reports its version to a shopper who would have seen another.

## Where versions split

Five common practices can each produce a version of a page that agents see and people don't, or the other way round.

- **A/B and multivariate tests:** Different headlines, prices, badges or layouts per visitor
- **Personalization:** Recommendations, offers and content based on history or segment
- ! **Location-based pricing:** Currency, price, range or shipping changed by IP address
- ✗ **Bot-specific pages:** A stripped-down or different page served to anything that looks automated
- **Cache variations:** One visitor's version stored and served to the next

**Five ways a page forks.** Each can show an agent something the shopper won't see.

Most of this is harmless. A test of button color or a "recommended for you" carousel doesn't change what an assistant should tell a shopper. The trouble starts when the variation touches facts: price, stock, delivery, returns or what the product is.

## Vary the presentation, not the facts

The simplest rule: anything an assistant might quote should be the same for every visitor to that URL, or the page should say plainly that it varies.

| Safe to vary | Keep the same for every visitor |
| --- | --- |
| Layout, colors, images, button wording | Product name, specs and what's included |
| Order of products in a carousel | The listed price and currency for that URL |
| Marketing copy and headlines | Stock status |
| Recommendations | Delivery costs, times and return terms |

When a fact really does differ by visitor, make that visible:

- **Member or trade prices:** show the public price to everyone, and say that members pay less, so the agent can tell the shopper.
- **Country pricing:** give each country its own URL and serve that country's prices to anyone who opens it. Our guide to [international sites](https://ghostagentlab.com/articles/international-sites-ai-agents/) covers how.
- **Price tests:** if you test prices at all, check with your legal and pricing teams first. An assistant may quote whichever price it happened to get to many shoppers at once.

Keep your structured data in step with the variant the page shows. Product data that says $48 on a page that shows $42 is exactly the kind of conflict that makes an assistant hedge. See [prices AI agents can read](https://ghostagentlab.com/articles/machine-readable-prices/).

## Tests that hide content

Client-side testing tools change the page in the browser after it loads. Two side effects matter for agents.

**Content that only exists in a variant.** If variant B adds a size guide or a delivery promise with JavaScript, agents that read the HTML never see it. If it wins and you leave it in the testing tool rather than building it into the page, it stays invisible to them for good.

**Pages hidden while the test loads.** To avoid a flash of the original version, some testing setups hide the page until the test script has run, with a time limit. A slow or blocked script means a blank page for that long. A browser agent that reads the page early may find nothing there.

1. **Page arrives:** Product content is in the HTML
2. ✗ **Page hidden:** A snippet hides it until the test script runs
3. ✗ **Script slow or blocked:** The page stays blank until the time limit
4. **Variant applied:** Content finally shown, and changed

**Flicker protection has a cost.** Anyone who reads the page during the wait sees nothing.

What helps:

- Run tests on the server where you can, so every visitor gets a complete page in the HTML.
- Keep the control version's content in the HTML. Let the test change it, not create it.
- If you use page hiding, keep the time limit short, and hide only the part of the page under test.
- When a test ends, build the winner into the page and remove the test. Google's [A/B testing guidance](https://developers.google.com/search/docs/crawling-indexing/website-testing) says the same: run experiments only as long as necessary, use 302 rather than 301 for test redirects, and use rel="canonical" on variant URLs.

For more on content that needs JavaScript, see [why AI agents can't see your JavaScript-only content](https://ghostagentlab.com/articles/javascript-content-ai-agents/).

## Bot-specific pages and cloaking

Some sites serve automated visitors a different page on purpose: a lighter version to save load, a page with prices removed to deter scrapers, or extra text written for crawlers. Each one means agents describe a store that people never see.

Google's [spam policies](https://developers.google.com/search/docs/essentials/spam-policies) call it cloaking when sites show different content to users and search engines to manipulate rankings and mislead users, and its testing guidance says showing one set of URLs to Googlebot and another to people counts as cloaking even during a test. AI companies set their own rules, but the safe course is the same: give agents the same content people get. Serving a pre-rendered copy of the same page is generally fine; serving different facts is not.

> **Watch for accidental versions:** Bot protection sometimes returns a stripped placeholder page with a 200 status instead of blocking outright. Nobody chose to cloak, but agents still get a different page. See [bot protection and CAPTCHAs](https://ghostagentlab.com/articles/bot-protection-ai-agents/).

### When the cache serves the wrong version

If a page varies by country, currency or cookie, your CDN has to know, or it may store one visitor's version and serve it to the next. The HTTP [`Vary` header](https://www.rfc-editor.org/rfc/rfc9110.html#name-vary) tells caches which parts of the request changed the response. Many CDNs use their own cache key settings instead. Either way, the result to avoid is an agent from one country getting a page cached for another, with the wrong currency and delivery terms. Giving each country its own URL removes most of this risk. See [setting up your CDN for AI agents](https://ghostagentlab.com/articles/cdn-settings-ai-agents/).

## What AgentScore checks

AgentScore can't see your tests or segments, but two checks catch their most common side effects:

- **"Bot protection lets AI agents through"** fetches your home page as a browser and as several AI agents. If an agent gets less than half the visible text a browser gets, it warns that agents are receiving much less content. That's the usual sign of a bot-specific or placeholder page.
- **"Content loads without JavaScript"** compares the text in your home page's HTML with the text after it renders in a browser. If less than 70% is in the HTML, it warns or fails. Content added by a testing tool or a personalization script shows up here.

Scans come from our own servers, so content that varies by country may look different elsewhere. To compare what an agent sees with what your customers see, read [what an AI agent sees when it visits your store](https://ghostagentlab.com/blog/what-an-ai-agent-sees/).

## A short checklist

- ✓ Price, stock, delivery and returns are the same for every visitor to a URL
- ✓ Member and trade prices are mentioned on the public page
- ✓ Each country has its own URL and serves its own prices to anyone
- ✓ Tests change content in the HTML rather than create it
- ✓ Winning variants are built into the page and the test removed
- ✗ Automated visitors get a different or stripped-down page

**One set of facts.** Tick the first five; avoid the last.

1. List every test and personalization rule that's live, and mark any that change price, stock, delivery, returns or product details.
2. Open a key product page in a private window from a VPN in another country, and compare it with what your customers see.
3. Fetch the same page with `curl` and check that the product, price and stock are in the HTML.
4. Ask your testing tool owner how long pages can stay hidden while a test loads.
5. Run [AgentScore](https://ghostagentlab.com/agentscore/) and look at the bot protection and JavaScript results.

## Sources and further reading

- [Minimize A/B testing impact in Google Search](https://developers.google.com/search/docs/crawling-indexing/website-testing) (Google Search Central)
- [Spam policies for Google web search (cloaking)](https://developers.google.com/search/docs/essentials/spam-policies) (Google Search Central)
- [How Google crawls locale-adaptive pages](https://developers.google.com/search/docs/specialty/international/locale-adaptive-pages) (Google Search Central)
- [RFC 9110: HTTP Semantics, section 12.5.5 Vary](https://www.rfc-editor.org/rfc/rfc9110.html#name-vary) (IETF)
