Workflow

Cold Email Outreach with SERP Audit Personalization

Workflow that audits each prospect's SERP presence and generates personalized cold email hooks based on their actual search rankings and AI Overview status.

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

1

Load Prospect List

Read the prospect CSV with company names and domains.

2

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.

3

Generate Personalization Hooks

Based on the SERP audit, generate email hooks: missing from AI Overview, competitor outranking them, no Knowledge Graph, etc.

4

Format Email Drafts

Combine the personalization hooks with email templates. Output one draft per prospect.

5

Export for Sending

Write the personalized emails to a CSV or push directly to the email sending tool.

Python Implementation

Python
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

JavaScript
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

Google

Web search with knowledge graph, PAA, and AI overviews

Frequently Asked Questions

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.

This workflow uses a daily before outreach, or on-demand per prospect batch.. Daily.

This workflow uses the following Scavio platforms: google. Each platform is called via the same unified API endpoint.

Yes. Scavio's free tier includes 250 credits per month with no credit card required. That is enough to test and validate this workflow before scaling it.

Cold Email Outreach with SERP Audit Personalization

Workflow that audits each prospect's SERP presence and generates personalized cold email hooks based on their actual search rankings and AI Overview status.