AI Visibility Tracking Costs $250 a Month. Here's the Free Version.
Lettertrace is MIT-licensed, runs on your own API keys, and measures the same four numbers the paid tools do. The setup takes an afternoon.

On this page
Paid AI visibility tools start at around $250 a month. Profound, Evertune, Peec, Semrush One. They all do roughly the same job: ask a set of questions to a set of models, count how often you get named, and draw you a line.
That job is now available under an MIT licence.
Lettertrace (opens in a new tab) launched publicly this month. It is open source, self-hostable, and bring-your-own-key: you connect your own Anthropic, OpenAI, Google or Perplexity credentials, and the tool queries the models on your behalf. There is no markup, no seat price, and no vendor sitting between you and your own data. You pay the model providers what you would have paid them anyway, which for a solo founder running a couple of dozen prompts a week is a few pounds a month rather than a few hundred.
I want to be straight about the thing that makes this interesting, because it is not really the price.
What it actually measures
Lettertrace turns raw AI answers into four numbers, per topic, per model, over time:
- Visibility. How often you get named at all, as a proportion of answers.
- Share of voice. How often you win the answer versus each competitor you track.
- Prominence. Where in the answer you appear. First name mentioned is worth more than eleventh.
- Sentiment. Whether the answer speaks well of you, and whether it actively recommends you.
The detection does a deterministic, case-insensitive, word-boundary match on your brand name and aliases, recording occurrence count and first position. Only then does it make a second, structured model call to classify sentiment and recommendation for the entities that were actually found. A dumb matcher first, a smart classifier second. That ordering means your visibility number cannot be hallucinated into existence.

The setup
You need a Supabase project and Node 22. Budget an afternoon the first time.
Create a Supabase project
From Settings, API, take the project URL, the anon public key, and the service role key. Supabase is the database and the auth layer, and it lives outside the app, so it stays yours.
Apply the schema
Open the Supabase SQL editor and run supabase/schema.sql from the repo. It creates the tables, indexes, row-level security policies and the sign-up trigger. It is safe to re-run, which matters later when you upgrade.
Configure the environment
cp .env.example .env.local, then generate two secrets: openssl rand -base64 32 for ENCRYPTION_KEY, and openssl rand -hex 32 for CRON_SECRET.
Run it
nvm use to pick up Node 22 from .nvmrc, then npm install && npm run dev. Node 23 and above has an undici regression that intermittently drops provider connections mid-response, so this version pin is real rather than defensive.
Add a key and a brand
In Settings, add your Anthropic, OpenAI, Google or Perplexity key. It is verified on save and encrypted with AES-256-GCM before storage. Then add your brand name, its aliases, and your domain.
Add competitors, then topics
Competitors are who you are measured against. Topics are the subjects your buyers ask about. Click Generate variations and the tool writes the actual natural-language questions people put to assistants, rather than making you guess at them.
Run the monitor
Trigger the first run and let it finish. Keep it small: five prompts against one model is enough to tell you whether informativeRate is high enough for the rest of the report to mean anything.
If you would rather not touch Node at all, steps 1 and 2 still apply and step 4 collapses to one command:
docker run -p 3000:3000 --env-file .env ghcr.io/letterstory/lettertrace
The image is multi-arch, so Apple Silicon needs no --platform flag.
One warning. ENCRYPTION_KEY is what decrypts the provider keys stored in your database. Generate it once and keep it somewhere you will still have it in a year. Lose it or change it, and every stored key becomes unreadable and has to be re-entered.
How you read the numbers
Here is the bit I didn’t expect from a free tool, and the reason I would use this over a paid one even if the prices were reversed.
Model answers vary between identical calls. Ask the same question twice and you can get named once. This means a single query cannot tell the difference between "not mentioned" and "mentioned, unlucky". Most visibility dashboards quietly paper over this and hand you a percentage.
Lettertrace does not. It has a replicates setting, from 1 to 10, that asks each prompt several times per run and narrows the confidence interval accordingly. Token cost scales linearly with it, so this is an explicit trade you make rather than a default you inherit. And the run report carries brandMentionRateInterval alongside the raw numerator and denominator, with the documentation making the point plainly: a zero from one answer and a zero from thirty are not the same evidence.
That is a statistics-literate design decision sitting inside a free tool, and it is the difference between measuring something and generating a chart.
The report is meant to be read in a specific order, and the order is the useful part:
- quality.informativeRate. Did the answers name any company at all? If this is low, your prompts are the wrong shape and every number below it is meaningless. Check this first or you will spend a month optimising against noise.
- summary. Your brand mention rate, with its interval and its raw counts.
- citations. Did the models actually read your pages? This is the one that matters most if you are early.
- topics. The same, broken down by subject. This is the join between what you published and what surfaced.

Why citations is the number to watch first
Citation rate moves before mention rate does. A model can pull a paragraph off your site, use it to build an answer, and never say your name. That is invisible in a mention count and obvious in a citation count.
For a young site it is often the only signal available. If you launched three months ago and you are checking whether ChatGPT recommends you by name, you are reading the last indicator to move rather than the first. Watch whether your pages are being read, because that changes months before whether you are being named does.
There is a related feature I would use from day one. You can attach a target_url to any prompt, which maps a question to the page you wrote to answer it. The run report then gives you a per-URL cited-hit rate, which answers a genuinely useful question: when the query my page was built for gets asked, is my page the one the answer cites? That is closer to a real content KPI than anything analytics will give you right now.
Three more things
Grounding is verified, not assumed. If you use a single router key rather than one key per provider, Lettertrace runs a real forced web search per engine when you save the credential and records which ones actually returned sources. This is not paranoia. An ungrounded answer is not a cheaper version of a grounded one, it is a different measurement that looks identical in a chart. Probed against Concentrate on 30 July 2026: a forced tool choice returned two cited sources for "what is the capital of France?", a question the model can answer from memory, while the same request with the tool merely offered returned none. A router that permits searching but cannot be made to search will drift against a direct key.
It will tell you who you are actually competing with. The competitors discovered endpoint lists companies your own stored answers have already named that you are not tracking. That is evidence from runs you have already paid for, not a guess at a competitive set.
It speaks MCP. There is a Model Context Protocol server, so you can point Claude at your own share-of-voice data and ask about it conversationally rather than reading a dashboard.
One honest note on the hosted version: lettertrace.com runs the RB2B business-visitor identification pixel on its public marketing pages. It does not run on the authenticated app, and a self-hosted deployment with NEXT_PUBLIC_RB2B_KEY left unset ships zero third-party tracking. Worth knowing which one you are using.
What this doesn’t solve
Prompt quality. The repo says it directly: writing prompts that measure anything is the single biggest lever on whether a run is useful, bigger than model choice. A tool that runs the wrong twenty questions perfectly will produce a confident, stable, useless trend line.
So the first hour goes on the questions, not the config. Write down the five things a buyer would actually type before they had heard of you. Not "best CRM", which nobody asks. Something closer to "what should I use to track leads if I'm a one-person consultancy and I hate Salesforce". Specific, situational, phrased like a person. Then generate variations from those.
And know what you are buying with the effort. AI assistants send around 1% of referral traffic, so none of this will show up in analytics for a long time. What you are measuring is the shortlist, not the visit. That is a slower, quieter thing, and it is worth measuring precisely because nobody else on your side of the market is bothering.
Where to start
Set up the Supabase project and get one run finished against five prompts on one model. Do not add competitors, topics, schedules and four providers on day one. One run tells you whether informativeRate is high enough for anything else to mean something, and that is the only question worth answering first.
Then leave it alone for a month and let it build a line.
Sources and citable claims
Lettertrace is MIT-licensed and bring-your-own-key, so the only cost of tracking AI visibility with it is the model provider's own token charge.
Source: Lettertrace repository, The Letter Company (opens in a new tab)
A single query cannot distinguish "not mentioned" from "mentioned, unlucky", because model answers vary between identical calls. Lettertrace's replicates setting (1 to 10) asks each prompt several times per run to narrow the confidence interval, and token cost scales linearly with it.
Source: Lettertrace repository, The Letter Company (opens in a new tab)
Citation rate moves before mention rate does, which makes it the earliest available signal for a young brand.
Source: Lettertrace repository, The Letter Company (opens in a new tab)
Lettertrace verifies rather than assumes that a router credential carries the provider's native web search, by running a real forced search per engine when the key is saved. Probed against Concentrate on 30 July 2026, a forced tool_choice returned two cited sources for a question the model could answer from memory, while the same request with the tool merely offered returned none.
Source: Lettertrace repository, The Letter Company (opens in a new tab)
Know which conversation is worth joining next.
Romy scans the GTM landscape around your product, finds the useful people and conversations, and drafts the work in your voice for approval.


