BlogProduct
The rival names on your report were never typed in, until you could pin them
Every rival name on a Lantad report is still extracted from the answer text, through screens we built after shipping two pieces of output that should never have passed. Since 2026-08-07 you can also pin competitors to a roster, which reverses a position this post originally presented as a design choice, so the post now narrates that change instead of quietly absorbing it.
The two halves live in different places, and conflating them would be the first false claim available here. What AI says about you asks one open-weight model two questions about your brand, once from memory with no web access and once after being handed the crawler-visible text of your page. It has no competitor dimension at all. Prompt tracking is the surface that produces rival names, and it produces them by reading them out of the answers rather than by checking a list you supplied. Both sit inside the same wider job, generative engine optimization, but only one of them ever prints a name that is not yours.
This post is about that second surface. Specifically: how a rival's name gets onto a report, every screen that stands between a model and that name, the two occasions we shipped output that should never have passed, one a name and one a question, and the ceiling we wrote down about our own coverage before anyone else could find it.
In short
- Lantad's prompt tracking form still has no competitor input, and every rival name on a report is extracted from the answer text rather than checked against a list you supplied. Since 2026-08-07 paid accounts can additionally pin a competitor roster, a reversal this post records rather than absorbs: pinning changes persistence and alerting only, and a pinned rival no answer names shows as never named in this window, a measured absence rather than missing data.
- Lantad's rival-name extractor keeps at most eight names per answer and discards any sequence longer than three words, both precision rules with no incident behind them; the separate rule that strips ordinary capitalised words is the one the source dates to a customer's report that once published "Below, Feel, Clarify Who You" as their competitors.
- Lantad's share figure is a share of the names those answers produced, and the report states in body copy that it is not market share, not revenue share and not audience share.
- Lantad's own monthly counter on the grounded Gemini engine is 4,500 calls, set 500 below Google's 5,000-call free tier, while Lantad's free traffic alone would ask 15,000 a month, 3.3 times that counter, so at ceiling the engine reports as budget_stopped rather than quietly measuring one engine fewer.
- Lantad never queries the ChatGPT, Claude, Perplexity or Gemini consumer apps: its seven answer engines are APIs and open-weight models. Reports name the engine at vendor level and say plainly that each one is the vendor's API rather than their chat app.
Everything the run is given
- A URL
- An email address, or the signed-in session that already proved that address
- A human check, on anonymous submissions only
- No competitor field on the form or in the handler; the account's pinned roster (added 2026-08-07) labels results and alerts, and never feeds a run
What the report produces
- Questions derived from the page's own crawler-visible text
- Whether each engine's answer named you
- The other brand names those same answers produced
- A share of the names produced, with its denominator printed beside it
What one run actually reports
A run takes one URL and one email. From the page's crawler-visible text it derives candidate questions, screens them, scores each by how much of the answer the page itself can ground, discards everything under the floor, and puts the survivors to the answer engines. Four numbers come back, and every one of them carries a basis string that names its exact denominator. That string is body copy printed next to the number, not a tooltip and not debug output.
Visibility is how many answers named you over how many answers came back, where one answer is one question put to one engine. Share of names produced is your name count over the total of every brand name those same answers produced. Citations counts the source hosts a citation-capable engine handed back, how many of those were your own domain, and how many were opaque redirects that hide the publisher. Sentiment changed on 2026-08-07, and this post dates the change rather than absorbing it: on a paid run it is now one batched model classification call, graded per answer, and on a free run or whenever that call fails it falls back to a fixed word list applied to the sentence that mentions you, labelled as the word list wherever the number is shown. The first three cost no model call, being aggregations over fields the run already persisted; sentiment is the one that books a call, so it is the one metric whose addition moved the spend ledger, by exactly one classification call per paid run, which is why the engine budget carries a sentiment line.
Seven engines sit in the registry. The Workers AI open-weight chain runs with retrieval set to none, meaning no web access at all; Cloudflare's Workers AI model catalogue is where those models come from. Gemini runs with Google Search grounding and returns citations. Perplexity, ChatGPT and Claude are the citation-capable paid rows, each called with its web search tool; DeepSeek and Grok run as plain chat engines with no web access, measuring training-data presence.
On 10 August 2026 the labelling rule changed, and since this post argued the old one at length it should say so plainly rather than quietly read differently. Reports used to name each engine by the exact model version and retrieval mode called, so the OpenAI row carried a model number and a search suffix instead of the word ChatGPT. The argument was that writing ChatGPT would claim to have observed a product we never called. That argument is still correct and the practice was still wrong, for a reason the argument did not weigh: a reader looking at four version strings cannot tell how many vendors they are looking at, and a version implies the number depends on a model choice it does not depend on. Versions moved to the admin surface, where they inform a cost or capability decision. Customer-facing surfaces name the vendor.
What the label used to carry, a sentence now carries, and it is the same commitment: we call APIs and open-weight models. We do not query the assistant products people use at their own keyboards, and no number on this report should be read as though we did. That disclosure travels with every engine list on the site, which is a better home for it than a version string most readers decoded as noise.
Breadth is what a plan buys. A free run is 5 prompts and zero paid engines, which is not zero engines: the Workers AI chain still answers every prompt with a real answer. Grounded Gemini moved to the paid plans in August 2026, because its scarcity is calls rather than dollars and free traffic alone could exhaust the whole platform allowance mid-month. Starter tracks 100 prompts a week, 10 per page across your ten most active pages, on three paid engines. Pro tracks 150 the same way on all five paid engines, the entire paid registry, and Business and Retainer track 250, re-sampled twice a week since August 2026 (a Monday and a Thursday pass) instead of once. What each plan costs is on the pricing page. So "covers every major engine" is a claim this product cannot make and does not make, and the report says which engines answered on every single run rather than leaving you to assume.
One scoping statement, because the query that brings people here usually means something bigger. This is narrower than an AI brand monitoring platform. Those platforms monitor consumer assistant output against a configured competitor list, and Profound states on its own site that it captures AI answers from the front-end browser experiences real users see rather than from APIs. Lantad does no front-end capture of any kind and has no region or language dimension anywhere in a run. On competitors, this paragraph changed on 2026-08-07 and says so plainly: the original sentence here claimed there was no roster of any kind and presented that as a design choice. The founder reversed it. Paid accounts can now pin competitors in the dashboard, harvesting from answer text stays exactly as it was and stays primary, and what the roster adds is the ability to hold a named rival in view even when no answer names it. A pinned rival at zero renders as never named in this window, which is a measured absence over a stated window, not a gap in the data. If your first question is whether crawlers can read your pages at all, that is the AI visibility layer and it is measured separately, with the weights set out on the methodology page.
No competitor field on the form; since August 2026, a roster in the account
The form on the prompt tracking page has two inputs. One is your page. The other is your email. The handler on the other side reads the URL, the email or the signed-in session that already proved that address, and a human check that only anonymous submissions carry. A signed-in caller skips the human check entirely, and the session's address wins over anything typed into the form, so a submission cannot attach a run to somebody else's inbox. None of those inputs is a competitor, and nothing in a run knows the name of a single rival before the answers come back: the extraction below runs identically whether your roster is empty or full.
The account is where the change lives, and here is the change, dated. The original version of this section said there was no place anywhere in the account where a competitor is configured, and called that a deliberate position. On 2026-08-07 the founder reversed it, and the dashboard now carries a competitor roster: 3 pinned rivals on the weekly plans, 10 on the twice-weekly pair, none on the free preview. We are recording the reversal in the post that argued the old position, because a silently rewritten argument is worth less than either position.
The rival names on a report are still extracted from the answer text, and that stays primary. When an engine answers a question your page could have answered, the extractor walks the answer looking for proper-noun sequences, strips the ones that are grammar rather than names, drops the brand's own name when it recognises it, and keeps what is left. Those are the names on your report. They are the names the model reached for on questions derived from your own page, which is a different and more useful fact than whether a list of five companies you already think about got mentioned.
This is still the part worth checking against any other tool you are evaluating: does the product ask you who your competitors are? If it does, the competitor set is yours and the tool is confirming or denying it. If it does not, the set is discovered and the tool can surprise you. Both are legitimate. They answer different questions. We built the second one first, because the interesting failure mode is not "we lost to the rival we track", it is "the model names three companies we had never heard of". The roster adds the first without replacing the second: discovery still fills the table on every run, and pinning decides only which rows may never silently leave it. A pinned rival that no answer names stays on the table at zero, rendered as never named in this window, because "the answers never name X" is a finding a rival-watching customer pays to see, and harvesting alone had no row to keep it on.
The questions are derived from your page too, and that has a limit we state plainly. Relevancy scores how much of a question the page's crawler-visible text can actually ground. It is deliberately not search volume, not difficulty, and not a prediction of being cited: there is no prompt-volume dataset in this product, and we will not invent one. Anything below 45 is discarded and never displayed, because showing a question the page cannot answer invites a measurement we already know is noise. At 70 and above a question is banded grounded; between 45 and 69 it is partial. Relevancy is stable across reruns unless the page changes, which means relevancy drift is page drift and nothing else.
One question sits outside all of that. The branded control asks the model directly what it knows about your brand and your domain, and it is asked outside the ranked set and outside the score. It exists so the report can say, honestly, that a model does not name you even when asked about you by name. It is also excluded from the visibility denominator, because a question that names you is answered by naming you, and counting it would flatter the number. This is closely related to what answer engine optimization is trying to influence, and to the platform-specific work on getting cited by Perplexity, but the control is a measurement, not a tactic.
- The URL Read from the form, then put through the same guard the crawler scan uses before anything is queued.
- An email address The signed-in session's address when a session cookie is present, otherwise the one typed into the form. The session wins, so a run cannot be attached to another inbox.
- A human check Read only when there is no session. An authenticated caller skips it, because the magic-link session is the stronger proof of the same thing.
- A competitor, roster or watchlist No such field exists on the form or in the handler: a run is never told a rival's name. The dashboard has carried a separate pinned roster since 2026-08-07, and it feeds display and alerts only; rival names on reports still arrive out of the answers.
The screens between a model and a rival name
A model produced the text. A model does not decide what ships. Every consequential step in this module is deterministic code, and a name has to survive all of it before a customer reads it.
The first screen runs before any answer exists, on the questions themselves. A candidate question that names your brand or your domain is rejected outright, with the reason recorded as names_brand. A question that hands the model the answer makes the naming measurement circular, and a circular measurement that looks like a result is worse than no result. The second screen is the hallucination screen: every proper-noun sequence in a candidate question must be attested somewhere on the page, or the candidate is discarded as unattested_entity. The model cannot put a competitor's name into a question unless your own page already mentions it. That screen is biased hard toward rejecting, because a false reject costs one candidate slot and a false accept invents a competitor.
On the answer side the extractor's own doc comment states the trade: a missed competitor costs one row of insight, an invented one is false information on a customer's report. So it is built for precision over recall, and it loses real names to get there. Sentence-initial capitals are skipped, because a capital at the start of a sentence is usually grammar. Ordinary capitalised words are stripped off both edges of a sequence, and any sequence with sentence glue left inside it is discarded entirely, because real product names are not built from sentence glue. Any sequence longer than three words is dropped. At most eight rival names are kept per answer, so a long list is truncated rather than padded out.
Two rules in this module exist because we shipped the bug first, one on each side of the run. On the answer side, a customer's report once published "Below, Feel, Clarify Who You" as their competitors. Those are ordinary English words that took a capital because they opened sentences and imperative advice lines in a model's answer, and the extractor treated capitalisation as evidence of a brand. The list of ordinary capitalised words that now strips them sits in the source with that incident written above it, and it is the only rule the repository attaches to that incident. On the question side, "cases resources" once shipped as a published question, assembled from two adjacent navigation headings that never appeared next to each other in any block of real text. Phrase checks now run against the token sequences of individual blocks rather than the whole page, because whole-page adjacency invents phrases across block boundaries, and a phrase no single block contains is an artifact rather than a topic.
Both bugs have the same shape, and it is the shape worth watching for in any tool that reports what AI says about you. The output looked like data. It was formatted like data, ranked like data and sat in a table like data. What it actually was, in one case, was the model's grammar mistaken for the market's structure. This is the same class of error as scoring a page's structure from an error page body, which is why the extraction step is worth understanding before trusting anything downstream of it: what a crawler meets is the raw material, as one storefront teardown showed at the page layer, and the five structural signals work is the same discipline applied to identity. If you want to see the input for yourself before reading anything about the output, what GPTBot sees shows you the text the extractor is working from, and entity confidence is the structural half of the same question.
extractOtherNames, one sequence
- properNounSequences(answer, true) sentence-initial capitals skipped
- strip ordinary capitalised words off both edges "The Mailreach" becomes "Mailreach"
- nothing left, or more than three words discarded
- an ordinary capitalised word still inside discarded
- matches the brand name or the domain label discarded, it is not a rival
- already seen in this answer discarded, counted once
- eight names kept stop, the rest of the answer is not read
Citations and sentiment, and where each one stops
Only engines that report their sources can produce a citation row, and the report knows which ones those are from a flag on the registry rather than from a guess. That produces three distinct rendered states, and collapsing them is the mistake this section exists to avoid. Sources listed means the engine handed back URLs. A citing engine that returned an empty list is a measured zero. A citing engine whose answer carried no source list at all is not a zero: it is unread, and printing nothing for it would read as "there were none". Perplexity's search API returns its search results on every answer, which is the reason that engine is worth wiring at all: the citation metric costs no extra call. OpenAI's web search tool exposes its sources as citation annotations on the output text, and the Anthropic engine's search results arrive in their own tool-result blocks.
Then there is the case that would quietly ruin the metric. Google's grounding returns source URLs as redirect links on vertexaisearch.cloud.google.com and grounding-api-redirect.googleapis.com, so the host of a cited URI is often Google's redirector rather than the site that actually grounded the answer. Aggregating those by host would produce a citation table that is one Google row and nothing else, and would report every customer as never cited. They are counted as opaque, reported separately, attributed to nobody, and never counted as evidence that you were not cited. A citation you cannot attribute is missing information, not an absence.
Sentiment is the metric most likely to be oversold, so here is what actually grades it, and it changed on 2026-08-07. This post originally said the whole method was a fixed word list; a paid run now books one batched model classification call instead, graded per answer, and the answer records which grader produced its label so a reader is never left to guess. The word list did not leave: it is the free-run grader and the labelled fallback whenever the model call fails, and it is worth stating in full because it is what you get on a free run and what you can audit. It is 41 positive terms, 39 negative terms, 22 negators and 8 clause-breaking words, applied to the sentence or sentences of an answer that mention your brand. A negator within three tokens before a hit flips its polarity, a clause breaker stops that backward scan so that "not cheap but reliable" does not read as "not reliable", and the sign of the total picks one of four coarse labels.
The word list was originally chosen over a model pass for two reasons, and only one of them was cost. That position was reversed on 2026-08-07: paid runs now book the model pass, because the marginal signal was worth the one booked call the engine budget accounts for. The other reason the word list existed still stands, which is why it remained the free grader rather than being deleted: where the word list produced the number, you can read the list, see which term fired on which sentence, and disagree with it, and you cannot do that with a model score. The config states what the word-list method cannot do, in the same file as the list: sarcasm, comparison, conditionals, and any sentence whose polarity lives in structure rather than vocabulary. "Better than X" is positive about the sentence's subject, which may not be you. It reads one sentence, so a paragraph that praises then qualifies is scored on whichever sentence names you. Several obvious words were considered and rejected for flipping meaning in exactly the sentences we score: "problem" and "issue" both appear in praise, "free" is usually a selling point, "unknown" describes pricing rather than a view of a brand, and "simple" and "basic" are praise or criticism depending on the buyer.
None of this tells you whether an assistant will cite you tomorrow. The platform-specific work on that lives elsewhere: getting cited by ChatGPT, by Claude, and in Google AI Overviews each have their own mechanics, and structured data is the part of it a scanner can measure directly.
The ceiling we wrote down about ourselves
Here is the fact that makes this a blog post rather than a landing page. The grounded Gemini engine is metered in calls, not dollars. Google's free grounding tier is 5,000 grounded prompts a month, verified on the vendor's published pricing on 22 July 2026, and our own counter sits at 4,500 to leave headroom for counter lag. That counter is what holds the Gemini bill at exactly zero, because the paid tier is never entered. Gemini is always-on, so it answers every prompt of every run on every plan. Free traffic alone, at the daily cap of 100 runs a day times 5 prompts times 30 days, is 15,000 calls a month. That is 3.3 times the counter, from the free tier by itself, before a single paying account is counted.
So at ceiling the grounded engine goes dark part-way through the month and every run after that measures one engine fewer than the plan sold. That is a measurement overrun rather than a money one: the counter stops the spend at zero cost. The honesty machinery for it already exists and has to stay wired, which is exactly why budget_stopped is a distinct state with its own sentence. A share number computed over fewer engines than the plan promised is a different measurement, and a zero from an engine that never ran must never render like a zero from an engine that ran and did not name you. The repository records this, a test asserts the overrun so it cannot be forgotten, and the fix is a coverage decision rather than a spending one. We are publishing it because a limit you find yourself is worth less than a limit the vendor told you about.
There is a second caveat in the same spirit, and it is smaller but sharper. The report shows whether you were named first, and that flag is not an exact ranking. The extractor deliberately skips sentence-initial capitals, because a capital at the start of a sentence is usually grammar. When the brand is not found among the extracted names, its position defaults to 1. Put those together and a brand that opens a sentence can be recorded as named first without actually being first in any ordering a human would recognise. The framing for this is the one already argued in a user agent is a claim, not an identity: a figure everyone quotes is often a claim nobody verified, and our own figures are not exempt from that.
Tracking over time carries the same rule. When two runs of the same prompt set are compared, a null answer never counts as a flip in either direction, because an engine that errored is not an engine that stopped naming you. Alerting on that difference would manufacture a scare out of a timeout. An account can carry up to 10 distinct URLs on the weekly rerun cadence, which is a deliberate ceiling rather than an oversight: every tracked URL multiplies against prompts per run and engines per run, and the arithmetic that decides whether the product survives its own bill is written down next to the constant.
Publishing an inconvenient measurement is not new for this blog. What the evidence says about llms.txt argued against a feature we ship, and this is the same posture pointed at the engine ladder. The scoring rules that sit underneath all of it are on the methodology page, and the per-crawler behaviour that decides whether any of this input exists is in the AI crawler list.
What this is not, and what it would take
The honest close is a list of things this product does not do, because the search that brings people to this page usually means all of them.
It does not capture what a real user sees in a consumer assistant. There is no front-end browser session, no logged-in app, no screenshot of an answer as rendered to a person. Every answer here comes from an API or an open-weight model, and every engine list says so. It does not run multi-region or multi-language. A run is one language and one place, and there is no location dimension anywhere in the schema. On competitor sets, this list changed on 2026-08-07: the original line said there was nowhere to define one, and since the founder's reversal there is. Paid accounts pin a roster, pinned rivals hold their rows at a measured zero, and a pinned rival's first appearance in the answers can alert. The roster changes persistence, labelling and alerting only; every rival name in a report still arrives out of the answer text. It does not carry a dataset of real user prompt volumes, so nothing here can tell you how many people asked. And it does not publish customer outcomes: there are no stored prompt-run captures in this repository at all, and the sample output shown on the product page is labelled as a sample because it is one.
What it does instead is measure the layer underneath, which is the layer that decides whether any of the above is even possible. If a crawler cannot fetch or parse a page, nothing downstream can quote it. That is the argument in two layers decide if AI can read your site, and it is why prose parity is the heaviest single weight in the score. A head-to-head against a rival's page on that readability score is a separate and simpler measurement, and it lives at compare: it asks whose page is easier for a crawler to read, which is not the same question as whose brand a model names, and the two must not be quoted as if they were.
If you are choosing between products, the useful test is not the feature list. It is whether each number tells you its denominator. Ask what a share of voice figure is a share of. Ask what happens to an answer that errored. Ask whether an engine that was never asked is visually distinguishable from an engine that answered and did not name you. Ask whether a citation that resolves to a redirector is counted as a citation, dropped, or attributed to the redirector. Those four questions separate a measurement from a dashboard, and they are answerable in a minute on any tool, including this one.
The rest of the surface area is documented rather than pitched. The multi-page scan covers a set of your own pages at the readability layer, our crawler's conduct rules set out how it identifies itself and what it respects, the robots.txt tester shows per-crawler access decisions, and the fix work is what happens after a report says something specific is broken. None of those claim to know what an assistant said about you last Tuesday. This post exists so that the one surface that does make a comparative claim can be read with the exact size of that claim attached.
- Consumer assistant sessions No front-end browser capture and no logged-in app. Every engine in the registry is an API or an open-weight model.
- Regions and languages One language and one place per run. There is no location dimension anywhere in the schema.
- A competitor roster you configure Present since 2026-08-07, reversing this line's original absent, by founder instruction. Pinned rivals stay in the share-of-names table at a measured zero and can alert on first appearance; rival names on reports are still extracted from the answers, and the roster never feeds a run's inputs.
- Real user prompt volumes No prompt-volume dataset exists in this product, and relevancy is explicitly not search volume.
- Published customer outcomes No stored prompt-run captures exist in this repository, and the output on the product page is labelled a sample.
- A printed denominator on every number The basis string is body copy next to the figure, not a tooltip and not debug output.
Lantad
Published . Last updated .
Short answer: yes, partly, and the honest version of that answer is narrower than the question. Lantad has a surface that puts questions to up to seven answer engines, one of which every plan carries including the free one (the Workers AI open-weight chain; grounded Gemini moved to the paid plans in August 2026), records whether each engine names your brand, and lists the other brand names those same answers produced. That is a comparison against rivals. It is not a monitoring platform and it does not watch the consumer apps people actually type into. The first version of this post added a third absence: nowhere to enter a competitor you want watched. That stopped being true on 2026-08-07, when the founder reversed it and paid accounts gained a pinned competitor roster, and this post narrates the change where each affected claim stood rather than editing it away.
Common questions
Can I tell Lantad which competitors to track?
Yes, since 2026-08-07, and the original answer here was no. Paid plans pin a competitor roster in the dashboard: 3 rivals on the weekly plans, 10 on the twice-weekly pair. Pinning does not change how names are found. Every rival name on a report is still extracted from the answer text, the run form still has no competitor field, and a run is never told a rival's name. What the roster adds is persistence and alerting: a pinned rival stays in the share-of-names table even when no answer names it, shown as never named in this window (a measured zero, not missing data), its domain is marked in the citation table, and its first appearance in the answers can alert.
Does this show me what ChatGPT says about my brand?
It shows what OpenAI's model says when asked through OpenAI's own API, which is not the same thing as your ChatGPT window. Lantad calls APIs and open-weight models: a Cloudflare Workers AI chain with no web access, Gemini with Google Search grounding, DeepSeek and Grok as plain chat engines, and Perplexity, ChatGPT and Claude each with their web search tool. Reports name those rows ChatGPT and Claude, at vendor level, because a version string told a reader nothing they could act on. The difference the name does not carry is stated instead: an API call has no memory of your account, no custom instructions, and no consumer-app system prompt, so an answer here can differ from the one you get at your own keyboard. We never drive the chat apps.
Is the share figure the same as share of voice or market share?
No. It is a share of the brand names those specific answers produced, over the questions derived from your own page, and the report states that in body copy next to the number. It is not market share, not revenue share and not audience share, and it says nothing about how many people asked those questions.
How many engines answer on a free run?
One is guaranteed. A free run is 5 prompts with zero paid engines, which is not zero engines: the Workers AI chain answers every prompt. Grounded Gemini runs on paid plans only, because its monthly call allowance is the binding limit and the engine table reports its state on every run. Starter adds three paid engines and tracks 100 prompts weekly; Pro and above reach all five, at 150 to 250 prompts tracked, and the metered engines see only the top 10 prompts of each page run, which the report line says explicitly.
See what AI can read on your site
Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.