How it works
BrandBanta turns your prompts into measurable data about how LLMs talk about your brand. Here's the full pipeline, end to end.
The loop
YOU
│
defines topic + queries + brands
│
▼
┌──────────────────────────────────┐
│ SCAN DISPATCHER (oRPC) │
│ resolves BYOK key, checks │
│ quota + free-tier gates │
└──────────────┬───────────────────┘
│
per-scan Inngest event
│
▼
┌──────────────────────────────────┐
│ INNGEST WORKER (parallel x4) │
└──┬─────────┬─────────┬─────────┬─┘
│ │ │ │
▼ ▼ ▼ ▼
ChatGPT Claude Gemini Perplexity ◄── OpenRouter gateway
│ │ │ │
└────┬────┴────┬────┴────┬────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────┐
│ STORE: response + brand_mention │
│ + source rows (verbatim) │
└──────────────┬───────────────────┘
│
scan-completed event
│
▼
┌──────────────────────────────────┐
│ POST-PROCESS WORKERS │
│ • mark snapshots stale │
│ • evaluate alert rules │
│ • dispatch webhook deliveries │
└──────────────┬───────────────────┘
│
▼
┌──────────────────────────────────┐
│ /insights page load │
│ getOrMaterializeSnapshot() │
│ │ │
│ ├── snapshot hash unchanged? │
│ │ └─► serve cached row │
│ │ + cached narrative │
│ │ │
│ └── hash changed? │
│ └─► materialize new row │
│ + Sonnet narrative │
│ (or inherited │
│ from hash match) │
└──────────────────────────────────┘
│
▼
DASHBOARD
Executive Summary
Share of voice
Visibility trend
Per-platform rates
Top + gap sourcesEvery arrow is durable. Inngest retries failed steps; the snapshot cache means narratives don't get regenerated unless the underlying data hash actually moved. Every number on the dashboard traces back to a row you can SELECT * from.
Step 1 — Prompts go to four LLMs in parallel
When you run a scan (manually or on a schedule), the prompt is sent simultaneously to all four configured platforms via the OpenRouter API. We use OpenRouter as the single gateway so you bring one key, not four.
Default models:
| Platform | Model used |
|---|---|
| ChatGPT | openai/gpt-4o |
| Claude | anthropic/claude-sonnet-4.5 |
| Gemini | google/gemini-2.5-pro |
| Perplexity | perplexity/sonar-pro |
The free tier downgrades to cheaper variants to control shared-key spend. On BYOK you get the strongest production model on each platform.
Step 2 — Every response is stored verbatim
Every response is saved to your workspace's database with the full text, token counts, USD cost, latency, and provider response ID. Nothing is summarized away. The "open response" button in scan detail shows you exactly what each LLM said.
This matters because what counts as a brand mention is contextual, and we want you to be able to verify any flag we raise.
Step 3 — Two-pass mention detection
Detecting a brand mention is harder than it sounds. "Apple" might be the company or the fruit. "Get Vocal Inc" and "GetVocal" are the same brand. "Cognigy GmbH" is the legal entity for "Cognigy."
Pass 1 — Word-boundary regex
We compile every brand and every alias into a word-boundary regex (case-insensitive by default, case-sensitive on demand for brands like "RAG" that need it). This catches the textual mention deterministically — it's fast and it's auditable.
Pass 2 — LLM extractor (BYOK only)
For BYOK orgs we run a second LLM pass over the response with a structured-output schema asking: for each mentioned brand, what was the sentiment (positive/neutral/negative), the position (first mention / later mention), and the context type (recommendation / informational / cautionary / dismissive)?
The free tier skips pass 2 entirely — you get the mention count from pass 1 only.
Step 4 — Aggregation into snapshots
When you visit /insights, we materialize a snapshot — an aggregate of every scan in the time window. The snapshot includes:
- Mention rate (your brand)
- Mention rate per platform
- Share of voice vs each competitor
- Sentiment mix
- Top cited sources (URLs LLMs cited when answering)
- Gap sources (citations to competitors but not to you)
- Topic momentum (which topics moved most)
Snapshots are content-addressed by hash: if your data hasn't changed since the last snapshot, we reuse the existing narrative and skip the LLM call. New data + same shape = same hash = instant load.
Step 5 — AI narrative
Once the snapshot is built, we send it to Claude Sonnet 4.5 with a structured prompt that asks for:
- An executive summary (3 bullet points)
- 3–5 specific findings, each with evidence, interpretation, confidence, and a recommended action
The output is structured JSON with a Zod schema. If the LLM produces malformed output we retry with a more conservative prompt. The narrative is stored alongside the snapshot — same hash, same narrative; new hash, regenerate.
For workspaces on Pro+ tiers we also run the async batch lane through Anthropic's Batches API (50% off Opus-quality narrative, delivered within 24 hours via the daily digest).
Step 6 — Alerts + delivery
Snapshot diffs are evaluated against a small set of rules:
- Mention rate drop — your mention rate fell ≥X% in this window vs the previous one
- Competitor surge — a competitor's mention rate rose ≥X% in the same window
- Sentiment swing — sentiment mix shifted toward negative ≥X%
- New competitor detected — a brand we haven't seen before is now appearing alongside yours
Each rule fires a notification (in-app + email + optional webhook to Slack or any generic endpoint). The full schema is in Webhook delivery.
What we deliberately don't do
- No predictive scores. We don't tell you your AI visibility is "73 out of 100." Every metric is a measured count, not a model output.
- No single composite score that hides what changed. The point of the dashboard is that you see which dimension moved.
- No data sharing across tenants. Your prompts don't train anyone's model. Org-scoped from the database up.
Where to read more
- Scans & prompts — what a single scan actually does
- Mentions & sentiment — how we extract and classify
- Insights & narratives — what the AI narrative is for
- Alerts — when and why we notify you