Skip to main content
← Back to Blog

Build an email sequence writer that actually sounds like you wrote it

Colin Gillingham··5 min read
gtm-automationhubspotai-agentssales-automationemail

This post is part of the GTM Automation Playbook — a 13-part series on building AI-powered GTM agents with HubSpot.


Every AI email tool promises personalization. What they deliver is mail merge with a synonym swap on the opener.

The problem isn't the model. It's that the model has no context. It doesn't know your prospect's tech stack, their company's recent funding round, or the specific pain point your rep surfaced on a discovery call six weeks ago. All of that context lives in HubSpot. The sequence writer just needs to use it.

Here's how to build one that does.

What "personalized" actually means

Personalization isn't mentioning someone's first name or their company name. That's table stakes and every spam filter knows it.

Real personalization means the email reflects something specific to this prospect at this moment — their company just hired a VP of Sales, their competitor launched a product last week, or they opened your pricing page three times. These signals are already in your CRM if you're enriching properly. The sequence writer's job is to pull them into copy that reads like a rep did the research.

The five-touch structure I use: touch one is the cold opener built on one specific signal, touch two adds value (a relevant case study or insight), touch three is a soft ask, touch four is a breakup frame, touch five is the genuine last try. Timing: day 1, day 4, day 8, day 14, day 21. Enough space to not be annoying, tight enough to stay top of mind.

The workflow

Build this in n8n. You need six nodes.

Node 1: Trigger. A HubSpot trigger fires when a contact is added to a specific list — I call it "Sequence Ready." Reps add contacts manually or enrollment logic does it automatically based on lead score or lifecycle stage.

Node 2: Pull contact context. HTTP Request to GET /crm/v3/objects/contacts/{contactId}?properties=firstname,lastname,jobtitle,email,phone,hs_lead_status,hubspot_owner_id&associations=company,notes,engagements. Then a second call to get the associated company: GET /crm/v3/objects/companies/{companyId}?properties=name,domain,industry,annualrevenue,numberofemployees,city,hs_lastmodifieddate.

Node 3: Pull recent signals. HTTP Request to GET /crm/v3/objects/notes/batch/read with the note IDs from the contact association. Pull hs_note_body from each, sorted by timestamp, last three notes only. This gives the model the most recent conversation context without blowing up the prompt.

Node 4: Generate the sequence. Basic LLM Chain with Claude Sonnet. Pass all the context and ask for five emails, each labeled by touch number and day. The system prompt matters here:

You are writing a 5-touch cold outreach sequence for a B2B sales rep.

CONTACT:
- Name: {{ $json.firstname }} {{ $json.lastname }}
- Title: {{ $json.jobtitle }}
- Company: {{ $json.company_name }}
- Industry: {{ $json.industry }}
- Company size: {{ $json.numberofemployees }} employees

RECENT NOTES FROM REP:
{{ $json.notes_combined }}

SEQUENCE RULES:
- Touch 1 (Day 1): One specific signal or observation. Under 75 words. No ask.
- Touch 2 (Day 4): One piece of value — a case study, insight, or resource relevant to their role or industry. Under 100 words. Soft ask at end.
- Touch 3 (Day 8): Direct ask for a 20-minute call. Reference touch 1 signal. Under 60 words.
- Touch 4 (Day 14): Frame as checking if timing is wrong. One question. Under 50 words.
- Touch 5 (Day 21): Genuine close. Under 40 words.

Never use: "I wanted to reach out", "I hope this email finds you well", "touching base", "circling back", "synergy"
Always reference at least one specific detail from the contact or company data.
Write subject lines for each email.

Node 5: Parse and store. Use a Function node to split the model's output into five separate email objects. Store them as a HubSpot note on the contact record with a custom property sequence_draft_ready = true. This flags the contact for rep review before enrollment.

Node 6: Notify the rep. Slack message or email to the contact owner with a link to the HubSpot contact record. The rep reviews the five drafts, edits anything that needs it, and enrolls manually in the HubSpot sequence.

The part most people skip

Don't auto-enroll. The model will get things wrong — wrong tone for the industry, a detail that's outdated, a case study that doesn't apply. Putting a human in the loop before send is the difference between a workflow that helps and one that creates cleanup work.

The rep's job shifts from writing from scratch to reviewing and approving. That's still a 10x time savings, and the quality ceiling is higher because you're starting from something with real context rather than a blank page.

What good looks like

A well-tuned sequence writer should produce touch one openers where a rep reads it and thinks "I would have written it almost exactly like this." That's the calibration target. If they're rewriting more than 20% of touch one, your prompt needs work — add examples of good openers from your best reps and tell the model to match that style.

The model gets the structure right quickly. Voice takes longer. Budget two weeks of tuning before you roll this out to the full team.

Colin Gillingham

Need a Fractional Head of AI?

I help companies build an AI operating system — shared context across teams, AI handling the repetitive work, and your people focused on what actually matters.

15+

Years in Tech

12+

AI Products Shipped

3

Fortune 500 Brands