Overview
Cold email campaigns fail when you blast generic messages to unresearched domains. This workflow takes a CSV of prospect domains, searches Google for each domain to extract company description, tech stack signals, recent news, and hiring patterns, parses the search results into structured enrichment fields, and exports an enriched CSV ready for your email sequencer. Every prospect gets a relevance score so you can prioritize high-fit leads. Scavio at $0.005 per search makes enriching 1,000 domains cost just $5.
Trigger
New prospect CSV uploaded
Schedule
On CSV upload (event-driven)
Workflow Steps
Load prospect domains
Parse the uploaded CSV to extract domain names and any existing firmographic data.
Search each domain
For each domain, query Google for the company name and domain. Extract organic results and AI Overview if available.
Parse enrichment signals
From search results, extract: company description, employee count signals, tech stack mentions, recent funding or news.
Score and rank prospects
Compute a relevance score based on tech stack match, company size, and recency of activity. Rank the list.
Export enriched CSV
Write the enriched data back to CSV with all new columns. Ready for import into your email sequencer.
Python Implementation
import requests, os, json, csv
from io import StringIO
H = {"x-api-key": os.environ["SCAVIO_API_KEY"]}
# Sample prospects (in production, load from CSV)
PROSPECTS = [
{"domain": "example-saas.com", "name": "Example SaaS"},
{"domain": "acme-ai.io", "name": "Acme AI"},
{"domain": "dataflow-labs.com", "name": "Dataflow Labs"},
]
def enrich_domain(prospect):
"""Search for a prospect domain and extract enrichment signals."""
r = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google",
"query": f"{prospect['name']} {prospect['domain']}",
"ai_overview": True}, timeout=10).json()
snippets = [o.get("snippet", "") for o in r.get("organic", [])[:5]]
titles = [o.get("title", "") for o in r.get("organic", [])[:5]]
aio = r.get("ai_overview", {})
all_text = " ".join(snippets + titles).lower()
# Simple signal extraction
signals = {
"has_funding_mention": any(w in all_text for w in ["raised", "funding", "series", "seed"]),
"has_hiring_signal": any(w in all_text for w in ["hiring", "careers", "open roles", "job"]),
"has_api_mention": "api" in all_text,
"result_count": len(r.get("organic", [])),
}
score = sum([
signals["has_funding_mention"] * 30,
signals["has_hiring_signal"] * 20,
signals["has_api_mention"] * 25,
min(signals["result_count"], 10) * 2.5,
])
return {
**prospect,
"description": snippets[0][:200] if snippets else "",
"ai_summary": aio.get("text", "")[:200] if aio else "",
"signals": signals,
"score": round(score)
}
enriched = []
for p in PROSPECTS:
result = enrich_domain(p)
enriched.append(result)
print(f"[{result['score']}] {result['name']} | {result['description'][:80]}")
enriched.sort(key=lambda x: x["score"], reverse=True)
print(f"\nEnriched {len(enriched)} prospects. Top: {enriched[0]['name']} (score: {enriched[0]['score']})")JavaScript Implementation
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
const PROSPECTS = [
{domain: "example-saas.com", name: "Example SaaS"},
{domain: "acme-ai.io", name: "Acme AI"},
{domain: "dataflow-labs.com", name: "Dataflow Labs"},
];
async function enrichDomain(prospect) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({
platform: "google",
query: `${prospect.name} ${prospect.domain}`,
ai_overview: true
})
}).then(r => r.json());
const snippets = (r.organic || []).slice(0, 5).map(o => o.snippet || "");
const titles = (r.organic || []).slice(0, 5).map(o => o.title || "");
const allText = [...snippets, ...titles].join(" ").toLowerCase();
const aio = r.ai_overview || {};
const signals = {
hasFunding: ["raised", "funding", "series", "seed"].some(w => allText.includes(w)),
hasHiring: ["hiring", "careers", "open roles", "job"].some(w => allText.includes(w)),
hasApi: allText.includes("api"),
resultCount: (r.organic || []).length,
};
const score = Math.round(
(signals.hasFunding ? 30 : 0) + (signals.hasHiring ? 20 : 0) +
(signals.hasApi ? 25 : 0) + Math.min(signals.resultCount, 10) * 2.5
);
return {
...prospect, description: (snippets[0] || "").slice(0, 200),
aiSummary: (aio.text || "").slice(0, 200), signals, score
};
}
(async () => {
const enriched = [];
for (const p of PROSPECTS) {
const result = await enrichDomain(p);
enriched.push(result);
console.log(`[${result.score}] ${result.name} | ${result.description.slice(0, 80)}`);
}
enriched.sort((a, b) => b.score - a.score);
console.log(`\nEnriched ${enriched.length} prospects. Top: ${enriched[0].name} (score: ${enriched[0].score})`);
})();Platforms Used
Web search with knowledge graph, PAA, and AI overviews