Discoverability
Measure AI search referrals and citations for your docs
Track AI citations, assistant referrals, and the reader actions that follow as separate numbers, with a dated baseline you compare every month.
By Hayden Bleasel7 min read

You can see part of it, but no single report adds it up. Citations, referrals, and what readers do next are separate numbers from separate tools. Bing Webmaster Tools counts how often Copilot and Bing's AI answers cite your pages. Your analytics shows readers who clicked through from an assistant, and ChatGPT tags its links with utm_source=chatgpt.com. Google counts clicks from AI Overviews and AI Mode inside Search Console's ordinary Web totals, with no separate AI number. None of them proves anyone adopted your product.
By the end, your Blume site sends page views and a few chosen reader actions to Google Analytics 4, your docs domain is verified in both search consoles, and you have a worksheet with a dated baseline to compare each month against.
Blume's part is small: an analytics adapter, the events it already sends, and the verification tags. The rest happens in each tool. This guide uses GA4 because its channel rules already recognize AI assistants, but any adapter from the analytics docs works if you swap the event call. If you only want a traffic trend, GA4's Traffic acquisition report answers that on its own. Nothing here measures how often an assistant mentions you without a link.
Citations, clicks, and activation are different numbers
| Measure | What it tells you | Where to read it | What it can't tell you |
|---|---|---|---|
| Citations | An AI answer listed your page as a source | Bing Webmaster Tools, AI Performance report | Whether anyone clicked |
| Search clicks | Readers clicked your page in Google Search, AI Overviews and AI Mode included | Search Console, Performance report, Web | Which of those clicks came from an AI feature |
| Assistant referrals | A reader clicked through from an assistant | GA4, by session source | Visits that arrive with no referrer and no tag |
| Activation | The reader then did something you care about | GA4 key events and Blume's events | Whether they went on to use the product |
Keep them in separate columns. A page that is cited often and clicked rarely may have answered the question in place, which is a different finding from a page that gets clicks and no follow-up.
Decide which reader actions count
A visit from an assistant tells you a reader arrived. Pick one or two actions that mean the page did its job. Blume already sends some of them as analytics events:
feedback, withhelpfulset to"yes"or"no", from the rating at the end of every docs page. It's on by default.search_select, when a reader searches and opens a result.ask_answer, when the assistant finishes an answer, if you've turned it on.
For product docs, the strongest signal is usually a click into the product itself: a sign-up, a dashboard, an API keys page. Blume doesn't send that one, so add it with a script() adapter. This config also sets the site URL and the two verification tags you'll need later:
import { defineConfig } from "blume";
import { googleAnalytics, script } from "blume/analytics";
// Send an app_click event when a reader follows a link into the Acme app.
const appClicks = `
(function () {
if (window.acmeAppClicks) return;
window.acmeAppClicks = true;
document.addEventListener("click", function (event) {
var link = event.target instanceof Element ? event.target.closest("a[href]") : null;
if (!link || link.origin !== "https://app.acme.example") return;
if (typeof window.gtag === "function") {
window.gtag("event", "app_click", { link_url: link.href });
}
});
})();
`;
export default defineConfig({
deployment: { site: "https://docs.acme.example" },
seo: {
metatags: {
"google-site-verification": "abc123",
"msvalidate.01": "def456",
},
},
analytics: [
googleAnalytics({ id: "G-XXXXXXXXXX" }),
script({ content: appClicks }),
],
});Change https://app.acme.example to your product's origin, and replace the measurement ID and both tokens with your own. Analytics loads in production builds only, so deploy before you look for events. With consent set, both tags wait until the reader allows analytics.
Then tell GA4 what to count:
- In Admin, under Data display, click Events. Once
app_clickappears under Recent events, click the star next to it to mark it as a key event. - In Admin, under Data display, open Custom definitions, click Create custom dimensions, and add one named
helpfulwith the Event scope and the event parameterhelpful. That splitsfeedbackinto yes and no.
Read the referral URLs you actually get
Before you trust a report, look at one real referral. Ask ChatGPT a question your docs answer. If it cites one of your pages, click the link and read the address bar:
https://docs.acme.example/quickstart?utm_source=chatgpt.comOpenAI adds utm_source=chatgpt.com to referral links from ChatGPT, so GA4 records the session source as chatgpt.com even when the browser sends no referrer. Other assistants may send a referrer, a tag, or nothing. Try the ones your readers use and write down what you see.
In GA4, open Reports, then Acquisition, then Traffic acquisition. Switch the table's dimension to Session source and search for each assistant's hostname, like chatgpt.com, perplexity.ai, gemini.google.com, copilot.microsoft.com, and claude.ai. Keep the ones that return rows. While app_click is your only key event, the table's Key events column is your activation count for each source.
GA4's default channel group also has an AI Assistant channel, for sessions whose referrer matches Google's list of AI assistants. Google's examples are ChatGPT, Gemini, DeepSeek, Copilot, and Grok. Its Organic Search channel includes clicks from AI Overviews and AI Mode, so clicks from Google's own AI features land there, not under AI Assistant.
Every AI visit is one of three kinds: tagged, referred, or neither. The third lands in Direct with nothing to say where it came from. Record the first two, and don't try to estimate the third.
Compare Google and Bing reports
Add your docs domain in Google Search Console and Bing Webmaster Tools, choose the HTML meta tag method, and put each tool's token in seo.metatags as the config above does. In Search Console, the meta tag works for a URL-prefix property; a Domain property needs a DNS record instead. Then submit https://docs.acme.example/sitemap.xml in both. Blume writes the sitemap on every build once deployment.site is set.
Search Console
Google reports AI Overviews and AI Mode inside the Performance report's Web search type, together with the rest of Search. A click on a link in either counts as a click, and every link in an AI Overview shares that overview's single position. Google documents no filter for AI features, so treat the Web totals as all of Google Search, AI included. The Pages tab gives you clicks per page.
Bing Webmaster Tools
The AI Performance report, in public preview, counts citations across Microsoft Copilot, AI-generated summaries in Bing, and select partner integrations. It shows total citations, average cited pages per day, the grounding queries behind them, and citations per page, plus newer previews of intents, topics, citation share, and a compare view. Bing says the grounding queries are a sample of overall citation activity, and that the counts reflect how often pages are cited, not ranking or placement. None of its numbers are clicks.
Line them up by page
Put citations from Bing, clicks from Search Console, and AI-referred sessions and key events from GA4 side by side for each page. Read the pairs, not the totals:
- Cited often, few referrals. The answer may have been enough. That isn't a failure to fix.
- Referrals, no actions. The page may not deliver what the answer promised. Read it as someone arriving from that answer would.
- Actions rising. Still not adoption. That shows up in your product's own data, like new API keys that make a first request.
Keep a dated baseline
These numbers only mean something next to earlier ones taken the same way. Once a month, read every tool over the same range (the previous calendar month) and add a row per number to one file:
date,range,source,measure,scope,value,notes
2026-10-01,2026-09-01 to 2026-09-30,Bing AI Performance,Total citations,site,,
2026-10-01,2026-09-01 to 2026-09-30,Bing AI Performance,Average cited pages,site,,
2026-10-01,2026-09-01 to 2026-09-30,Bing AI Performance,Citations,/quickstart,,
2026-10-01,2026-09-01 to 2026-09-30,Search Console Web,Clicks,site,,includes AI Overviews and AI Mode
2026-10-01,2026-09-01 to 2026-09-30,Search Console Web,Clicks,/quickstart,,
2026-10-01,2026-09-01 to 2026-09-30,GA4,Sessions,Session source chatgpt.com,,
2026-10-01,2026-09-01 to 2026-09-30,GA4,Sessions,AI Assistant channel,,
2026-10-01,2026-09-01 to 2026-09-30,GA4,Key events (app_click),Session source chatgpt.com,,
2026-10-01,2026-09-01 to 2026-09-30,GA4,feedback helpful=yes,site,,
2026-09-18,,Change,Rewrote the quickstart,/quickstart,,shipped to productionThe dates are examples; use the day you read the numbers. Add a row per page you care about, and a row per assistant hostname you found. Log your own changes as dated rows too, like the rewritten quickstart above, so a jump has a likely cause.
Log the tools' changes as well. Bing's report is a preview, and GA4 matches the AI Assistant channel against its own list of assistants, so a number can move with nothing changing on your site. Never compare a partial month with a full one.
Troubleshooting
GA4 shows no events from the docs
Blume adds analytics to production builds only, so pages from blume dev send nothing. Check that the deployed page's <head> has the gtag scripts. With consent set, nothing loads until a reader allows analytics, so every count covers consenting readers only, and the page rating is hidden from everyone else.
ChatGPT sessions are missing from the AI Assistant channel
GA4 assigns that channel from the referrer, while ChatGPT's tag sets the session source. A tagged session that arrives without a referrer can land in another channel. Count by Session source, and use the channel as a cross-check.
The helpful dimension is empty
GA4 makes a new custom dimension available 24 to 48 hours after it's created and events carrying the parameter have arrived. Rate a page on the live site yourself, then check again two days later.
Bing's AI Performance report is empty
Check that the site is verified and the sitemap was read. The report only counts citations that happened, so an empty range can mean Bing's AI answers cited none of your pages, not that setup failed. Blume's robots.txt allows every crawler, so if Bingbot still can't fetch your pages, look at your host's or CDN's bot rules, as checking AI crawler access covers.
Agent reads never show up
Agents that read your llms.txt, a page's Markdown, or your MCP server never run the analytics script, so no client-side tool counts them. Only your host's request logs see those reads.
Search Console shows no clicks for a page
To appear as a supporting link in AI Overviews or AI Mode, a page must be indexed and eligible to show with a snippet, the same as a regular result. If it isn't indexed, work through pages that are not indexed first.
Next step
Take your first baseline
Ship the analytics config, verify both search consoles, and fill the worksheet once a full month of data is in, before you change anything else.
Read the analytics docsA step here not working for you? Report a broken step.