An Assistant Surface Register for AI Visibility Sampling
Keep one row per surface you sample, and record everything that makes it a distinct product: the assistant, the surface (app, web or API), the plan or account tier, the model as shown or requested, whether web search was on or left to the model, signed-in and personalisation state, location, and the date each setting was last checked. 'ChatGPT' isn't one thing to measure. In OpenAI's API, web search is a tool you add to a request and the model then chooses whether to use it; in the ChatGPT app, OpenAI's release notes say the models on offer depend on your plan. When a setting changes, add a new row with a start date and close the old one. Results sampled under the old row stay attached to it rather than silently continuing the series.
Two people on the same team both 'checked ChatGPT' this morning and got different answers. One used the iOS app, signed in on a paid plan with memory on. The other called the API without a search tool. Neither did anything wrong. They sampled two different products and wrote down the same name.
The register
| Column | Example (illustrative) | Why it's a column |
|---|---|---|
| Surface id | S-03 | Results point at a surface, not a brand name |
| Assistant | Assistant B | The product family |
| Surface | Consumer web app, or API | Apps and APIs are configured differently |
| Plan or tier | Paid individual plan | Model availability can depend on plan |
| Model | As shown in the picker, or the API model id | Default models change |
| Web search | On, off, or left to the model | Changes what can be cited |
| Signed in, personalisation | Signed out; or signed in with memory off | Personalised answers aren't representative |
| Location | Country and city, VPN or not, API location field if set | Search results can be localised |
| Valid from / to | 2026-09-01 to open | Closes a row instead of editing it |
| Last verified | 2026-09-29 | Settings drift without anyone touching them |
The same register as a file header, with one illustrative row:
surface_id,assistant,surface,plan,model,web_search,signed_in,personalisation,location,api_location,valid_from,valid_to,last_verified,notes
S-03,Assistant B,web app,paid individual,as shown: <name>,model decides,no,n/a,IN-Bengaluru no VPN,,2026-09-01,,2026-09-29,illustrative rowWhy the API isn't a stand-in for the app
API sampling is cheaper to automate and far easier to store, which makes it the obvious choice for a script. It's still a different surface. OpenAI's and Anthropic's API documentation both describe web search as a tool the developer includes in the request, after which the model decides whether to search; Google's Gemini API turns on grounding with Google Search through a tool in the request as well. OpenAI and Anthropic both accept an approximate user location for search. So an API row carries settings the app never shows you, and the app carries account state the API doesn't have. Record both honestly, and if you only sample APIs, say so in the report's methodology note.
What changes under a row
Some changes happen without anyone editing the register. ChatGPT's release notes, for example, say GPT-5.6 Luna would become the default model for Free and Go users in the week of August 6, 2026, and on September 14, 2026 they announced the retirement of automatic switching from Instant to Thinking for Plus and Pro users. Either change alters what a signed-in row on those plans is sampling. That's what the last-verified column is for, and why the register belongs next to a dated log of platform changes.
Rules for editing it
Never edit a row that results already point to. Close it with an end date and open a new one. Results keep the surface id they were sampled under, so a chart can break the series at the change rather than joining two products into one line. It's the same discipline as versioning the prompt set, applied to the other half of the instrument.
FAQ
How many surfaces should we sample? — The ones your buyers actually use, and few enough that each gets enough runs. Four surfaces at three runs a prompt beats ten surfaces at one.
Should we sample signed out? — Usually, because it's the closest thing to a neutral default. If your buyers mostly use a signed-in work account, add that as its own row rather than mixing it into the signed-out one.
What if the app doesn't show the model? — Write 'not shown'. An honest unknown with a last-verified date is more useful than a guess, and it tells a reader exactly how much to trust the column.
Put this to work on your own website.
Fenn finds what your customers ask, drafts the articles and site fixes, and measures what ChatGPT, Claude, Gemini, Perplexity and Grok say about you — with every change waiting for your approval.