The sequencing is a weekend: import a CSV, send timed steps from your own mailbox, stop on a reply, and honour unsubscribes. The harder part isn't code. Whether mail lands in the inbox depends on your domain's reputation, authentication records, warm-up and sending pattern, and one burned domain ends the experiment. Woodpecker's warm-up, deliverability monitor, verifier and lead finder are where its money goes. A homemade sender works for a few dozen prospects a day from one or two mailboxes; LinkedIn automation and volume are outside what a personal build should attempt.
Before you buildWoodpecker's trial is 14 days or 100 cold emails. If you send a few dozen messages a week, a free sequencer plan from a competitor may be all you need.
Build me a small cold-email sequencer to replace Woodpecker for low volume. Requirements:
- Node.js 22 + TypeScript: a Fastify server with server-rendered pages (Eta) on
http://localhost:4870 and a worker loop that `npm start` launches next to it.
- Storage: better-sqlite3 in ./data/outreach.db for prospects (email, first name, company, custom
fields, timezone), campaigns with ordered steps (subject, body, wait in days), enrolments with a
status (queued, active, replied, bounced, unsubscribed, finished), a send log and a suppression list.
- Import: upload a CSV, map the columns, drop invalid addresses and duplicates, skip anyone on the
suppression list and show the counts before saving.
- Templates: `{{firstName}}` and `{{company}}` fields with a fallback (`{{firstName|there}}`), plus
spintax like `{Hi|Hello}`. Refuse to save a step with an unresolved field and show a preview
for any prospect.
- Sending: mailboxes configured in .env (SMTP through `nodemailer`, replies read over IMAP with
`imapflow`), a daily cap per mailbox (default 30), a random 90 to 240 second gap between sends,
sending only 08:00 to 17:00 on weekdays in each prospect's timezone, and an automatic pause
of a mailbox after 3 bounces in a row.
- Replies and bounces: poll the inbox every 2 minutes, match replies by In-Reply-To or References,
stop the sequence on a reply, add hard bounces to the suppression list, and list out-of-office
replies without stopping the sequence.
- Every message carries a `List-Unsubscribe` header and a signed unsubscribe link that adds the
address to the suppression list, plus a footer with my sender name and postal address from .env.
- Single user. No accounts, no telemetry, no open or click tracking, local-first: the only outbound
connections are to my own mail servers.
- Out of scope: warm-up between mailboxes, LinkedIn steps, lead finding, email verification, CRM sync.
- README: the SPF, DKIM and DMARC records for a separate sending domain, a warning that cold email
is regulated (GDPR, PECR, CAN-SPAM) and that a new domain needs weeks of gentle sending, and
how to keep the worker running under launchd or systemd.Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Woodpecker.
Add reply classification to the sequencer in this folder. Requirements: - When a reply is matched, send its text (quoted history stripped) to an OpenAI-compatible endpoint from .env and store one label: interested, not_interested, out_of_office, wrong_person or unsubscribe, with a one-line reason. - `unsubscribe` adds the address to the suppression list at once; `out_of_office` keeps the sequence running; the others stop it. - Show replies grouped by label on the admin page; let me override a label. - Send only the reply text to the endpoint and say so in the README. - Update the README.
Add a gentle ramp for new mailboxes to the sequencer in this folder. Requirements: - Per mailbox, a ramp schedule in .env (for example start 5 a day, add 2 every 3 days, stop at the daily cap) and a `rampStart` date. - The sending loop uses the lower of the ramp value and the daily cap. - Pause a mailbox for 48 hours when its bounce rate over the last 50 sends passes 5%. - Show each mailbox's current limit and status on the admin page. - Update the README.
Add a small prospect page to the sequencer in this folder. Requirements: - Per prospect: status (new, contacted, replied, meeting, closed, lost), free-text notes, next follow-up date and the full message history from the send log and matched replies. - A list view with filters by status, campaign and overdue follow-up, and a button to export the filtered list as CSV. - Changing a prospect to meeting, closed or lost stops any active sequence for that prospect. - Update the README.
Add subject A/B testing to the sequencer in this folder. Requirements: - A step can hold two subject lines; assign each prospect to one at random and store the choice. - Report sends, replies and reply rate per variant on the campaign page, with a note that small samples prove nothing. - Allow picking a winner, which applies to prospects who haven't received the step yet. - No open tracking: use replies only. - Update the README.
Cold email lives or dies on deliverability, and Woodpecker bundles the dull infrastructure: warm-up, human-like sending limits, bounce handling, a verifier and a lead finder, with unlimited mailboxes and team members on every plan. Agencies run many clients through one panel. A homemade sender saves money but leaves inbox placement as your problem.
Estimate · A domain costs about a dollar a month; one mailbox on Google Workspace or Fastmail adds a few dollars, and a small VPS another $5. The build is token usage on your agent plan. Verification and lead data are not included.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free trial | $0 | $0 | 14 days or 100 cold emails, whichever comes first, all features, no card. |
| Cold Email, 500 prospects | $35 | $23.33 | 500 contacted prospects a month, up to 8,000 emails, 2 warm-ups, 100 Lead Finder credits, unlimited email accounts, team members and email verification. |
| Larger prospect limits | custom | — | A slider runs from 500 to 1,000,000 contacted prospects, plus an Unlimited option; emails, warm-ups and Lead Finder credits grow with the limit. |
| Add-ons | custom | — | LinkedIn Outreach $29 per connected account; integrations, API, webhooks, MCP and CLI $20; extra warm-up $5 per mailbox; Google or Microsoft mailbox $6; Maildoso, Mailforge, Infraforge or Azure mailbox $4; Lead Finder from 500 credits for $10; domains about $1 a month billed yearly; Agency Panel $27 per active client. |
A 14-day trial, or 100 cold emails if that comes first, with every feature and no card; you keep access to the account afterwards.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Mailbox warm-up, inbox rotation and a deliverability monitor, Lead Finder and unlimited email verification.
About $35 a month on the Cold Email, 500 contacted prospects plan, $420 a year (checked 2026-10-19).
Mailbox warm-up, inbox rotation and a deliverability monitor; Lead Finder and unlimited email verification; LinkedIn steps and combined email, LinkedIn and call sequences; AI interest-level detection and sorting of replies, with out-of-office filtering; Two-way HubSpot and Pipedrive sync, Zapier, Clay and an agency panel. If any of those matter to you, keep paying.
Yes: Warmbly (open source), OpenOutreach (open source), Mautic (open source).