Tutorial

How to Enrich Cold Email Prospects with Google Search

Enrich prospect CSVs with company signals from Google search: funding rounds, tech stack, hiring signals, and news. Python enrichment pipeline.

Enrich cold email prospects by loading a CSV of target domains, searching Google for each company's recent activity, parsing signals like funding rounds, tech stack mentions, hiring pages, and news coverage, scoring each prospect by signal strength, and exporting an enriched CSV ready for outreach. Generic cold emails get ignored. Enriched emails that reference a company's recent funding round or tech stack choice convert at 3-5x the rate. This pipeline automates the research step that sales reps do manually.

Prerequisites

  • Python 3.8+ installed
  • requests library installed
  • A Scavio API key from scavio.dev
  • A CSV file with prospect domains or company names

Walkthrough

Step 1: Load the prospect CSV

Read the prospect list and prepare it for enrichment.

Python
import os, requests, csv, json

API_KEY = os.environ['SCAVIO_API_KEY']

def load_prospects(csv_path: str) -> list:
    prospects = []
    with open(csv_path) as f:
        reader = csv.DictReader(f)
        for row in reader:
            prospects.append({
                'company': row.get('company', row.get('name', '')),
                'domain': row.get('domain', row.get('website', '')),
                'email': row.get('email', ''),
            })
    return prospects

# Demo data
prospects = [
    {'company': 'Acme Corp', 'domain': 'acme.com', 'email': 'cto@acme.com'},
    {'company': 'Beta Labs', 'domain': 'betalabs.io', 'email': 'founder@betalabs.io'},
]
print(f'Loaded {len(prospects)} prospects')

Step 2: Search each domain for signals

Run targeted Google searches for each prospect to find funding, hiring, tech stack, and news signals.

Python
SIGNAL_QUERIES = [
    ('{company} funding round 2026', 'funding'),
    ('{company} hiring engineers 2026', 'hiring'),
    ('{company} tech stack', 'tech_stack'),
    ('{company} news 2026', 'news'),
]

def search_signals(company: str) -> dict:
    signals = {}
    for query_template, signal_type in SIGNAL_QUERIES:
        query = query_template.format(company=company)
        resp = requests.post('https://api.scavio.dev/api/v1/search',
            headers={'x-api-key': API_KEY},
            json={'platform': 'google', 'query': query}, timeout=10)
        results = resp.json().get('organic_results', [])[:3]
        signals[signal_type] = [{
            'title': r.get('title', ''),
            'snippet': r.get('snippet', ''),
            'url': r.get('link', ''),
        } for r in results]
    return signals

signals = search_signals('Vercel')
for sig_type, results in signals.items():
    print(f'{sig_type}: {len(results)} results')

Step 3: Parse and extract key signals

Extract meaningful signals from search results: funding amounts, tech mentions, and hiring indicators.

Python
import re

def parse_signals(raw_signals: dict) -> dict:
    parsed = {'funding': '', 'hiring': False, 'tech_stack': [], 'recent_news': ''}
    # Funding
    for r in raw_signals.get('funding', []):
        text = f"{r['title']} {r['snippet']}"
        amounts = re.findall(r'\$[\d.]+[MBK]', text)
        if amounts:
            parsed['funding'] = amounts[0]
            break
    # Hiring
    for r in raw_signals.get('hiring', []):
        text = f"{r['title']} {r['snippet']}".lower()
        if any(w in text for w in ['hiring', 'open position', 'join our team', 'careers']):
            parsed['hiring'] = True
            break
    # Tech stack
    tech_keywords = ['react', 'python', 'node', 'aws', 'gcp', 'kubernetes', 'typescript', 'go', 'rust']
    for r in raw_signals.get('tech_stack', []):
        text = f"{r['title']} {r['snippet']}".lower()
        for tech in tech_keywords:
            if tech in text and tech not in parsed['tech_stack']:
                parsed['tech_stack'].append(tech)
    # News
    if raw_signals.get('news'):
        parsed['recent_news'] = raw_signals['news'][0].get('title', '')
    return parsed

parsed = parse_signals(signals)
print(json.dumps(parsed, indent=2))

Step 4: Score each prospect

Assign a signal score to each prospect based on the richness of data found.

Python
def score_prospect(parsed_signals: dict) -> int:
    score = 0
    if parsed_signals.get('funding'):
        score += 3  # Strong buy signal
    if parsed_signals.get('hiring'):
        score += 2  # Growth signal
    if len(parsed_signals.get('tech_stack', [])) >= 2:
        score += 2  # Tech-aware prospect
    if parsed_signals.get('recent_news'):
        score += 1  # Active company
    return score

def enrich_prospects(prospects: list) -> list:
    enriched = []
    for p in prospects:
        signals = search_signals(p['company'])
        parsed = parse_signals(signals)
        score = score_prospect(parsed)
        enriched.append({**p, **parsed, 'score': score})
        print(f"{p['company']}: score={score}")
    enriched.sort(key=lambda x: x['score'], reverse=True)
    return enriched

enriched = enrich_prospects(prospects)
for e in enriched:
    print(f"  {e['company']}: score={e['score']}, funding={e.get('funding', 'N/A')}")

Step 5: Export enriched CSV

Write the enriched prospect data to a new CSV ready for import into your outreach tool.

Python
def export_enriched(enriched: list, output_path: str = 'enriched_prospects.csv'):
    if not enriched:
        print('No prospects to export')
        return
    fieldnames = ['company', 'domain', 'email', 'score', 'funding', 'hiring', 'tech_stack', 'recent_news']
    with open(output_path, 'w', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction='ignore')
        writer.writeheader()
        for e in enriched:
            row = {**e}
            row['tech_stack'] = ', '.join(e.get('tech_stack', []))
            writer.writerow(row)
    print(f'Exported {len(enriched)} enriched prospects to {output_path}')

export_enriched(enriched)

Python Example

Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}

def enrich(company):
    signals = {}
    for q in [f'{company} funding 2026', f'{company} tech stack']:
        data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
            json={'platform': 'google', 'query': q}).json()
        signals[q] = [r.get('snippet', '')[:100] for r in data.get('organic_results', [])[:2]]
    return signals

print(enrich('Vercel'))

JavaScript Example

JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function enrich(company) {
  const signals = {};
  for (const q of [`${company} funding 2026`, `${company} tech stack`]) {
    const r = await fetch('https://api.scavio.dev/api/v1/search', {
      method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query: q})
    });
    signals[q] = ((await r.json()).organic_results || []).slice(0, 2).map(r => r.snippet?.slice(0, 100));
  }
  return signals;
}
enrich('Vercel').then(console.log);

Expected Output

JSON
An enriched prospect CSV with funding signals, hiring indicators, tech stack mentions, and recent news for each company, scored and sorted by signal strength.

Related Tutorials

Frequently Asked Questions

Most developers complete this tutorial in 15 to 30 minutes. You will need a Scavio API key (free tier works) and a working Python or JavaScript environment.

Python 3.8+ installed. requests library installed. A Scavio API key from scavio.dev. A CSV file with prospect domains or company names. A Scavio API key gives you 250 free credits per month.

Yes. The free tier includes 250 credits per month, which is more than enough to complete this tutorial and prototype a working solution.

Scavio has a native LangChain package (langchain-scavio), an MCP server, and a plain REST API that works with any HTTP client. This tutorial uses the raw REST API, but you can adapt to your framework of choice.

Start Building

Enrich prospect CSVs with company signals from Google search: funding rounds, tech stack, hiring signals, and news. Python enrichment pipeline.