DEV Community

Riya Amir
Riya Amir

Posted on

A Data Model for AI Visibility: Mentions, Citations, Accuracy and Source Quality


Most AI visibility tooling gives you one number. That number is usually "mentions". This post shows how to model four separate measurements instead, so your data can answer better questions.
It's based on the measurement framework in Kiyado's guide to GEO metrics. The example is a Sydney B2B SaaS company (illustrative) whose marketing team wants to pipe enterprise geo api ai visibility data into its own warehouse instead of reading vendor charts.
Why four measurements, not one
The guide makes three distinctions that most schemas collapse:

  1. Mention vs citation. A mention means the AI named the brand. A citation means it used the brand's website or content as a source. The guide calls these "not the same thing".
  2. Visibility vs accuracy. The guide warns that AI visibility "is not automatically valuable if the information is incorrect".
  3. Citation vs citation quality. "Not every citation has the same value." Relevance, source authority, context, accuracy and prompt importance all matter. If your schema stores a single visible boolean, you can't answer any of these questions later. Step 1: Model prompts as versioned, fixed entities The guide insists on using the same prompt set over time. Make that a schema rule, not a habit. CREATE TABLE prompt_set ( set_version INT NOT NULL, prompt_id TEXT NOT NULL, intent TEXT NOT NULL CHECK (intent IN ('informational','comparison','commercial','brand','industry')), importance INT NOT NULL CHECK (importance BETWEEN 1 AND 3), prompt_text TEXT NOT NULL, PRIMARY KEY (set_version, prompt_id) ); importance supports the guide's point that the importance of the prompt affects citation value. Step 2: Store observations, not conclusions Each run produces one row per prompt per assistant. CREATE TABLE observation ( observed_at TIMESTAMP NOT NULL, assistant TEXT NOT NULL, set_version INT NOT NULL, prompt_id TEXT NOT NULL, mentioned BOOLEAN NOT NULL, answer_excerpt TEXT, -- the sentence(s) describing the brand PRIMARY KEY (observed_at, assistant, set_version, prompt_id) );

CREATE TABLE citation (
observed_at TIMESTAMP NOT NULL,
assistant TEXT NOT NULL,
prompt_id TEXT NOT NULL,
source_url TEXT NOT NULL,
is_own_domain BOOLEAN NOT NULL,
is_competitor BOOLEAN NOT NULL
);
Keep the answer_excerpt. You need it for accuracy review, and you can't reconstruct it later because AI answers change.
Step 3: Make accuracy and quality human-reviewed fields
CREATE TABLE review (
observed_at TIMESTAMP NOT NULL,
assistant TEXT NOT NULL,
prompt_id TEXT NOT NULL,
accurate BOOLEAN, -- NULL = not yet reviewed
issue TEXT, -- e.g. 'old pricing', 'retired feature'
source_quality INT CHECK (source_quality BETWEEN 1 AND 3),
reviewer TEXT
);
The guide's accuracy checks are products or services, areas of expertise, locations served, industry focus and company information. For a SaaS company, "products" includes features and pricing tiers, which change often.
Step 4: Compute the metrics
-- Monthly mention rate, citation rate and accuracy per assistant
SELECT date_trunc('month', o.observed_at) AS month,
o.assistant,
AVG(o.mentioned::int) AS mention_rate,
AVG((c.own_cited)::int) AS citation_rate,
AVG(CASE WHEN r.accurate IS FALSE THEN 1 ELSE 0 END)
FILTER (WHERE r.accurate IS NOT NULL) AS inaccuracy_rate
FROM observation o
LEFT JOIN (SELECT observed_at, assistant, prompt_id,
bool_or(is_own_domain) AS own_cited
FROM citation GROUP BY 1,2,3) c USING (observed_at, assistant, prompt_id)
LEFT JOIN review r USING (observed_at, assistant, prompt_id)
WHERE o.set_version = 1
GROUP BY 1, 2
ORDER BY 1, 2;
Filter on a single set_version so the trend compares like with like.
Step 5: Add competitor visibility
The guide's third metric is competitor visibility. Store competitor citations in the same citation table with is_competitor = true, and add a simple competitor_mention table if you also track mentions by name. Then you can ask which competitor is cited most for your high-importance commercial prompts. The guide notes that this "can reveal content gaps that traditional ranking reports may not show".
Step 6: Collect data within the rules
Whatever "API" you use, collect within each provider's terms of service. Don't automate consumer chat interfaces with scrapers. Use official APIs where they exist, a vendor that has proper access, or manual collection for a small prompt set. Check current documentation before you build, because capabilities change.
Step 7: Build the review queue
The review table only works if someone fills it. Make that easy with a view that lists every unreviewed mention, newest first:
CREATE VIEW review_queue AS
SELECT o.observed_at, o.assistant, o.prompt_id, p.prompt_text, o.answer_excerpt
FROM observation o
JOIN prompt_set p USING (set_version, prompt_id)
LEFT JOIN review r USING (observed_at, assistant, prompt_id)
WHERE o.mentioned AND r.observed_at IS NULL
ORDER BY p.importance DESC, o.observed_at DESC;
Sorting by importance first means reviewers deal with high-value commercial prompts before low-stakes informational ones. In practice, a product marketer can clear a month's queue for a 40-prompt set in under an hour.
How to read the four numbers together
The value of this model is in the combinations. Four patterns come up again and again:
High mention rate, low citation rate. AI knows the brand but relies on other people's content to describe it. The fix is usually better, clearer pages of your own.
High citation rate, high inaccuracy rate. AI is using your content, but the content itself is out of date. The fix is on your site, not elsewhere.
Low mention rate, competitors cited often. A content gap. Compare what competitors publish for those prompts. The guide calls this "find the gaps".
Good rates, low source quality. You're cited, but from weak or irrelevant pages. Point the right pages at the right questions.
None of these patterns is visible if you store one visible flag. All four are obvious with this schema.
Common pitfalls when implementing
Editing prompts in place. Always create a new set_version. Keep the old version running for at least a few months so you can compare.
Throwing away answer text. You'll want it the first time someone asks "what exactly did it say in March?"
Letting the review backlog grow. An unreviewed accuracy column is the same as no accuracy column.
Mixing assistants in one rate. Different assistants behave differently. Report them separately, then summarise.
What this model doesn't do
It doesn't measure AI-referred traffic or conversions, the guide's last two metrics. Join those from your analytics and CRM by month.
It doesn't remove answer variability. Run each prompt more than once if you can, and store every run.
It doesn't replace content audits. The guide mentions tools such as Geoptie and SEOmator that assess citation readiness, schema and AI crawler access. They explain why your citation rate is low; this model tells you that it is.
Quick checklist
☐ Prompts versioned and frozen per version
☐ Mentions and citations stored separately
☐ Answer excerpts stored for review
☐ Accuracy and source quality reviewed by a human
☐ Competitor citations captured
☐ Traffic and conversions joined monthly
Kiyado works with Sydney SaaS teams remotely to set up this kind of measurement.
See how Kiyado works with SaaS and tech teams →

Top comments (0)