Resumen
Este flujo de trabajo refreshes franchise operator datos semanal a traves de todos monitored ubicaciones. It consultas Google for cada franchise marca + zip code combination, extrae actual ratings, resena counts, y competitive context, y flags ubicaciones con significativo cambios. Designed for franchise desarrollo teams seguimiento operator rendimiento y territory oportunidades.
Desencadenador
Cron programar (cada Sunday at 5 AM UTC)
Programación
Ejecuta cada Sunday at 5:00 AM UTC
Pasos del flujo de trabajo
Cargar franchise ubicacion base de datos
Leer todos monitored franchise marca + zip code combinations.
Consulta Google local datos
For cada ubicacion, consulta Scavio Google for actual local pack datos.
Extraer operator metricas
Analizar ratings, resena counts, addresses, y competitive menciones.
Comparar contra anterior semana
Marcar rating cambios, nuevo competidor openings, y ubicacion closures.
Actualizar ubicacion base de datos
Escribir actual datos to storage y generar cambio informe.
Implementacion en Python
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
def refresh_franchise_data(brands_zips: list[dict]) -> dict:
prev_path = Path("franchise_data.json")
previous = json.loads(prev_path.read_text()) if prev_path.exists() else {}
current = {}
changes = []
for entry in brands_zips:
brand = entry["brand"]
zip_code = entry["zip"]
key = f"{brand}_{zip_code}"
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": f"{brand} {zip_code}"},
timeout=15,
)
if not res.ok:
continue
organic = res.json().get("organic", [])
current[key] = {
"brand": brand,
"zip": zip_code,
"result_count": len(organic),
"top_result": organic[0].get("title", "") if organic else "",
"updated": datetime.utcnow().isoformat(),
}
prev = previous.get(key, {})
if prev.get("result_count") and current[key]["result_count"] != prev["result_count"]:
changes.append({"key": key, "prev_results": prev["result_count"], "current_results": current[key]["result_count"]})
prev_path.write_text(json.dumps(current, indent=2))
date = datetime.utcnow().strftime("%Y-%m-%d")
print(f"Franchise refresh {date}: {len(current)} locations, {len(changes)} changes")
return {"date": date, "locations": len(current), "changes": changes}
data = [
{"brand": "Subway", "zip": "75001"},
{"brand": "Subway", "zip": "75002"},
{"brand": "McDonald's", "zip": "75001"},
]
refresh_franchise_data(data)Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
async function refreshFranchise(brandsZips) {
const results = [];
for (const { brand, zip } of brandsZips) {
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: `${brand} ${zip}` }),
});
if (!res.ok) continue;
const organic = (await res.json()).organic ?? [];
results.push({ brand, zip, resultCount: organic.length, topResult: organic[0]?.title ?? "" });
}
console.log(`Refreshed ${results.length} franchise locations`);
return results;
}
await refreshFranchise([{ brand: "Subway", zip: "75001" }]);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA