Overview
Generic cold emails get 2% reply rates. This workflow audits each prospect's Google SERP presence before composing the email: their ranking positions, AI Overview inclusion, Knowledge Graph status, and competitor positioning. Each email references the prospect's actual SERP situation, doubling or tripling reply rates.
Trigger
Daily before outreach, or on-demand per prospect batch.
Schedule
Daily
Workflow Steps
Load Prospect List
Read the prospect CSV with company names and domains.
Run SERP Audit per Prospect
For each prospect, search Google for their company name and brand keywords. Record organic positions, AI Overview presence, and competitor rankings.
Generate Personalization Hooks
Based on the SERP audit, generate email hooks: missing from AI Overview, competitor outranking them, no Knowledge Graph, etc.
Format Email Drafts
Combine the personalization hooks with email templates. Output one draft per prospect.
Export for Sending
Write the personalized emails to a CSV or push directly to the email sending tool.
Python Implementation
import requests, os, json
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
def serp_audit(company: str, domain: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": company, "country_code": "us"},
timeout=10,
)
data = resp.json()
organic = data.get("organic_results", [])
positions = [r["position"] for r in organic if domain in r.get("link", "")]
top_result = organic[0] if organic else {}
return {
"company": company,
"domain": domain,
"positions": positions,
"has_aio": bool(data.get("ai_overview")),
"has_kg": bool(data.get("knowledge_graph")),
"top_competitor": top_result.get("link", "") if top_result and domain not in top_result.get("link", "") else None,
}
def generate_hook(audit: dict) -> str:
if not audit["has_aio"]:
return f"{audit['company']} is not appearing in Google AI Overviews for brand searches. Competitors are getting that visibility instead."
if audit["top_competitor"]:
return f"{audit['top_competitor'].split('/')[2]} currently outranks {audit['company']} for brand searches on Google."
if not audit["positions"]:
return f"{audit['company']} does not appear in the first page of Google results for its own brand name."
return f"{audit['company']} ranks at position {audit['positions'][0]} for brand searches."
prospects = [{"company": "Acme Corp", "domain": "acme.com"}]
for p in prospects:
audit = serp_audit(p["company"], p["domain"])
hook = generate_hook(audit)
print(f"To: {p['company']}\nHook: {hook}\n")JavaScript Implementation
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function serpAudit(company, domain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:company, country_code:'us'})});
const d = await r.json();
const organic = d.organic_results||[];
const positions = organic.filter(r=>(r.link||'').includes(domain)).map(r=>r.position);
const top = organic[0];
return {company, domain, positions, hasAio:!!d.ai_overview, hasKg:!!d.knowledge_graph,
topCompetitor:top && !(top.link||'').includes(domain) ? top.link : null};
}
function generateHook(audit) {
if (!audit.hasAio) return audit.company+' is not appearing in Google AI Overviews for brand searches.';
if (audit.topCompetitor) return audit.topCompetitor.split('/')[2]+' currently outranks '+audit.company+' for brand searches.';
if (!audit.positions.length) return audit.company+' does not appear on the first page of Google for its own brand name.';
return audit.company+' ranks at position '+audit.positions[0]+' for brand searches.';
}
const prospects = [{company:'Acme Corp', domain:'acme.com'}];
for (const p of prospects) {
const audit = await serpAudit(p.company, p.domain);
console.log('To: '+p.company+'\nHook: '+generateHook(audit)+'\n');
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews