← All lab projects

Lab · Project

Measuring Share of Voice in AI answers yourself

$35 instead of €85 a month – as long as a weekly cadence is enough

Starting point: you get the score, not the formula

On client projects I measure AI visibility with Peec.ai. It delivers daily prompt-level data, and for day-to-day work that is the right choice. One thing it does not deliver: the arithmetic behind the number.

For a brand that puts “no assumptions without a data basis” on its homepage, that gap is a problem waiting to happen. When I explain to a client why their Share of Voice fell from 18 to 11 percent, I want to trace the chain back to the raw answer. So I built the measurement myself, end to end – as a tool for client work and as a test of my own method.

What the workflow does

Four phases, fired by a schedule. Phase one expands every active prompt into prompt × model × repetition and sends each call through a single OpenRouter account. Perplexity Sonar searches natively; the other models get the web plugin with engine: native, so each provider is measured with its own search engine rather than someone else’s bolted in front. Every answer lands in Google Sheets as a raw record with full text and source URLs. Failing calls do not abort the run, they sit in the sheet as status=error.

n8n canvas, phase 1: Schedule Trigger, Read Prompts, Expand Runs, Loop with Call OpenRouter, Normalize Response, Append to runs
Phase 1: data collection — each active prompt runs × model × repetition through one OpenRouter account into the runs tab.

Phase two checks every answer against the brand list: mentioned yes/no, domain cited as a source yes/no, relative position of the first mention. This runs on regex, not on an LLM judge. That difference decides whether the whole time series is usable: a model grading another model returns slightly different numbers on every pass, and once you can no longer separate the judge model’s mood from real market movement, you are measuring yourself. Regex returns the same number for the same input. Reproducibility beats elegance.

n8n canvas, phase 2: Read Brands, Read Runs, Detect Mentions, Append to mentions
Phase 2: deterministic regex detection — mentioned, cited, position, per brand and run.

Phase three aggregates per model and brand into weekly figures – mention rate, citation rate, Share of Voice, average position – plus a combined value across all models. Phase four compares against the previous week and sends an HTML report with deltas in percentage points. Two alerts are built in: a SoV loss of more than five percentage points, and a citation rate dropping to zero. The second one matters more. It almost always means crawlers can no longer reach the domain.

n8n canvas, phases 3 and 4: Calculate Weekly Metrics, Append to weekly_agg, Build Report, Send Email
Phases 3 & 4: weekly aggregation and an HTML email report with week-over-week deltas and alerts.

Every prompt runs three times per model. A single measurement of a stochastic answer is not a signal, it is noise with decimal places.

Data model

Google Sheet
├── prompts      question, topic, market, language, active
├── brands       name, aliases_regex, domains, is_own
├── runs         raw answer + source URLs, one record per call
├── mentions     one row per brand per answer
└── weekly_agg   weekly figures, data source for Looker Studio

Five tabs, no server, no database. The sheet is configuration, raw storage and export format at once. Brand and metric logic stays inside it: only the questions themselves go to the model APIs, never the competitor list.

What it costs to run

Model tokens are the smallest line item, around $2 a month. What you pay for is search: Perplexity charges a request fee, and GPT and Gemini add the web search plugin. The figures below come from running 50 prompts across three models (GPT-4o-mini, Gemini 2.5 Flash, Perplexity Sonar). The workflow ships with four; which models run is one line in the code node.

Operating modeCost per month
Weekly, 1 run$10 to $12
Weekly, 3 runs$30 to $35
Daily, 1 run$70 to $80
Daily, 3 runs$200 to $220

Hosting on top: a small VPS from about $5, n8n Cloud from around €24 a month.

The honest comparison

This is where it gets uncomfortable, which is exactly why it belongs on this page. Peec.ai and orchly.ai measure daily. The self-build is cheaper only as long as a weekly cadence will do.

Peec’s Starter plan costs €85 a month and covers precisely the scope I am building here: 50 prompts, three models, one project – daily instead of weekly, with a dashboard, sentiment and source analysis. Orchly Essential sits at $49 monthly ($37 billed annually) for 25 daily-refreshed prompts, with ChatGPT, Google AI Overview and Perplexity in the base plan; Gemini, Claude, Grok and AI Mode cost extra.

Scale the self-build up to daily measurement with three runs and it lands at $200 to $220, more expensive than either – with no ready-made dashboard, no sentiment analysis, no support. If you need daily data and a team front end, buy the product. That is not a concession, that is the math.

Two things still belong to the self-build. First, model choice: Claude Sonnet arrives only in Peec’s Enterprise plan, and a fourth model adds €35 on Starter. In the workflow it is an entry in an array. Second, prompt volume: 50, 200 or 500 prompts change no license, only the API bill.

Data sovereignty, not data protection

Self-build projects often come with the line “your data stays with you”. It does not hold up here, and I would rather say so myself. No personal data flows through this monitor – the prompts are generic market questions, and GDPR has little to do with any of it. The self-build sends requests to more US providers, not fewer: OpenRouter, OpenAI, Google, Perplexity. The raw data sits in Google Sheets. Anyone constructing a privacy advantage over a German SaaS from that is arguing against their own architecture.

What does hold up is sovereignty over the data. The full answer texts belong to you, exportable, with no vendor lock-in. Every Share of Voice number can be recalculated, because the formula sits in the code node and detection runs deterministically. And the most strategically sensitive asset, the tracked prompt set with its competitor list, lives in your spreadsheet instead of a vendor’s database.

Where it trips you up

Source URLs come back in different places depending on the model. The workflow reads annotations[].url_citation.url first, the OpenRouter standard, and falls back to Perplexity’s older citations field. Without that fallback the citation rate sits silently at zero and looks like a crawler problem.

The brand regex decides your data quality. A brand carrying a common-word name will, without word boundaries and a maintained alias list, collect hits in answers that are about something else entirely, and Share of Voice climbs while nothing real has happened. Test your expressions against ten actual answers before you arm the schedule.

Then the patience test: four to six weeks of data before the time series says anything. Before that you see fluctuation and mistake it for movement.

Effort

Zero to production: about five working days for data model, API integration, parsing, aggregation and report. Importing the finished workflow takes two to four hours for credentials, the Google Sheet and a test run.

It started with the question whether I can trace the number I show a client back to the raw answer. Now I can – and so can you: the workflow is on GitHub or available as JSON to import, CC BY 4.0. Import it, create a sheet, activate five prompts, wait a week. If you then want to know what those numbers mean for your brand: write to me.


Sources and status: Plan scopes retrieved on 19 July 2026 from peec.ai/pricing – Starter with 50 prompts, three models, daily tracking and one project, Claude Sonnet in the Enterprise plan only – and from orchly.ai/pricing, where Essential runs at $49 monthly ($37 billed annually) for 25 daily-refreshed prompts. The €85 Starter price and the €35 surcharge per additional model reflect July 2026 as shown in my own Peec account, since the amounts load dynamically on the pricing page. Operating costs from my own OpenRouter invoices at 50 prompts across three models.