Methodology

How Plavra measures your brand’s visibility across AI models.

This page is an honest disclosure of the scan engine: which models are queried, which prompt is sent, which default parameters apply, and why our answers can diverge — within 10–20 % — from what you see in your personal ChatGPT tab. If you’re evaluating Plavra, this is what you’re paying for. No hidden box, no proprietary formula.

No commitment · secure European billing.

Queried models.

On every scan Plavra queries four AI models — one per provider, through the shared AI proxy we operate. These are the public APIs, not the consumer-facing surfaces (chat.openai.com, claude.ai, gemini.google.com, perplexity.ai). That nuance is explained below in “Why our answers diverge from your ChatGPT”.

  • OpenAI / ChatGPT — a current GPT-series model executed through the API. The exact version is owned by the proxy and can change; the snapshot in production is subject to evolve without notice.
  • Anthropic / Claude — a Claude Sonnet-family model executed through the API. Same versioning rule: snapshot subject to evolve.
  • Google / Gemini — a Gemini-family model executed through the API, with server-side web search enabled so the response can cite verifiable sources.
  • Perplexity / answer engine — a search-oriented answer engine executed through the API; the only one of the four whose native behavior includes systematic URL citation.

Mistral models (Mistral Large and Pixtral Large) are not yet wired into the unified scan engine: they remain covered through the dedicated positioning guide on /en/seo/visibilite-marque-mistral. If Mistral lands in the engine, this page gets refreshed the same day.

Prompt sent.

For every buying question in your scan, Plavra sends the same prompt template to each of the four models. The bracketed slots — <brand>, <competitors>, <question> — are runtime-substituted by the engine per scan. Everything else in the text is exactly what the model receives.

Tu es un analyste de visibilité IA pour acheteurs francophones.

Marque analysée : <brand>.
Concurrents connus : <competitors>.
Question réelle posée par un acheteur : "<question>".

Réponds comme si tu répondais à cet acheteur : sois utile, concret, et
nomme les marques qui apparaissent vraiment dans la réponse.

Quand tu as terminé, ajoute EXACTEMENT ce bloc JSON sur la dernière
ligne (sans texte après) :

{"mentioned_brands": ["..."], "sources": ["https://..."], "brand_sentiment": "positive|neutral|negative"}

Règles :
- "mentioned_brands" doit lister les marques citées dans ta réponse, en
  minuscules, sans la marque analysée si elle n'apparaît pas.
- "sources" doit lister les URLs que tu cites réellement dans ta réponse
  (visibles ou implicites) ; laisse vide si tu n'en cites aucune.
- Si un titre de page ou une marque mise en avant est connu pour chaque
  source, ajoute un tableau "source_meta" aligné sur "sources" par
  index : [{"title": "...", "favoredBrand": "..."}, ...].
- "brand_sentiment" reflète le ton global de ta réponse vis-à-vis de
  "<brand>" : positive si elle est recommandée, neutral si elle est
  mentionnée sans jugement, negative si elle est écartée ou critiquée.

The prompt also asks for a JSON tail — mentioned_brands, sources, brand_sentiment — which Plavra uses to count mentions and score tone without re-inference. If the model omits the tail, the prose remains valid but Plavra records the mention as unknown on the offending model row.

Default parameters.

These values aren’t negotiable on the Starter plan: they’re the same for every customer and they guarantee that two comparable scans produce comparable numbers.

  • Per-model timeout: 45 s. If a model doesn’t answer inside the window, Plavra marks it unavailable and the row drops to partial rather than blocking the whole scan.
  • Response cache: 24 h. The same {model, brand, competitors, question}tuple is served from cache for 24 hours. That’s why a second scan within the same day finishes almost instantly and matches the first one to the word.
  • Fan-out per question × per model. Each scan issues, for every buying question, four simultaneous model calls through Promise.allSettled. One model failing doesn’t poison the others.
  • Response shape: { answer, sources, mentionedBrands, sentiment, citations, failureCode, outboundUrl }. mentionedBrands is normalised lowercased; sentiment is forced to positive, neutral, or negative (out-of-range values fall back to neutral).

Why our answers diverge from your ChatGPT.

Plavra queries the providers’ public APIs, not the consumer-facing interfaces. The two channels are operated by the same provider, but they don’t return exactly the same answer to the same question. Here’s why — and why it’s normal.

On the chat side, the application adds invisible layers: retrieval-augmented generation over the conversation history, default-on plugins, long-term memory, proprietary system scaffolds (for example OpenAI’s “Custom Instructions”, Anthropic’s “Memories”), and possible routing to a different model than the one you expect. None of that is present in a naked POST /chat/completions call. Plavra sends a standardised API call — no scaffold, same prompt to every model.

On the provider side, models sometimes expose older or newer snapshots on the API than on the chat. Providers occasionally route the chat to the most capable model and keep the API on a more stable — and cheaper — snapshot. It is not uncommon for the same model, served through two channels, to diverge by 10–20 % on factual figures.

This isn’t a bug, it’s a structural difference. Plavra owns the posture: methodology is reproducible, calls are traced, marginal cost is known. An AEO consultant replaying the same question inside ChatGPT can reasonably expect a 10–20 % variance — and that’s exactly why aggregating four models gives a more reliable signal than one isolated citation from a single product.

Honest limits.

To close the disclosure: here is what Plavra does NOT pretend to do — or only does under specific conditions.

  • Rate limits and outages surface as partial or failed on the offending model row. A partial scan stays usable: a failure doesn’t get hidden, it gets explained.
  • 24 h cache: if the underlying model evolves between two scans, the new answer is only revealed once the cache expires. It’s a deliberate compromise to keep cost and latency in check.
  • Brand normalisation: mentioned brands match in lower case. “Lacoste” and “LACOSTE” match; “Lacoste Paris” and “Lacoste” do not — they’re distinct entities on the source side.
  • Mistral: the unified engine doesn’t cover Mistral yet. For a dedicated track on Mistral models, see /en/seo/visibilite-marque-mistral.
  • Multi-brand & agencies: the Starter plan (€49/mo) covers one brand. For agencies and consultants running several client brands, the Enterprise plan at €399/mo includes unlimited brands and competitors, with no per-brand or per-seat surcharge.

Convinced?

We’ll let you activate Starter.

€49/mo, no commitment: one brand, up to 5 competitors, 30 buying questions tracked weekly across the four queried models. Cancel anytime, secure European Stripe billing.