More and more buying research starts with a question to an AI assistant instead of a list of blue links: "best CRM for a small business", "easiest invoicing tool for freelancers", "Notion alternatives for a 10-person team". The assistant answers with a short list of names. If your product isn't on that list, that buyer may never see you.
This post covers three things: why this is worth tracking, how to check it by hand in about an hour, and how to automate the check once a spreadsheet stops being enough. The example data is from a real test run on October 26, 2026.
Why AI answers are worth tracking
A few numbers, each from its original source:
- ChatGPT reach. OpenAI says more than 1.2 billion people use ChatGPT each week (OpenAI, October 7, 2026).
- Fewer clicks when an AI summary appears. Pew Research Center looked at the browsing data of 900 U.S. adults. When a Google search showed an AI summary, users clicked a traditional result in 8% of visits, compared with 15% when there was no summary. They clicked a link inside the summary in just 1% of visits (Pew Research Center, July 2025). That study covers Google's AI summaries, not ChatGPT, and it shows a correlation, not cause and effect. Still, the pattern is clear: when the answer is on the page, fewer people click through to compare.
- Analysts expected the shift. In 2024 Gartner predicted that traditional search engine volume would drop 25% by 2026 as AI chatbots and virtual agents take over queries (Gartner press release, February 19, 2024). That was a forecast, not a measurement, but it explains why marketing teams started paying attention.
The practical takeaway is simple. For the questions your buyers ask, you want to know three things:
- Are you mentioned at all?
- Where do you appear (first pick, or fourth in the "also consider" list)?
- Which sources does the assistant cite? Your own site, a review site, or a competitor's comparison page?
The third one matters more than it seems. Citations show you which pages the assistant actually trusts for your category, and those pages are where your content and PR effort will pay off.
The manual way (about an hour)
You don't need any tooling for a first look.
1. Write 10–20 buyer prompts. Use the words a buyer would use, not your brand name. Mix in:
- category questions: "best CRM for small business"
- use-case questions: "easiest CRM for a 5-person sales team"
- alternative questions: "cheaper alternatives to Salesforce"
Keep your own brand out of most prompts. If you ask "is HubSpot good?" the answer will mention HubSpot, and that tells you nothing about organic visibility.
2. Ask each engine. Use ChatGPT and Perplexity in a private window or a fresh chat, so your history and memory don't steer the answer. Turn web search on if it isn't automatic.
3. Log the answer in a spreadsheet, one row per prompt and engine:
| Prompt | Engine | We're mentioned? | Our position | Competitors mentioned | Our site cited? | Cited domains |
|---|
4. Repeat it a few days later. This is the step people skip, and it's the important one. AI answers are not stable. In one of our own tests, we sent the same 6 prompts to Perplexity twice on the same day and compared the answers. Across the brands we tracked, 4 mentions disappeared and 2 new ones showed up between the two runs. One answer is an anecdote. You need a sample, repeated over time.
A small helper for the "position" column
Reading 40 answers and counting who came first gets old fast. If you paste answer text into a file, this short function finds which tracked brands are mentioned and in what order. It removes links first, so a cited URL like hubspot.com/pricing doesn't count as a mention:
import re
def brand_ranks(answer, brands):
"""brands: {"HubSpot": ["HubSpot", "HubSpot CRM"], ...} -> {brand: rank or None}"""
text = re.sub(r"\[[^\]]*\]\([^)]*\)|https?://\S+", " ", answer) # drop markdown links and bare URLs
first = {}
for brand, names in brands.items():
hits = [m.start() for n in names
for m in re.finditer(rf"(?<!\w){re.escape(n)}(?!\w)", text, re.I)]
if hits:
first[brand] = min(hits)
order = sorted(first, key=first.get)
return {b: (order.index(b) + 1 if b in first else None) for b in brands}
print(brand_ranks(answer, {
"HubSpot": ["HubSpot", "HubSpot CRM"],
"Pipedrive": ["Pipedrive"],
"Zoho CRM": ["Zoho CRM", "Zoho"],
"Salesforce": ["Salesforce"],
}))
# {'HubSpot': 2, 'Pipedrive': 1, 'Zoho CRM': None, 'Salesforce': None}
That output is from a real ChatGPT answer to "easiest CRM for a 5-person sales team". The answer did recommend Bigin, which is a Zoho product, but it never said "Zoho". The lesson: list product names as aliases, not just the company name. Otherwise you'll undercount.
Where the manual approach breaks down
It works for a first look. It gets painful when you want:
- more than a couple dozen prompts, or several markets
- both engines, every week, with the same settings each time
- the cited URLs, not just the answer text
- share of voice, meaning how often you're mentioned compared with each competitor across all prompts
- a diff against last week: which prompts you gained, lost or moved on
That is the point where it makes sense to script it or use a hosted tool.
Automating it with the AI Visibility Tracker
Disclosure: we (SteadyScrape) built the tool below and get paid when it's used.
We packaged this workflow into an Apify Actor: AI Visibility & Share of Voice Tracker (steady-scrape/ai-brand-visibility-tracker). For every prompt × engine it:
- asks the engine through its official API with live web search (no browser automation, no scraping of chatgpt.com)
- records, for your brand and each competitor: mentioned or not, mention count, rank, list position, a simple sentiment hint and the surrounding text
- saves every cited URL and domain, and flags whether your own domain was cited
- computes share of voice and visibility rate, overall and per engine
- compares the run with your previous run if you give it a
trackingId, so a weekly schedule becomes a tracker
An honest caveat first. The answers come from the developer APIs, not the consumer apps. The chatgpt engine uses an OpenAI model (by default gpt-6-luna, the model family OpenAI says powers ChatGPT's Free and Go tiers) with OpenAI's own web search, called through OpenRouter or OpenAI's API. The perplexity engine uses Perplexity's Agent API with web search. The apps add their own system prompts, personalization, memory and location, so a logged-in user can see a different answer. Treat the results as a repeatable, comparable sample, not a screenshot of what any one person sees.
Example input
This is the input from our real test run (2 prompts × 2 engines = 4 checks). maxChecks and maxCostUsd are safety caps:
{
"prompts": [
"best CRM for small business",
"easiest CRM for a 5-person sales team"
],
"brands": [
{ "name": "HubSpot", "aliases": ["HubSpot CRM"], "domains": ["hubspot.com"] }
],
"competitors": [
{ "name": "Salesforce", "domains": ["salesforce.com"] },
{ "name": "Zoho CRM", "aliases": ["Zoho"], "domains": ["zoho.com"] },
{ "name": "Pipedrive", "domains": ["pipedrive.com"] },
{ "name": "Freshsales", "domains": ["freshworks.com"] }
],
"engines": ["chatgpt", "perplexity"],
"trackingId": "real-pricing-check",
"maxChecks": 4,
"maxCostUsd": 0.3
}
(HubSpot and friends are just an example category here. We have no connection to any of them.)
Example output (real run, trimmed)
All 4 checks succeeded in about 12 seconds. The interesting part is the second prompt, where the two engines disagreed. Here's the ChatGPT row, trimmed:
{
"prompt": "easiest CRM for a 5-person sales team",
"engine": "chatgpt",
"model": "openai/gpt-6-luna",
"answerSnippet": "**My pick: Pipedrive Lite** if you want a straightforward, sales-focused CRM your reps can learn quickly. ...",
"brandMentioned": true,
"bestBrandRank": 2,
"brandDomainCited": true,
"competitorsMentioned": ["Pipedrive"],
"citedDomains": ["pipedrive.com", "zoho.com", "hubspot.com"],
"brands": [
{ "brand": "HubSpot", "mentioned": true, "rank": 2, "listPosition": 2, "sentiment": "neutral", "domainCited": true },
{ "brand": "Pipedrive", "mentioned": true, "rank": 1, "listPosition": null, "sentiment": "neutral", "domainCited": true },
{ "brand": "Zoho CRM", "mentioned": false, "rank": null, "domainCited": true }
],
"searchCalls": 2,
"charged": true,
"chargeEvent": "chatgpt-check"
}
And the Perplexity row for the same prompt:
{
"prompt": "easiest CRM for a 5-person sales team",
"engine": "perplexity",
"answerSnippet": "**Pipedrive** is my pick for a five-person sales team: its visual deal pipeline is easy to understand ...",
"brandMentioned": false,
"bestBrandRank": null,
"brandDomainCited": false,
"competitorsMentioned": ["Pipedrive"],
"citedDomains": ["capterra.com", "lessannoyingcrm.com"],
"charged": true,
"chargeEvent": "perplexity-check"
}
Same question, two engines: ChatGPT put HubSpot second and cited hubspot.com, while Perplexity didn't mention it at all. Perplexity built its answer from a Capterra review page and a smaller competitor's pricing page. That's exactly the kind of gap you'd want to know about, and it's invisible if you only check one engine.
The run also writes a summary row with share of voice across all 4 checks (trimmed):
{
"recordType": "summary",
"checksSucceeded": 4,
"chargedUsd": 0.18,
"shareOfVoice": [
{ "brand": "Pipedrive", "shareOfVoice": 0.3889, "visibilityRate": 1.0, "avgRank": 2, "citationRate": 0.5 },
{ "brand": "HubSpot", "shareOfVoice": 0.3333, "visibilityRate": 0.75, "avgRank": 1.33, "citationRate": 0.75 },
{ "brand": "Zoho CRM", "shareOfVoice": 0.2222, "visibilityRate": 0.5, "avgRank": 2, "citationRate": 0.75 },
{ "brand": "Freshsales","shareOfVoice": 0.0556, "visibilityRate": 0.25, "avgRank": 4, "citationRate": 0 },
{ "brand": "Salesforce","shareOfVoice": 0, "visibilityRate": 0, "avgRank": null, "citationRate": 0.25 }
],
"topCitedDomains": [
{ "domain": "hubspot.com", "checksCiting": 3 },
{ "domain": "zoho.com", "checksCiting": 3 },
{ "domain": "pipedrive.com", "checksCiting": 2 }
]
}
Two prompts is far too small a sample to conclude anything about these brands. It's here to show the format. Salesforce is a good example of why the citation column matters: it was never mentioned, but one answer still cited a salesforce.com page.
Running it from code
Any Apify Actor can be called over the Apify API. This runs the tracker and returns the dataset rows in one request:
curl -X POST \
"https://api.apify.com/v2/acts/steady-scrape~ai-brand-visibility-tracker/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d @input.json
For a tracker, save the input as an Apify Task and put it on a weekly schedule. Keep the same trackingId and each run's summary includes a changes block against the previous run.
Pricing
It's pay per event, and you only pay for checks that return an answer:
| Event | Price |
|---|---|
| ChatGPT check (one prompt answered by ChatGPT and analyzed) | $0.06 |
| Perplexity check (one prompt answered by Perplexity and analyzed) | $0.03 |
| Actor start | $0.00005 per run (Apify's standard fee) |
Some examples:
- The test run above (2 prompts × 2 engines) costs $0.18.
- 10 prompts on both engines cost $0.90 per run, so a weekly schedule comes to about $3.90 a month.
- Failed, skipped and mock-mode checks are never charged. Set
"mockMode": trueto see the full output format for free before you spend anything. - Your Max charge per run setting is respected: the Actor only plans the checks that fit under it.
Wrapping up
Start by hand. Ten unbranded buyer prompts, two engines, one spreadsheet, and a second pass a few days later will tell you a lot about where you stand. Pay particular attention to the cited domains: they show you which review sites and comparison pages the assistants lean on for your category.
Once you want dozens of prompts, both engines, citations and week-over-week changes, automate it. You can write your own script, or use the AI Visibility Tracker if your time is worth more than $0.03–$0.06 a check.
Have you seen your brand show up (or vanish) in AI answers? We'd like to hear which prompts surprised you. Please share them in the comments.
Top comments (0)