Five workflows. One sheet. The end-to-end outbound loop.
Scrape, send, follow up, track, suppress — each job is a separate n8n workflow. They share one Google Sheet as the source of truth. After setup, the operator fills a form and reads replies. The machines stay stateless.
The other cards are machines. This is the loop.
Most “cold email tools” stop at find-and-blast. This system is five linked jobs. Open a single card if you only need that slice. Open this page if you want how they share state without talking to each other.
The live sender URL currently repeats a lot of this system copy. Here the system stays the system: architecture, hand-offs, and why the sheet is the CRM. Node-by-node sending lives on the Cold Email Sender page.
Each workflow has one responsibility
Maps intake
Form → Places or Apify → verify → Haiku research → Sonnet email → append pending rows. v1 is 29 nodes / 20 per keyword. v2 is 25 nodes / 40 per keyword, closed places skipped.
Daily first touch
5pm. Six-condition filter. Hard 20-cap (week-1 note: 10/day on a new domain). 3–8 minute random wait. Dual Gmail. Sent or Failed written every time.
Day 3 and day 7
Weekdays 6pm. Pre-written FU1/FU2, sender-matched, 8 per type per day, 2–5 minute waits. Skips any row that has replied or bounced.
Hourly inbox classification
Both Gmail accounts. Bounce, opt-out (15+ phrases), or genuine reply. Writes replied / bounced so follow-up can stop without a human sweep.
Blocklist the scraper reads
Every bounce and opt-out is appended to a suppression sheet with reason and timestamp. The next scrape drops those addresses before Claude runs. Not a fifth canvas of “send” nodes — the shared list that closes the loop.
Operators who want the loop, not a single Zap
Agencies doing local outbound
Keyword + city in. Verified, written, paced, followed up, and suppressed — without a VA updating four tools.
Teams that already own Gmail and Sheets
Nothing is rented. The published build uses two senders (Nick and David) so volume can split without mixing threads.
Workflows never call each other. The sheet does.
Scraper writes
Pending rows: email, subject, body, PS, verification. Suppression and existing-lead checks happen before the write.
Sender updates
sent_at, Status, Gmail message ID, sent_from. That ID is what the tracker can match later.
Follow-up reads timestamps
Day-3 and day-7 math lives in filter nodes. It never “asks” the sender if a reply arrived — it reads replied and bounced.
Tracker writes status + suppress
Hourly. A reply stops the sequence. A bounce or opt-out also lands on the suppression sheet the scraper will read tomorrow.
Every technical choice is there to protect the domain
Verify before spend
MillionVerifier runs in the scrape. Only safe / ok / role_account reach Claude or Gmail. The sender re-checks verification anyway.
Cap + jitter
20 first-touches/day, 3–8 minute gaps. Follow-ups capped at 8 per type with 2–5 minute gaps. Week-1 note: 10/day on a new domain.
Reply-only CTAs
Sonnet is instructed never to ask for a click, booking link, or form. Replies are the engagement signal.
Six gates before send
Body, subject, not sent, valid email, verified, not do_not_send. All six. Then Gmail. Then a writeback either way.
System stack
n8n (five linked jobs), Claude Haiku + Sonnet, Places or Apify, MillionVerifier, Gmail API ×2, Google Sheets as CRM. Self-hosted n8n keeps data on your servers and avoids per-execution pricing as volume grows.
This build
Want the full loop?
We walk how the five jobs share one sheet — not a product demo login.
Get a proposalOpen a slice
The other seven in this portfolio
Cold Email System — short answers
How is this different from the sender page?
Is the fifth workflow a separate n8n canvas?
Do the workflows call each other?
Which Maps scraper does the system use?
Can we buy this as a subscription product?
Want the full outbound loop on your sheet?
We will walk how five jobs stay stateless — scrape to suppress — and what it takes to run the same class of system on your inboxes.