Email newsletter automation with Claude Code is one of those projects that sounds more ambitious than it actually is. Last month I built a complete newsletter system for a Vancouver consulting firm — content generation, subscriber management, send scheduling, all automated. The entire build took about three days, and now their weekly newsletter runs itself with about 20 minutes of review time from their side.
This isn't theoretical. It's live, sending to 2,400 subscribers every Thursday morning. The client went from spending four hours a week on newsletter production to approving a draft and hitting send. Here's exactly how I set it up, what worked, and where you still need a human in the loop.
Why I Built This Instead of Using Mailchimp
The client was paying $120/month for Mailchimp. That's not outrageous, but most of what they were paying for — templates, automation workflows, A/B testing — they weren't using. What they needed was simple: pull content from their blog and a few industry sources, format it into a readable email, and send it to their list every Thursday at 9 AM Pacific.
Mailchimp made that harder than it should be. They had to manually copy content into the email builder, adjust formatting, test on mobile, and then schedule. Every week. Four hours of work that followed the exact same pattern each time.
I realized we could strip it down to the actual mechanics: a script that generates the newsletter content, formats it as HTML, and sends it through an email API. No visual editor. No drag-and-drop. Just a system that does the same repeatable task every week without charging subscription fees that scale with list size.
The Core Components
The system has three main pieces:
- Content aggregation — pulls from RSS feeds, the client's WordPress blog, and a curated list of industry news sources
- Newsletter generation — Claude Code reads the raw content, extracts key points, rewrites it in the client's voice, and formats it as HTML email sections
- Send management — stores subscribers in a Google Sheet, handles unsubscribes, and sends through SendGrid API on a cron schedule
Each part is modular. If the client wants to switch from SendGrid to Postmark, it's a 10-minute config change. If they want to add a new RSS feed, it's one line in a JSON file.
How the Content Generation Works
This is the part most people are skeptical about, and I get it. AI-generated newsletter content can read like generic filler if you're not careful about how you set it up.
The trick is giving Claude Code specific formatting rules and voice guidelines. I don't ask it to "write a newsletter" — that's too vague. Instead, the prompt looks more like this:
You are writing the weekly newsletter for [Client Name], a consulting firm that helps mid-market companies in Vancouver with [specific service area]. Tone: professional but conversational, no jargon, direct language Length: Each section is 80–120 words Structure: Headline, 1–2 paragraph summary, one actionable takeaway Below are three articles from this week's sources. Select the two most relevant to our audience and write newsletter sections for each. Focus on practical implications, not theory.
The content sources are pre-filtered. I'm not throwing random internet articles at Claude Code and hoping it picks good ones. The RSS feeds are curated — only sources the client already trusts. The system pulls 10–15 candidate articles per week, ranks them by relevance using keyword matching, and presents the top 5 to Claude Code for final selection and summarization.
The output quality is consistent. I've reviewed about 20 newsletters now, and the hit rate for "good enough to send with minimal edits" is around 85%. The other 15% usually just need a sentence rewritten for clarity or a stat double-checked.
Subscriber Management Without a Platform
One of the objections I hear a lot: "But doesn't Mailchimp handle unsubscribes and compliance automatically?" Yes. And so does this system, it just does it through a Google Sheet and a few lines of code instead of a proprietary dashboard.
Here's how it works:
- Subscribers are stored in a Google Sheet with columns for email, name, signup date, status (active/unsubscribed), and tags for segmentation
- Every email includes an unsubscribe link that hits a simple endpoint I built — it marks the subscriber as inactive in the sheet
- Before each send, the script pulls the active subscriber list from the sheet and passes it to SendGrid
- New signups come through a form on the client's website that appends directly to the sheet via Google Apps Script
It's not fancy, but it's compliant with CAN-SPAM and CASL (Canada's anti-spam law). Every email has the required unsubscribe link, physical address, and clear sender identification. The legal requirements are the same whether you're using Mailchimp or sending through an API — you just have to know what they are and implement them correctly.
One benefit of the Google Sheet approach: the client can easily segment their list without learning a new interface. Want to send a special announcement only to subscribers who signed up in the last 90 days? Filter the sheet, export the emails, and pass them to the send script. No need to navigate Mailchimp's segmentation UI.
The Email Sending Infrastructure
For the actual email delivery, I use SendGrid. There are other options — Postmark, Amazon SES, Mailgun — but SendGrid has a generous free tier (100 emails/day, which works for testing) and their API is straightforward.
The client is on SendGrid's $15/month plan, which covers 15,000 emails. For a 2,400-subscriber list sending weekly, that's more than enough. Compare that to Mailchimp's $120/month for the same list size.
The send script does a few things to keep deliverability high:
- Sends in batches of 500 with a 2-minute delay between batches (avoids looking like spam)
- Personalizes the "From" name and subject line with subscriber data when available
- Tracks opens and clicks through SendGrid's built-in analytics (same data you'd get from Mailchimp)
- Automatically removes hard bounces from the Google Sheet
The whole send process runs on a Google Cloud Function triggered by a cron job every Thursday at 9 AM. If something fails — API error, formatting issue, whatever — I get a Slack notification with the error log. The client never sees it unless I need to intervene.
What You Still Need a Human For
This system is automated, but it's not unsupervised. There are a few checkpoints where human judgment matters:
- Content approval — the draft goes to the client every Wednesday afternoon for review, they have until Thursday morning to edit or approve
- Source curation — every month I review the RSS feed list with the client and add or remove sources based on what's been working
- Subscriber hygiene — once a quarter we go through the list and remove subscribers who haven't opened in 6+ months (keeps deliverability high)
The time commitment on the client's side is minimal — maybe 30 minutes a week total. But those 30 minutes are focused on the parts that actually require expertise: deciding whether a piece of content is on-brand, catching factual errors, adjusting tone when needed.
That's the right balance. Automate the repetitive stuff, keep humans in the loop for judgment calls.
How This Could Work for Your Business
If you're running a weekly or biweekly newsletter and spending more than an hour per issue on production, this approach will save you time and money. The upfront build takes 2–4 days depending on complexity. After that, the ongoing cost is just the email API (usually $10–30/month) and occasional maintenance when you want to add features.
It works especially well if:
- Your newsletter follows a consistent format every issue
- You're aggregating content from predictable sources (your blog, industry news, etc.)
- You don't need advanced features like dynamic product recommendations or complex segmentation
- Your list is under 10,000 subscribers (above that, you might benefit from a full ESP's infrastructure)
It's not the right fit if you're doing heavy A/B testing, running complex drip campaigns, or need a visual editor for non-technical team members. For those cases, stick with Mailchimp or ConvertKit. But for a straightforward weekly newsletter that follows a template, Claude Code email newsletter automation gets you 90% of the functionality at 10% of the cost.
If you want to explore how this could work for your specific newsletter setup, I'm happy to walk through it on a call. And if you're curious about other email marketing automation workflows I've built with Claude Code, I've written about those too. You can also check out my guide on automating content pipelines and my breakdown of CRM workflow automation with Claude Code.
The tools are here. The question is whether you're ready to stop doing the same manual work every week and let a system handle it instead.