Overview
Score each candidate business against live Google results before it enters your email sequence, so you only spend deliverability and reply-rate on leads that are real and active. A common cold-email build enrolls every scraped row and then wonders why bounce rates climb; adding a qualification gate up front fixes the input instead of the output. To be clear about scope: this qualifies leads (is the business real, active, findable). It does not handle deliverability. SPF, DKIM, DMARC, and warm-up are a separate layer and still mandatory. Each Google lookup is 1-2 credits on Scavio ($0.005/credit).
Trigger
A new batch of candidate businesses (names plus city, or raw domains) lands in your list.
Schedule
On each new lead batch (or nightly against a rolling import).
Workflow Steps
Search each business on Google
Query the business name plus city on the Google endpoint. A real, active business surfaces its own site, a map presence, and recent mentions; a dead or fake one returns thin or mismatched results.
Score the signals
Award points for an owned domain in the results, a knowledge-graph or map presence, recent-looking mentions, and reviews. Subtract for directory-only results or a name that resolves to a different company.
Drop or deprioritize the low scores
Set a threshold (for example, keep only leads scoring 3 of 5). Route the rest to a hold list instead of the sequence; do not pay send reputation for leads that will bounce or ignore you.
Enroll only the qualified leads
Pass the survivors to your sending tool with the enriched fields (verified domain, category, a personalization hook from the SERP). Now the sequence runs on leads worth emailing.
Python Implementation
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
DIRECTORY_DOMAINS = {"yelp.com", "yellowpages.com", "facebook.com", "linkedin.com"}
def qualify(name, city):
q = f"{name} {city}"
data = requests.post("https://api.scavio.dev/api/v1/google", headers=H,
json={"query": q, "light_request": False}).json()
organic = data.get("organic_results", [])
score = 0
owned = next((o for o in organic[:5]
if not any(d in o["link"] for d in DIRECTORY_DOMAINS)), None)
if owned: score += 2 # has its own site
if data.get("knowledge_graph"): score += 2 # map / brand presence
if len(organic) >= 5: score += 1 # findable at all
hook = owned["title"] if owned else None
return {"name": name, "score": score, "domain": owned["link"] if owned else None, "hook": hook}
batch = [("Cedar Park Dental", "Austin TX"), ("No Such Cafe", "Nowhere")]
qualified = [r for r in (qualify(n, c) for n, c in batch) if r["score"] >= 3]
print(qualified)JavaScript Implementation
const H = { Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`, "Content-Type": "application/json" };
const DIRECTORY = ["yelp.com", "yellowpages.com", "facebook.com", "linkedin.com"];
async function qualify(name, city) {
const r = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST", headers: H,
body: JSON.stringify({ query: `${name} ${city}`, light_request: false }),
});
const data = await r.json();
const organic = data.organic_results ?? [];
const owned = organic.slice(0, 5).find((o) => !DIRECTORY.some((d) => o.link.includes(d)));
let score = 0;
if (owned) score += 2;
if (data.knowledge_graph) score += 2;
if (organic.length >= 5) score += 1;
return { name, score, domain: owned?.link ?? null };
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Community, posts & threaded comments from any subreddit