§Use caseOne operator

Never draft the same lead twice

Rerun a lead list through most cold-email tooling and it will happily draft the same person five times, including the one who told you to stop. Below is how I actually build it: a suppression list checked first, no exceptions, and a cooldown window so nobody gets drafted to twice in the same stretch, before a single token is spent on the email itself.

All twelve nodes, and the setup written on the canvas
All twelve nodes, and the setup written on the canvas
The whole cold-email drafter workflow on the n8n canvas: suppression check, cooldown filter, drafting and logging.

The questionHow do I draft personalised cold emails from a lead list without re-contacting someone who opted out or was drafted to recently?

How the working version is put together

  1. Trigger it by hand or on a schedule

    I wire two triggers, one you run by hand and one that fires weekly. Nothing drafts until one of them goes. I put your name, your one-line pitch, your value proposition, how many drafts per run, and how many days before a contact can be redrafted in one settings node.

  2. Check the suppression list first, no exceptions

    Before anything else runs, every lead is checked against a suppression list matched on email. Anyone on it is dropped here. There is no override, and there is no path in this workflow that skips this check.

  3. Filter by cooldown in code, not a model

    I compare each remaining lead's email against the Sent Log in a Code node, keeping anyone outside your cooldown window or never drafted at all, with no AI call anywhere in that decision.

  4. Cap the run before a token is spent

    I trim the surviving list to your maximum drafts per run before the AI is ever called, so a big list can never spend a big AI bill in one run. Suppression, cooldown and the cap all run upstream of the model, in that order.

  5. Draft one email, one call to action

    I have an OpenAI model write a subject and a body under 120 words with exactly one call to action, told to reference the specific research note fact by name and never invent a connection, a price or a timeline that was not given. The email lands as a Gmail draft, and nothing here has a send path, not even behind a setting.

  6. Log the draft, then remember it

    I append the drafted lead, subject, timestamp and Gmail draft ID to a Draft Log tab, so you have a visible record without opening Gmail. I write the email and the current timestamp back into the Sent Log, which is what makes the cooldown check mean something on the next run.

The kit

Draft personalised cold emails from a lead list with AI and never repeat or draft to someone suppressed

I built and gated this one, staging for Etsy now: 14 working nodes, the setup written on the canvas, and a setup guide for every node. If you want it sooner, or set up around your own lead list, start a brief instead.

What the manual version costs

I'm not going to give you a minutes-per-email figure, because I haven't measured one on my own outreach and I'd only be borrowing somebody else's number. What I can tell you is the shape of the cost: without a suppression list and a cooldown, a lead list gets redrafted every time you rerun it, and the version that actually costs you is the one where the same prospect gets pitched twice in the same week.

The other cost is the one that never shows up in a report until somebody complains: drafting to a contact who already asked to be left alone. I'd rather check the suppression list before the model is ever called than have the conversation that follows if it isn't.

The parts that break

The cooldown check only sees past runs, not this one. I fetch the Sent Log a run reads once, right at the start, before this run has written anything back. If the same email address appears twice in your own lead sheet before you kick things off, both rows pass the cooldown check the same way. Keeping your Leads sheet free of duplicates does the job the cooldown does inside a single pass.

The suppression check matches on the exact email address in the row. A prospect who opts out from a personal address and gets re-added later under a work address slips past it, so I'd keep the suppression list as the place you add every address you have for someone, not just the one that opted out.

A thin research note produces a thin email. I tell the model to keep the draft shorter rather than pad it with invented detail when the note is weak, which is the right failure mode, but it means the draft is only ever as good as the one fact you gathered about the lead.

What it costs to run

I'd call it small. One lead makes a short prompt, so what you already pay for the automation platform will dominate the running cost long before the OpenAI calls do. There's no paid API beyond that and no external service: the suppression list and the cooldown log are both Data Tables inside n8n itself.

The real cost is the same as every build I ship like this: somebody has to keep the Leads sheet fed with a genuine research note per lead, because that's the one input the model isn't allowed to invent around.

Why take this from me

Because I build outreach machinery for a living and this is the shape I actually trust: checks before spend, a draft before a send, and a log that makes the next run honest about who it already reached. It's built to sit downstream of a lead-sourcing workflow like my Google Maps prospecting template, so the two chain into one pipeline from a search term to a drafted email.

The fair objection is that my proof is my own operation rather than a client roster, and there are no reviews on this site because I don't have any yet. I'd rather write that down than have you notice it.

Read this before you spend anything

Who should not buy this

If you send fewer than a handful of first-touch emails a month, this buys you machinery to maintain for a problem you don't have yet, and a list that short is faster to draft by hand than to configure.

If you don't already have a lead list with a real fact gathered per lead, this expects that input to exist rather than sourcing it for you. Pair it with a prospecting workflow, or start there first.

If what you actually want is automatic sending, this isn't that, on purpose. It drafts, it never sends, and turning a draft into a send stays a decision you make yourself, message by message.

What lands on your desk

  • I set it up inside your own n8n, on your own Google account and your own OpenAI key, under your own credentials
  • Your outreach settings, your suppression list and your cooldown window written in with you
  • The suppression check and the cooldown filter wired in ahead of the model, so a token is never spent on someone you shouldn't contact
  • A Draft Log and a Sent Log you can read directly, so the next run's honesty is checkable, not assumed
  • A walkthrough I write down, so whoever touches it next is not dependent on me

Questions this page answers

Does it ever send the email automatically?
It never sends. It only ever creates a Gmail draft, and there is no send path in this workflow, not even behind a setting, so turning a draft into a send is a decision you make yourself.
What stops it drafting to someone who opted out?
A suppression list is checked first, matched on email, before anything else runs, and anyone on it is dropped right there with no override.
What stops it drafting to the same person twice?
A cooldown filter compares each lead's email against a Sent Log in a deterministic Code node, not a model call, and drops anyone drafted to within your cooldown window.
Can the model invent facts about a lead to fill out a thin email?
The model can't invent facts to fill out a thin email. I tell it to keep the draft shorter rather than invent a connection, a price or a timeline that wasn't given, and to reference only the specific research note fact by name.
Is there a free way to try this?
There is. The workflow is a free n8n template, so you can read every node before deciding whether you want help with it.

Want this built and handed over working?

One line is enough to start. You get an honest answer on fit, and a number rather than a discovery call.

Start a brief