Resumen
Companies con declining resena puntuaciones o high complaint volumes son actively looking for alternatives. Este flujo de trabajo searches for company resenas diario, extrae sentiment senales, y puntuaciones leads basado on resena pain indicators. A company dropping de 4.5 to 3.2 stars on G2 es un warmer lead than one con stable 4.8 stars.
Desencadenador
Diario cron at 07:00 UTC
Programación
Diario at 07:00 UTC
Pasos del flujo de trabajo
Cargar objetivo companies
Leer el lista of companies in your ICP (Ideal Cliente Profile) ese you quiere to monitorear for resena cambios.
Search for resenas
Consulta cada company nombre con 'resenas' y 'complaints' modifiers to encontrar reciente resena contenido.
Extraer resena senales
Analizar search fragmentos for star ratings, resena counts, y sentiment palabras clave (complaints, problemas, switching, alternative).
Puntuacion leads
Assign un lead puntuacion basado on: declining ratings (+20), complaint volume (+15), 'switching' menciones (+25), reciente negative press (+10).
Salida ranked lista
Sort by puntuacion y salida el top leads for sales outreach con el especifico pain senales encontrado.
Implementacion en Python
import requests, os, json, re
H = {"x-api-key": os.environ["SCAVIO_API_KEY"], "Content-Type": "application/json"}
PAIN_KEYWORDS = ["complaint", "issue", "problem", "switching", "alternative", "worst", "terrible", "migrating"]
def score_lead(company):
queries = [f'"{company}" reviews 2026', f'"{company}" complaints OR issues']
score = 0
signals = []
for q in queries:
r = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google", "query": q}).json()
for o in r.get("organic", [])[:5]:
snippet = (o.get("snippet", "") or "").lower()
for kw in PAIN_KEYWORDS:
if kw in snippet:
score += 10
signals.append(f"{kw} found in: {o.get('title', '')[:50]}")
rating_match = re.search(r'(\d\.\d)\s*/\s*5|rating.*?(\d\.\d)', snippet)
if rating_match:
rating = float(rating_match.group(1) or rating_match.group(2))
if rating < 3.5:
score += 20
signals.append(f"Low rating: {rating}/5")
return {"company": company, "score": score, "signals": signals[:5]}
companies = ["Competitor A", "Competitor B", "Competitor C"]
leads = sorted([score_lead(c) for c in companies], key=lambda x: -x["score"])
for l in leads:
print(f"{l['company']}: score={l['score']}, signals={len(l['signals'])}")Implementacion en JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
const PAIN_KEYWORDS = ["complaint", "issue", "problem", "switching", "alternative", "worst", "terrible", "migrating"];
async function scoreLead(company) {
const queries = [`"${company}" reviews 2026`, `"${company}" complaints OR issues`];
let score = 0;
const signals = [];
for (const q of queries) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: q})
}).then(r => r.json());
for (const o of (r.organic || []).slice(0, 5)) {
const snippet = (o.snippet || "").toLowerCase();
for (const kw of PAIN_KEYWORDS) {
if (snippet.includes(kw)) {
score += 10;
signals.push(`${kw} in: ${(o.title || "").slice(0, 50)}`);
}
}
const match = snippet.match(/(\d\.\d)\s*\/\s*5|rating.*?(\d\.\d)/);
if (match) {
const rating = parseFloat(match[1] || match[2]);
if (rating < 3.5) { score += 20; signals.push(`Low rating: ${rating}/5`); }
}
}
}
return {company, score, signals: signals.slice(0, 5)};
}
Promise.all(["Competitor A", "Competitor B"].map(scoreLead)).then(leads => {
leads.sort((a, b) => b.score - a.score);
leads.forEach(l => console.log(`${l.company}: score=${l.score}, signals=${l.signals.length}`));
});Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA