El problema
Los equipos de SEO hacen malabarismos con tres fuentes de datos que nunca se comunican entre sí: Google Search Console para impresiones y clics, GA4 para comportamiento en el sitio y datos SERP para posicionamiento competitivo. Correlacionar una caída en la clasificación con una caída en el tráfico y una caída en la conversión requiere exportaciones manuales desde tres paneles y una hoja de cálculo. La correlación es obvia en retrospectiva, pero invisible cuando los datos viven en silos. Cuando alguien construye la referencia cruzada, la oportunidad de actuar ya ha pasado.
La solucion de Scavio
Cree un canal de análisis que extraiga datos de GSC a través de la API, datos de GA4 a través de la API de informes y datos SERP en vivo a través de Scavio, y luego los una por palabra clave y URL. El conjunto de datos combinado muestra la historia completa: esta palabra clave cayó de la posición 3 a la posición 8 (Scavio), las impresiones cayeron un 40 % (GSC), las sesiones orgánicas cayeron un 35 % (GA4) y las conversiones cayeron en consecuencia. La canalización se ejecuta semanalmente a través de MCP o cron y genera un informe unificado que muestra las correlaciones automáticamente.
Antes
Antes de este proceso, correlacionar los cambios de clasificación con el tráfico y los impactos de conversión requería exportaciones CSV manuales desde tres plataformas y una hoja de cálculo que tardaba horas en construirse y estaba desactualizada antes de terminar.
Después
Después de crear el canal combinado, los cambios de clasificación se correlacionan automáticamente con el tráfico y los impactos de la conversión. El informe semanal muestra la historia completa en una sola vista y el equipo actúa sobre los lanzamientos la misma semana en que ocurren.
Para quien es
Equipos de SEO que necesitan correlacionar los cambios de clasificación con el tráfico y los impactos de la conversión, pero que están cansados de realizar referencias cruzadas manuales entre los paneles de datos de GSC, GA4 y SERP.
Beneficios clave
- Vista unificada de clasificaciones, tráfico y conversiones por palabra clave
- Correlación automática entre los cambios de SERP y el impacto empresarial
- El informe automatizado semanal sustituye a las referencias cruzadas manuales
- La integración de MCP permite consultas bajo demanda de cualquier agente
- Detecta caídas de conversión de tráfico en la clasificación en la misma semana en que ocurren
Ejemplo en 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")Ejemplo en 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`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA