Skip to content
Fenn

All posts

An Assistant Surface Register for AI Visibility Sampling

5 min readAEOMeasurementReference

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

ColumnExample (illustrative)Why it's a column
Surface idS-03Results point at a surface, not a brand name
AssistantAssistant BThe product family
SurfaceConsumer web app, or APIApps and APIs are configured differently
Plan or tierPaid individual planModel availability can depend on plan
ModelAs shown in the picker, or the API model idDefault models change
Web searchOn, off, or left to the modelChanges what can be cited
Signed in, personalisationSigned out; or signed in with memory offPersonalised answers aren't representative
LocationCountry and city, VPN or not, API location field if setSearch results can be localised
Valid from / to2026-09-01 to openCloses a row instead of editing it
Last verified2026-09-29Settings 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 row

Why 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.