Case study § 03 · Proprietary product

GEO Audit · brand visibility measurement in generative engines

Product · React / Python · 5 engines · headless conversations · 40 tests

Search is moving from Google to generative engines. When a prospect asks ChatGPT, Perplexity or Gemini which provider to pick, the answer steers the purchase.

On the brand side, no one knows what is said or measures it.

GEO is to these engines what SEO was to Google.

GEO Audit measures that presence for any company.

The tool queries five engines on a questionnaire across four categories: awareness, sector discovery, purchase intent, values and alternatives.

Diagram: GEO audit, from brand to per-engine scoreA brand is queried on a four-category questionnaire: awareness, sector discovery, purchase intent, values and alternatives. The questions go out to five anonymized generative engines, engine A to E. Right after, a column of headless conversations with live web search is measured but excluded from the global score, cutting the web would have skewed the measurement: the main flow bypasses it to reach the parser directly. The parser refuses to write when an answer's numbering is broken. It finally feeds three outputs: a global score, a question by engine heatmap, and recommendations.BRANDPARSERBROKEN NUMBERING:REFUSES TO WRITEHEADLESS+ LIVE WEBEXCLUDED FROM SCORE4 QUESTION CATEGORIESAWARENESSSECTOR DISCOVERYPURCHASE INTENTVALUES AND ALTERNATIVES5 ENGINESENGINE AENGINE BENGINE CENGINE DENGINE EGLOBAL SCOREHEATMAPQUESTION × ENGINERECOMMENDATIONSDiagram: GEO audit, from brand to per-engine scoreA brand is queried on a four-category questionnaire: awareness, sector discovery, purchase intent, values and alternatives. The questions go out to five anonymized generative engines, engine A to E. Right after, a column of headless conversations with live web search is measured but excluded from the global score, cutting the web would have skewed the measurement: the main flow bypasses it to reach the parser directly. The parser refuses to write when an answer's numbering is broken. It finally feeds three outputs: a global score, a question by engine heatmap, and recommendations.BRAND4 QUESTION CATEGORIESAWARENESSSECTOR DISCOVERYPURCHASE INTENTVALUES AND ALTERNATIVES5 ENGINESENGINE AENGINE BENGINE CENGINE DENGINE EHEADLESS+ LIVE WEBEXCLUDED FROM SCOREPARSERBROKEN NUMBERING:REFUSES TO WRITEGLOBAL SCOREHEATMAPQUESTION × ENGINERECOMMENDATIONS
DIAGRAM5 engines · neutral conversation · without biasing the measurement.
Readout · GEO score by engine × categorylowhigh
ClaudeGPTGeminiPerplexityCopilotAwareness9355627441Discovery7963578247Intent8650677138Values7245496434GEO SCORE61/ 100
RECONSTRUCTION · FICTIONAL DATA

It produces a global score, a breakdown by engine and category, a question-by-engine heatmap, and recommendations.

On the engineering side: React front end, Python back end. Concurrency locked per slug, cost per run tracked end to end, 40 tests.

Key decision

Brandless questions run in a neutral, isolated conversation. We measure whether the brand comes up on its own, not whether the engine repeats what it was fed.

The thing that changes everything: brandless questions run in a conversation isolated from any context.

Trade-off

Live web search, like real use, but isolated from the global score. Cutting the web would have skewed the measurement. On broken numbering, the parser refuses to write rather than misattribute an answer.

One column is filled by headless conversations with live web search. The parser tolerates markdown and lists.

First real-client run: audit delivered and presented to an employer federation's executive committee. Now the proprietary tool behind the Cinq diagnostic.

Designing and shipping a new product alone: measurement design, robust parsing, concurrency and cost control, tests.