Email Automation Workflow
Send personalized emails at scale with AI
What you’ll build
A workflow that fetches contacts, generates personalized email content with AI, and sends targeted emails automatically.
Time to build: 15 minutes
Nodes used: Google Sheets, Loop, LLM, Email Sender
The problem
Sending personalized emails manually is time-consuming:
- Writing individual emails takes hours
- Personalization is often superficial
- Hard to scale beyond a few dozen contacts
- Difficult to maintain consistency
This workflow automates personalized outreach while maintaining quality.
Workflow overview
graph LR
A[Contact List] --> B[Loop]
B --> C[LLM Personalize]
C --> D[Email Sender]
D --> E[Log Results]
Step-by-step guide
Step 1: Prepare your contact list
Create a Google Sheet with your contacts:
| Name | Company | Role | Context | |
|---|---|---|---|---|
| John | john@acme.com | Acme Inc | CMO | Met at conference |
| Sarah | sarah@beta.io | Beta Corp | Head of Growth | Downloaded whitepaper |
The Context column helps the AI personalize effectively.
Step 2: Create the workflow
- Click New Workflow
- Name it “Email Outreach”
Step 3: Fetch contacts
Add Google Sheets Reader
Configure:
- Spreadsheet ID: Your contacts sheet
- Range:
Contacts!A:E - Include Headers: Yes
Step 4: Loop through contacts
Add Loop node
Configure:
- Items:
{{data}} - Max Iterations: 50 (start small)
Step 5: Generate personalized email
Add LLM node
Configure:
- Model: GPT or Claude
- Temperature: 0.7 (for creative variation)
- Instructions:
Write a personalized outreach email for this contact.
Contact Information:
- Name: {{name}}
- Company: {{company}}
- Role: {{role}}
- Context: {{context}}
Email Guidelines:
- Subject line: Catchy, personalized, under 50 characters
- Opening: Reference the context/how we connected
- Body: Explain our value proposition briefly
- CTA: Clear, specific ask
- Tone: Professional but friendly
- Length: Under 150 words
Our Value Proposition:
[Your product/service description here]
Output format:
{
"subject": "...",
"body": "..."
} Step 6: Send the email
Add Email Sender node
Configure:
- To:
{{email}} - Subject:
{{subject}} - Body:
{{body}} - From: Your email address
Step 7: Log results
Add Google Sheets Writer
Configure:
- Spreadsheet ID: Your tracking sheet
- Operation: Append
- Values:
[[
"{{email}}",
"{{subject}}",
"{{timestamp}}",
"sent"
]] Sample output
Subject: Quick question about Acme’s growth strategy, John
Body:
Hi John,
Great connecting at the SaaS conference last week! Your talk on
scaling marketing teams really resonated with our approach.
I noticed Acme is expanding rapidly - we've helped similar
companies automate their content workflows, saving 15+ hours
per week.
Would you have 15 minutes this week to explore if this could
help your team?
Best,
[Your name]
Advanced options
Add research enrichment
Scrape the contact’s company before writing:
graph LR
A[Contact] --> B[Web Scraper]
B --> C[LLM with Research]
C --> D[Email]
Update your prompt:
Company Website Content: {{WebScraper_0.content}}
Use this information to reference specific things about
their company, recent news, or products.
A/B test subject lines
Generate multiple versions and track performance:
Output format:
{
"subject_a": "...",
"subject_b": "...",
"body": "..."
}
Then use a Conditional node to alternate between versions.
Schedule sends
Spread emails over time to avoid spam filters:
- Add a delay between emails
- Set max emails per hour (20-30)
- Schedule workflow to run at optimal times
Best practices
Warm up your sending
Start with small batches:
| Week | Emails/day |
|---|---|
| 1 | 10 |
| 2 | 25 |
| 3 | 50 |
| 4+ | 100+ |
Personalization quality
More context = better personalization:
| Context Level | Example |
|---|---|
| Low | ”Company employee” |
| Medium | ”CMO at growing SaaS” |
| High | ”CMO at Acme, met at conference, interested in automation” |
Monitor deliverability
Track key metrics:
- Open rate (target: 40%+)
- Reply rate (target: 5%+)
- Bounce rate (keep under 2%)
- Spam complaints (keep under 0.1%)
Respect opt-outs
Add logic to check unsubscribe list:
Conditional:
If email NOT in unsubscribe_list
→ Send email
Else
→ Skip and log
Results you can expect
| Metric | Manual | With Draft & Goal |
|---|---|---|
| Emails/hour | 10-15 | 100+ |
| Personalization depth | Low | High |
| Reply rate | 2-3% | 8-12% |
| Time invested | Hours | Minutes |