Data model
The tables behind Geonimo, what each stores, and how a number on screen traces back to a captured answer.
Understanding the data model makes every screen easier to reason about, and makes it obvious what can and cannot be answered from the data.
Configuration
Projects — a tracked website: name, URL, industry, location and language, owned by a workspace. Membership and billing come from the workspace.
Prompts — the questions monitored for a project. Each carries its text, status, tags, origin, its intent (visibility or perception) and, for product prompts, the product it belongs to. Subject is derived from that link rather than stored, so a fifth prompt group cannot be invented.
Entities — the brands tracked inside answers: name, domain, type (brand or competitor), status.
Products — products tracked by name, each belonging to an owner entity — yours or a competitor's — and measured in their own right.
Execution
Queries — one repeat sample of one sampling cell: a prompt, on an engine, at a location, on a day, with a status (queued, running, done, failed). Several queries per prompt per day is what makes a confidence interval possible.
Answers — the captured response: text, markdown where the surface provides it, citations, whether it was grounded, the answering model, the fan-out queries, surface metadata and parse status. Every metric derives from these rows, and every drill-down ends here.
Extraction
Mentions — one row per entity found in an answer, unique per answer and entity, with position (1-based order of first appearance), sentiment, recommendation strength (listed, recommended, warned_against) and a snippet.
Citations — one row per source used in an answer, unique per answer and source, with rank and whether it was quoted inline or listed in a panel.
Sources and domains — the normalized registry behind citations. Sources are URLs with titles and first/last seen timestamps; domains carry a type.
Placements — shopping and ad units captured alongside answers, with their slots, titles, positions and advertisers. See Ads & Shopping.
Perception claims and themes — what answers assert about you, classified as strength, weakness or misconception, each stored with a verbatim evidence span from its source answer. Claims are unique per answer, kind and theme, so re-running the pass merges rather than duplicates; the read path drops any claim whose evidence does not appear in the answer it cites.
Aggregation
Daily metrics — pre-aggregated per project × entity × engine × day: mention count, answers containing the entity, total answers, visibility score, share of voice, average position, average sentiment.
Engine is part of the primary key. That is what keeps a scraped-UI reading and a calibration API reading from ever being averaged into one number.
Dashboards read this table and small lookups — nothing else. They never scan answers or mentions directly. Aggregating raw rows per page load is what makes analytics dashboards slow; reading a pre-computed daily row keeps them fast no matter how much history accumulates. Raw tables remain for drill-down, where you are looking at one answer rather than a million.
Metrics are rolled up on ingest, not on a timer, so numbers move during a run rather than appearing all at once afterwards.
Reasoning modes
Answers record the reasoning mode of the surface that produced them — default, instant or thinking. ChatGPT's modes retrieve and cite differently, so the dimension is carried rather than flattened, and the visibility trend can be read per engine and mode.
Write model
A deliberate asymmetry:
- You write projects, prompts, entities and products — the configuration.
- The pipeline writes queries, answers, mentions, citations, sources, domains, placements and daily metrics, exclusively through a privileged service role used by backend functions.
From the application, pipeline tables are read-only. No user action — and no bug in a user-facing code path — can fabricate an answer or edit a metric.
Access
Every GEO table is behind row-level security, resolved through the set of projects the caller can reach. Membership is tested once per query rather than once per row, which is both faster and easier to audit. The anonymous role has no access to any GEO table.
Retention
Raw answer text is large and its value decays: mentions, citations and metrics have already been extracted. Raw text is kept for ninety days, then cleared while the derived data is preserved — trends keep their full history.
Tracing a number
Any figure resolves downward:
Visibility 46.2% (±2.1)
→ daily metrics rows for the period, engine and entity
→ the answers counted in those rows
→ the mentions extracted from each
→ the captured answer text, its citations and its placements
If a number ever looks wrong, that path is how you check it — and every step is available in the interface.