Pages that change by device do not say so
In the reportDynamically served pages lack the Vary: User-Agent header
dynamic_serving_missing_vary · Issue
This appears when a page's main content differs by device, so it is served dynamically, but the response does not include User-Agent in its Vary header. Google asks dynamically served pages to send Vary: User-Agent, and caches use it to keep the versions apart. Add it on those pages, or serve the same content to every device.
Severity: Low. Fix it when convenient; it is a small header, but without it a cache can hand phones the desktop page or the other way round.
Why it matters
Google describes dynamic serving as relying on user-agent detection and the Vary: user-agent response header. Caches store separate copies for each header named in Vary, so without it one version can be served to the wrong device.
What to do
- Look at the finding: it shows the start of each response's
Varyheader, up to 128 characters, and the content counts for each of the six responses. - Add
User-Agentto theVaryheader on routes that change by device, for exampleVary: Accept-Encoding, User-Agent. - If the page is meant to be the same everywhere, make it so, and the header is not needed.
What we read
We take up to the first 20 crawled pages that answered 200 with complete HTML at your site's exact address, and request each one six more times: twice as desktop Chrome, twice as Googlebot Smartphone and twice as Chrome on an Android phone, each agent's repeat at least five seconds after its first request, and all six within three minutes. A page is not compared when robots.txt blocks any of these requests, any answer is not 200 HTML or shows a bot-challenge page, or a redirect leaves the page's scheme, host or port.
The desktop version must have main content, and each version's two requests must differ by no more than 5% in their distinct words. A page then counts as served dynamically when its main content's distinct words differ between desktop and both phones, in both rounds, by more than 0.1 beyond the page's own variation between identical requests. It is reported when, in addition, neither the desktop nor the Googlebot Smartphone response lists User-Agent in Vary; Vary: * does not count.
Example & evidence
Illustrative example — one menu page served differently by device, not a live audit.
Address: https://bakery.example/menu/. Every response carries Vary: Accept-Encoding. Desktop Chrome gets:
<main><h1>Menu</h1><p>Sourdough loaf, rye bread, croissant, pain au chocolat, cinnamon roll, carrot cake, lemon tart, seasonal fruit galette.</p></main>Both phones get:
<main><h1>Menu</h1><p>Tap to order: bread, pastries, cakes.</p></main>The main content differs by device and Vary does not name User-Agent, so the page is reported.
A possible correction: send Vary: Accept-Encoding, User-Agent with these responses.
Confirm & check again
Check for yourself: look at the Vary response header in your browser's developer tools, on a page whose content changes between phone and desktop.
Check again: Full audit — re-read this address with a fresh set of six requests under the same conditions. The finding closes when the desktop or Googlebot response lists User-Agent in Vary, or the content no longer differs by device, and only while desktop has main content and each version's two requests stay within 5% of each other. It cannot conclude otherwise, or when any request is blocked, fails or shows a challenge, or when the header changes between identical requests.
Limits & sources
The check infers dynamic serving from the main content's words, so differences only in markup, scripts or headers are not counted. It does not show that any cache stored the wrong version, and it does not check the Android browser's Vary header.
Confidence: Medium because dynamic serving is inferred from a content comparison, not declared by the site.
Sources
- Google, Mobile site and mobile-first indexing best practices — says dynamic serving relies on user-agent detection and the
Vary: user-agentresponse header. Checked 25 September 2026. - MDN, Vary header — says a
Varyheader makes caches store responses separately for the headers it lists. Checked 25 September 2026.
Editorial review: 29 September 2026