# How to Build an AI Visibility Reporting Dashboard

**Author:** John Morabito (Founder, /winston)
**Published:** June 10, 2026
**Last updated:** October 8, 2026
**Reading time:** 16 minutes
**Canonical:** https://www.winstondigitalmarketing.com/playbooks/how-to-build-an-ai-visibility-dashboard/

A spreadsheet of citation data does not get read, and a dashboard does. First, what a reporting dashboard for your own team should show and how often to refresh it. Then the full architecture behind the AI visibility dashboards we ship: six phases from prompt research to a single self-contained HTML file a client can open, click through, and immediately understand where they are invisible.

## Why a dashboard, not a deck

The data behind a GEO audit is complex: thousands of AI-engine answers, brand mention counts across five engines, Reddit and YouTube citation maps, share-of-voice splits by category. In a slide deck it dies on slide four. In a spreadsheet the client never opens it.

A dashboard is interactive (the client explores their own categories), visual (the invisible-category problem hits them in the gut), and because we ship it as a single self-contained HTML file there is no login, no SaaS seat, no expired link. They double-click it and it works forever.

The deliverable: one HTML file, self-contained, all data inlined, no external dependencies. Tabs for overview, share of voice, engine breakdown, Reddit, YouTube, and prioritized recommendations. Dark theme so it looks like a product, not a report.

## Building a reporting dashboard for your team: what goes on it

If the job is reporting AI visibility to your own team every week, you do not need the full audit build below. You need a fixed prompt set, a fixed schedule, and five views. Pick 50 to 150 prompts your buyers actually ask (the method is in [how to set up AI visibility tracking](https://www.winstondigitalmarketing.com/playbooks/how-to-set-up-ai-visibility-tracking/)), run them on the same schedule across ChatGPT, Perplexity, Gemini and Google AI Overviews, and record four fields per answer: were you named, how were you described, which competitors were named, and which sources were cited.

Those four fields feed five views:

- **Visibility rate by engine.** The share of prompts where you are named, split by engine, because the engines disagree with each other more than most teams expect.
- **Share of voice against named competitors.** The same prompts, counted for each competitor. How to define and calculate it is in [how to measure AI share of voice](https://www.winstondigitalmarketing.com/playbooks/how-to-measure-ai-share-of-voice/).
- **Cited sources.** The domains and pages the engines lean on when they answer your category. This is usually the most useful view, and the one most dashboards leave out.
- **Prompt-level change log.** Which prompts you gained or lost since the last run, so a moving average does not hide a lost category.
- **Action list.** The tasks the other four views produce, each with an owner.

Refresh the priority prompts weekly and the full set monthly. AI answers shift between runs, so one check proves very little; the cadence tradeoff is in [daily vs monthly AI visibility tracking](https://www.winstondigitalmarketing.com/playbooks/daily-vs-monthly-ai-visibility-tracking/). A spreadsheet plus a scheduled script is enough to start, and a tracker export can feed the same five views later. If you would rather not maintain the script, our [GEO Tracker](https://www.winstondigitalmarketing.com/geo-tracker/) captures each prompt daily on ChatGPT, Gemini, Google AI Overviews, AI Mode and Perplexity at 75 cents a prompt per month, and exports the answers, competitors and cited sources those five views are built from. We make it, so weigh that accordingly.

## A dashboard should tell you what to do next

The common complaint about [generative engine optimization tools](https://www.winstondigitalmarketing.com/playbooks/generative-engine-optimization-tools/) is that they give you charts and stop there. Build the action list in from the start. A cited source you are missing from becomes an outreach or PR target. A prompt where a competitor is named and you are not becomes a page to write or fix. A wrong description of your brand becomes an entity cleanup ticket. If a view cannot produce a task, cut it.

If your team already reports on SEO and wants AI visibility in the same weekly view, with someone senior turning it into a work plan your writers and developers can ship, that is the shape of our [GEO service](https://www.winstondigitalmarketing.com/services/generative-engine-optimization/). The fastest way to see whether it fits is [a 20-minute call](https://www.winstondigitalmarketing.com/contact/#book-a-call): bring the prompts you care about and the report you send today.

## Phase 1: Prompt research

300 to 500 prompts tagged by category, sub-theme, and intent. This is its own discipline; the full method is in the GEO prompt research playbook. Output is a CSV that feeds phase 2.

## Phase 2: Multi-engine scrape

Run every prompt through ChatGPT, Gemini, Perplexity, Google AI Overview, and Google AI Mode. For 400 prompts that is 2,000 calls, so automate it. Engineering notes that save a day of pain:

- **Shard it** across parallel workers. Serial takes all day; sharded takes an hour.
- **Make it resumable.** Write each result to its own file. When the run dies at 1,400 of 2,000 (it will), resume instead of restarting.
- **Capture the full answer and the sources.** You need both: answer text for brand-mention detection, sources for the citation gap.
- **Carry the tags through** so you can aggregate without a join.

## Phase 3: Reddit citation analysis

AI engines cite Reddit constantly. Pull every cited Reddit URL from phase 2, scrape those threads plus the relevant subreddits (title, body, comments, upvotes, sub, URL), compute Reddit share of voice, find the citation gap (threads the engines cite where the client is absent), and extract sentiment themes with quotes.

**Hard-won schema lesson:** the dashboard data layer is strict. Reddit threads need a consistent shape and one mismatched key throws a JS error mid-render that silently kills every section after it. Validate the JSON against a known-good example before building, and syntax-check the final inlined script. Reddit scraper items often have a null post id, so join comments to posts via the `/comments/<id>` segment of the URL, not the id field.

## Phase 4: YouTube ownership analysis

Identify the YouTube videos the engines cite, then classify each: brand owns the channel, creator/partner, or brand absent. The absent-but-cited videos are a content gap and often a creator-partnership opportunity.

## Phase 5: Assemble the data layer

Normalize everything into a small set of JSON files, one per analysis, each matching the dashboard's expected schema exactly. Validate against a known-good reference before injecting. Escape your strings (brand names and Reddit quotes contain apostrophes that break JS-context injection). Keep the focal-brand key stable so the same template works for every engagement.

## Phase 6: Build the self-contained HTML dashboard

Start from a dashboard template (tab structure, chart rendering, dark theme already built) and transform per client: inject the JSON, swap brand name and accent color, write the per-client narrative into the recommendations tab.

- **Inline everything** so the file works with no network.
- **Syntax-check the final script** after every transform.
- **Tabs map to the analyses.**
- **Make recommendations specific:** not "improve your AI visibility" but "you are absent from 17 of the 20 cited Reddit threads in the protein category; here are the three to target first."

## The whole pipeline

1. Prompt research: 300-500 tagged prompts.
2. Multi-engine scrape: 5 engines, sharded, resumable, sources captured.
3. Reddit analysis: share of voice + citation gap + sentiment.
4. YouTube ownership: cited videos classified owned / partner / absent.
5. Data layer: validated JSON per analysis, schema-checked.
6. Dashboard: one self-contained HTML file, syntax-checked, client-branded.

## Why we publish this

The pipeline is a lot of disciplined engineering and the value is in running it correctly and repeatedly, not in keeping the recipe secret. And once the dashboard exists, the next job is turning it into something a stakeholder funds: see [AI visibility reporting](https://www.winstondigitalmarketing.com/playbooks/ai-visibility-reporting/) for how the periodic, curated report differs from the live dashboard and what to put in it. The mechanics of producing that report each week with AI, and the human gate that keeps it honest, are in [how to run a weekly SEO report with AI](https://www.winstondigitalmarketing.com/playbooks/weekly-seo-report-with-ai/). Before you commit to building all of this, it is worth weighing it against simply buying a tracker, which is the honest decision framework in [build vs buy AI visibility tracking](https://www.winstondigitalmarketing.com/playbooks/build-vs-buy-ai-visibility-tracking/).

## Frequently asked questions

**How can I build a reporting dashboard for AI visibility?**
Start with a fixed set of 50 to 150 prompts your buyers actually ask, run them on the same schedule across ChatGPT, Perplexity, Gemini and Google AI Overviews, and record four things per answer: whether you were named, how you were described, which competitors were named, and which sources were cited. Put five views on the dashboard: visibility rate by engine, share of voice against named competitors, the sources the engines cite, a prompt-level change log, and an action list. Refresh the priority prompts weekly and the full set monthly. You can build it from a spreadsheet and a scheduled script, or feed a tracker export into the same five views. Our own [GEO Tracker](https://www.winstondigitalmarketing.com/geo-tracker/) runs each prompt daily on ChatGPT, Gemini, Google AI Overviews, AI Mode and Perplexity for 75 cents per prompt per month, which is $150 a month for 200 prompts with no contract, and exports everything. We make it, so treat that as a disclosure.

**What should an AI visibility dashboard tell you to do next?**
Every view should end in a task someone owns. A cited source you are missing from becomes an outreach or PR target. A prompt where a competitor is named and you are not becomes a page to write or fix. A wrong description of your brand becomes an entity cleanup ticket. If the dashboard only shows numbers going up or down, the team will stop opening it within a month.

Service: https://www.winstondigitalmarketing.com/services/generative-engine-optimization/
Audit: https://www.winstondigitalmarketing.com/audit/
