El problema
Las clasificaciones caen y nadie se da cuenta durante días o semanas. Cuando alguien revisa el panel de SEO, el daño se ha agravado. Una página que cayó de la posición 3 a la 15 hace tres días ya ha perdido cientos de clics. Las herramientas tradicionales de seguimiento de clasificación se actualizan semanalmente, en el mejor de los casos, y envían correos electrónicos genéricos que se ignoran. No existe un sistema de alerta en tiempo real que se active en el momento en que se produce un cambio significativo en la clasificación, por lo que la recuperación siempre comienza tarde.
La solucion de Scavio
Scavio le permite crear un sistema de monitoreo de clasificación liviano que se ejecuta diariamente, verifica sus palabras clave objetivo en Google, compara posiciones con su línea de base almacenada y activa una alerta en el momento en que una clasificación cae por debajo de un umbral configurable. Todo el sistema es un único script Python o Node que se ejecuta en un cron. Usted define las palabras clave, el dominio y el umbral de caída, y el sistema se encarga del resto. La detección ocurre dentro de las 24 horas posteriores al cambio, no una semana después en un panel que nadie abrió.
Antes
Antes de Scavio, las caídas en el ranking pasaban desapercibidas durante días o semanas. Cuando el equipo de SEO revisó el panel, la recuperación ya estaba retrasada y el tráfico orgánico había sufrido un impacto mensurable.
Después
Después de Scavio, las caídas de clasificación activan alertas dentro de las 24 horas. El equipo de SEO comienza la recuperación el mismo día que ocurre la caída, minimizando la pérdida de tráfico y la exposición competitiva.
Para quien es
Equipos de SEO, especialistas en marketing de contenidos y propietarios de sitios que necesitan una notificación inmediata cuando las clasificaciones caen en lugar de descubrir cambios días después en un panel. Cualquiera que haya perdido tráfico debido a una caída en el ranking pasó desapercibido.
Beneficios clave
- Comprobación diaria de rango con alertas de caída instantáneas
- Umbrales configurables para cambios de posición y posiciones mínimas
- Implementación de script único en cualquier programador cron
- Alertas a través del webhook de Slack, correo electrónico o cualquier punto final HTTP
- El seguimiento de posiciones históricas crea una base recuperable
Ejemplo en Python
import requests
import json
from pathlib import Path
API_KEY = "your_scavio_api_key"
DOMAIN = "yourdomain.com"
DROP_THRESHOLD = 3 # Alert if position drops by 3 or more
def check_rank(keyword: str) -> int | None:
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()
for item in res.json().get("organic", []):
if DOMAIN in item.get("link", ""):
return item["position"]
return None
def run_rank_alerts(keywords: list[str]):
baseline_path = Path("rank_baseline.json")
baseline = json.loads(baseline_path.read_text()) if baseline_path.exists() else {}
alerts = []
for kw in keywords:
current = check_rank(kw)
previous = baseline.get(kw)
if current and previous and (current - previous) >= DROP_THRESHOLD:
alerts.append({
"keyword": kw,
"previous_position": previous,
"current_position": current,
"drop": current - previous,
})
if current:
baseline[kw] = current
baseline_path.write_text(json.dumps(baseline, indent=2))
if alerts:
print(f"RANK DROP ALERT: {len(alerts)} keywords dropped")
for a in alerts:
print(f" {a['keyword']}: #{a['previous_position']} -> #{a['current_position']} (dropped {a['drop']})")
else:
print(f"All {len(keywords)} keywords stable")
keywords = ["your target keyword", "another keyword", "third keyword"]
run_rank_alerts(keywords)Ejemplo en JavaScript
const API_KEY = "your_scavio_api_key";
const DOMAIN = "yourdomain.com";
const DROP_THRESHOLD = 3;
async function checkRank(keyword) {
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();
for (const item of data.organic ?? []) {
if (item.link?.includes(DOMAIN)) return item.position;
}
return null;
}
async function runRankAlerts(keywords) {
const fs = await import("fs/promises");
let baseline = {};
try { baseline = JSON.parse(await fs.readFile("rank_baseline.json", "utf8")); } catch {}
const alerts = [];
for (const kw of keywords) {
const current = await checkRank(kw);
const previous = baseline[kw];
if (current && previous && current - previous >= DROP_THRESHOLD) {
alerts.push({ keyword: kw, previousPosition: previous, currentPosition: current, drop: current - previous });
}
if (current) baseline[kw] = current;
}
await fs.writeFile("rank_baseline.json", JSON.stringify(baseline, null, 2));
if (alerts.length) {
console.log(`RANK DROP ALERT: ${alerts.length} keywords dropped`);
for (const a of alerts) console.log(` ${a.keyword}: #${a.previousPosition} -> #${a.currentPosition} (dropped ${a.drop})`);
} else {
console.log(`All ${keywords.length} keywords stable`);
}
}
await runRankAlerts(["your target keyword", "another keyword", "third keyword"]);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA