Home / Stage 5 of 6
๐Ÿ“ง Stage 5

Email Outreach

For contacts you have an email for but no LinkedIn connection, email is your channel. Done right, a well-written cold email costs fractions of a cent and reaches the decision-maker's inbox.

What is this?

Email outreach means sending personalized cold emails to verified contacts at target companies. Not mass spam โ€” targeted, personalized messages that reference the recipient's specific company and situation. A good cold email has a 30โ€“60% open rate and a 3โ€“8% reply rate.

What makes a good cold email?

Short. Specific. One ask. No attachments. No pitch deck. No "I hope this email finds you well."

How much does it cost?

Amazon SES charges $0.10 per 1,000 emails. Sending 10,000 emails costs $1.00. The bigger cost is your sending reputation โ€” which is why you send slowly, to verified addresses, with low bounce rates.

$0.10
per 1,000 emails via Amazon SES
30โ€“60%
open rate (targeted, personalized)
3โ€“8%
reply rate
50/day
safe sending limit while warming up
Email deliverability is earned, not assumed. A new sending domain gets no benefit of the doubt. You earn it by sending slowly, getting replies, and maintaining a low bounce rate. Skip this and your emails end up in spam.
1

Set up your sending infrastructure

Sign up for Amazon SES. Verify your sending domain (this adds DNS records that prove you own the domain). Set up DKIM, SPF, and DMARC โ€” these are email authentication records that tell receiving servers your emails are legitimate. Claude can write the exact DNS records you need.

2

Write your templates

Write 2โ€“3 versions of your opening email. Each should be under 150 words, reference something specific about the recipient's company, and end with one soft question. Use merge tags for personalization: {first_name}, {company_name}, {city}. A/B test the subject lines โ€” that's what determines whether the email gets opened at all.

3

Build the sending script

The script reads your database for contacts marked "queued for email," merges their data into your template, and sends via the Amazon SES API. It tracks what was sent and when, so you don't send duplicates. It runs every day on a schedule โ€” 50 emails in the morning, automatically.

4

Build the follow-up sequence

Most replies come after the second or third email. A follow-up sequence sends 2โ€“3 emails over 2โ€“3 weeks: the opener, a follow-up that adds a case study or social proof, and a final "closing the loop" email. Each is shorter than the last. The script checks for replies before sending follow-ups โ€” if someone replied, skip the rest of the sequence.

5

Monitor and adjust

After the first 200 emails, check your stats: open rate, reply rate, bounce rate, unsubscribe rate. If open rate is under 25%, rewrite your subject lines. If reply rate is under 2%, rewrite the body. If bounce rate is over 3%, your email list quality needs work โ€” filter out unverified addresses.

Amazon SES boto3 (AWS SDK) SQLite Windows Task Scheduler Jinja2 templating

Accounts & costs

Service What it does Cost
Amazon SES Transactional email sending at scale $0.10 per 1,000 emails
AWS (general) Required to access SES Free tier available
Claude Code Prompt โ€” Build the email sender
Build an email campaign manager using Amazon SES. Database: outreach.db (SQLite) Tables needed: - campaigns (id, name, subject_template, body_template, created_at) - campaign_contacts (id, campaign_id, contact_id, status, sent_at, opened_at, replied_at, sequence_step) Script: send_campaign.py 1. Read contacts where funnel_status='email_queued' and no existing campaign_contacts record for this campaign 2. Merge each contact's data into the template: {first_name}, {company_name}, {city} 3. Send via Amazon SES using boto3 (region us-east-1) 4. Log each send to campaign_contacts with status='sent' and sent_at=now Script: send_followups.py 1. Find contacts where status='sent' and sent_at was 7+ days ago and status!='replied' 2. Send follow-up email (sequence_step=2) 3. Find contacts where step=2 and sent 7+ days ago โ€” send final email (step=3) 4. Skip contacts where replied_at is populated Add a --dry-run flag that prints what would be sent without sending. Add a --limit 50 flag to cap how many go out per run. AWS credentials in .env as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
Claude Code Prompt โ€” Schedule the daily send
Create a Windows Task Scheduler task that runs my email campaign script every morning at 8am. Script: C:\path\to\send_campaign.py Python: C:\path\to\python.exe Arguments: send_campaign.py --limit 50 Working directory: C:\path\to\project Use the schtasks command to create the task. Name it "OutreachEmailSend". Also create a second task called "OutreachFollowup" that runs send_followups.py at 8:15am. Print the exact schtasks commands to run.

Email deliverability rules

โœ“ Send only to verified addresses. Bounces over 3% will get your SES account suspended.
โœ“ Include an unsubscribe link. Required by CAN-SPAM. Claude can add one with a one-click handler.
โœ“ Warm up slowly. Start at 25/day for the first week. Add 25/day each week until you reach your target volume.
โœ— Don't add attachments. They trigger spam filters. Link to a page instead.
โœ— Don't use the same template for every send. Spam filters detect identical messages. Vary the subject line and first sentence across batches.

Outreach Machine Playbook ยท Built with Claude Code ยท Back to overview