Le problème
Les équipes SEO jonglent avec trois sources de données qui ne communiquent jamais entre elles : Google Search Console pour les impressions et les clics, GA4 pour le comportement sur le site, et les données SERP pour le positionnement concurrentiel. Corréler une baisse de classement avec une baisse de trafic et une baisse de conversion nécessite des exportations manuelles depuis trois tableaux de bord et un tableur. La corrélation est évidente avec le recul, mais invisible lorsque les données vivent en silos. Au moment où quelqu'un construit la référence croisée, l'opportunité d'agir est passée.
La solution Scavio
Construisez un pipeline d'analyse qui extrait les données GSC via l'API, les données GA4 via l'API de reporting et les données SERP en direct via Scavio, puis les joint sur le mot-clé et l'URL. L'ensemble de données combiné montre l'histoire complète : ce mot-clé est passé de la position 3 à la position 8 (Scavio), les impressions ont chuté de 40 % (GSC), les sessions organiques ont chuté de 35 % (GA4) et les conversions ont chuté en conséquence. Le pipeline s'exécute chaque semaine via MCP ou cron et produit un rapport unifié qui met automatiquement en évidence les corrélations.
Avant
Avant ce pipeline, corréler les changements de classement avec les impacts sur le trafic et les conversions nécessitait des exportations CSV manuelles depuis trois plateformes et un tableur qui prenait des heures à construire et était obsolète avant même d'être terminé.
Après
Après avoir construit le pipeline combiné, les changements de classement sont automatiquement corrélés aux impacts sur le trafic et les conversions. Le rapport hebdomadaire présente l'ensemble de l'histoire en une seule vue, et l'équipe agit sur les baisses la même semaine qu'elles se produisent.
À qui cela s'adresse
Équipes SEO qui ont besoin de corréler les changements de classement avec les impacts sur le trafic et les conversions mais qui sont fatiguées des références croisées manuelles entre les tableaux de bord des données GSC, GA4 et SERP.
Avantages clés
- Vue unifiée des classements, du trafic et des conversions par mot-clé
- Corrélation automatique entre les changements SERP et l'impact commercial
- Le rapport automatisé hebdomadaire remplace les références croisées manuelles
- L'intégration MCP permet des requêtes à la demande depuis n'importe quel agent
- Détecte les baisses de classement, de trafic et de conversion la même semaine qu'elles se produisent
Exemple Python
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
def get_serp_position(keyword: str, domain: str) -> dict:
"""Get current SERP position for a keyword."""
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword, "num": 30},
timeout=15,
)
res.raise_for_status()
data = res.json()
position = None
for item in data.get("organic", []):
if domain in item.get("link", ""):
position = item.get("position")
break
return {
"keyword": keyword,
"position": position,
"has_ai_overview": bool(data.get("ai_overview")),
"has_featured_snippet": bool(data.get("featured_snippet")),
}
def build_combined_report(keywords: list[str], domain: str, gsc_data: dict, ga4_data: dict) -> dict:
"""Combine SERP positions with GSC and GA4 data."""
rows = []
for kw in keywords:
serp = get_serp_position(kw, domain)
gsc = gsc_data.get(kw, {})
ga4 = ga4_data.get(kw, {})
rows.append({
"keyword": kw,
"serp_position": serp["position"],
"has_ai_overview": serp["has_ai_overview"],
"gsc_impressions": gsc.get("impressions", 0),
"gsc_clicks": gsc.get("clicks", 0),
"gsc_ctr": gsc.get("ctr", 0),
"ga4_sessions": ga4.get("sessions", 0),
"ga4_conversions": ga4.get("conversions", 0),
})
# Flag keywords with drops across all three signals
for row in rows:
row["alert"] = (
row["serp_position"] is not None
and row["serp_position"] > 10
and row["gsc_clicks"] > 0
)
return {
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"domain": domain,
"keywords": len(rows),
"alerts": sum(1 for r in rows if r["alert"]),
"rows": rows,
}
# Example: GSC and GA4 data would come from their respective APIs
gsc_data = {"your keyword": {"impressions": 1200, "clicks": 85, "ctr": 0.07}}
ga4_data = {"your keyword": {"sessions": 80, "conversions": 5}}
report = build_combined_report(["your keyword"], "yourdomain.com", gsc_data, ga4_data)
print(f"Report: {report['keywords']} keywords, {report['alerts']} alerts")Exemple JavaScript
const API_KEY = "your_scavio_api_key";
async function getSerpPosition(keyword, domain) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: keyword, num: 30 }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
let position = null;
for (const item of data.organic ?? []) {
if (item.link?.includes(domain)) { position = item.position; break; }
}
return { keyword, position, hasAiOverview: !!data.ai_overview };
}
async function buildReport(keywords, domain, gscData, ga4Data) {
const rows = [];
for (const kw of keywords) {
const serp = await getSerpPosition(kw, domain);
const gsc = gscData[kw] ?? {};
const ga4 = ga4Data[kw] ?? {};
rows.push({ keyword: kw, serpPosition: serp.position, hasAiOverview: serp.hasAiOverview, gscImpressions: gsc.impressions ?? 0, gscClicks: gsc.clicks ?? 0, ga4Sessions: ga4.sessions ?? 0, ga4Conversions: ga4.conversions ?? 0, alert: serp.position > 10 && (gsc.clicks ?? 0) > 0 });
}
return { date: new Date().toISOString().slice(0, 10), keywords: rows.length, alerts: rows.filter((r) => r.alert).length, rows };
}
const report = await buildReport(["your keyword"], "yourdomain.com", { "your keyword": { impressions: 1200, clicks: 85 } }, { "your keyword": { sessions: 80, conversions: 5 } });
console.log(`Report: ${report.keywords} keywords, ${report.alerts} alerts`);Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA