2026-07-26 #85 Fixed
Renumber duplicate migration 000077_ai_variables_resolved to 000078 so the backend boots
- 000077warmupgenerationscale.{up,down}.sql (merged via #82)
- 000077aivariablesresolved.{up,down}.sql (merged via #83)
github.com/warmbly/warmbly · Apache 2.0 · Run it on our cloud or your own infra · Go · Rust · Elixir · React
Campaigns
Build a multi-step flow on the canvas, then drag a connector from any step to fork on opens, clicks, and replies. It's the exact builder you'll use in the app.
Drag to branch
Pull a link from a step to add an “if opened / clicked / replied” path. No match just stops.
A/B at every step
Weighted subject + body variants; the stronger one keeps sending.
Threaded follow-ups
Follow-ups reply on the previous subject, so they land in the same conversation.
Scheduling
A calendar-style editor with full per-day control. Draw a sending window on any weekday, drag to move it, grab an edge to resize. Everything snaps to 30 minutes.
Per-day windows
Independent windows for each day: mornings only, or split shifts. Several per day is fine.
Timezone-aware
Sends follow the chosen timezone; worker IPs spread the volume naturally.
One-click presets
Mon–Fri 9–5 in a tap, then fine-tune by dragging the blocks.
Unified inbox
Replies from every connected mailbox stream into one searchable queue. The classifier tags each one on arrival so you act on the labels that matter.
One queue, every mailbox
Scope by inbox, tag, or status: unread, awaiting reply, snoozed, scheduled.
Classified on arrival
Positive, out-of-office, unsubscribe and bounce are labeled before you open them.
Reply in place
Snooze, schedule, and send from the same pane, keyboard-first.
Analytics
Deliverability across the whole workspace: sent, opens, clicks, replies and bounces, with per-campaign breakdowns and account health on one screen.
Placement, not vanity
Track the metrics that move reputation, over 7, 30 or 90 days.
Best performers, surfaced
Top campaigns and account health rank themselves as sends roll in.
Shareable report card
Export a branded image of any range in a single tap.
AI assistant
Describe what the email should do and the assistant writes it in your voice, merge fields and tone already in place. Edit inline, regenerate, or keep what works.
One-line briefs
Tell it the goal; get back a ready-to-send draft with variables filled in.
Tone presets
Friendly, professional, concise, persuasive. Switch and regenerate in a click.
Credits, no surprises
Each draft uses one writing credit, shown before you generate.
Integrations
Connect Gmail, Microsoft 365, your CRM, Slack and Zapier over OAuth. Tokens are encrypted at rest and every webhook is HMAC-signed.
OAuth in two clicks
Authorize a provider and Warmbly handles the rest. Revoke anytime.
Signed webhooks
Every event is HMAC-signed and HTTPS by default, with SSRF protection.
Encrypted at rest
Secrets are sealed with your data key, never stored in plaintext.
iOS app
Replies classified as they land, campaigns you can pause from anywhere, mailbox health at a glance. SwiftUI, in the same open-source repo, on the same realtime socket as the dashboard.
Automations
Every reply, booked meeting, bounce and warmup dip is a trigger. Wire it to your stack on a canvas: branch on intent, post to Slack, open the deal, update the CRM. The one below is running its test right now. Press Test in the window to fire it again.
One IF chip routes on intent, confidence, source, or a random split. Yes goes right, no goes down, and the no path is still yours to wire.
Seven built-in actions plus Slack, Discord, HubSpot, Salesforce, Pipedrive, Close and HMAC-signed webhooks. No keys to paste for automation tools.
Dry-run any automation against a sample event and read every node verdict, yes or no, before the switch ever flips.
Developers
Everything in the dashboard is a REST endpoint: scoped API keys, idempotent writes, opaque cursors, and HMAC-signed webhooks.
Scoped keys
Mint read, write, or send-only keys per environment and rotate without downtime.
Idempotent by default
Send an Idempotency-Key and retries are always safe.
Webhooks that verify
Subscribe to events like contact.replied with signed payloads.
CRM
When a reply lands positive, Warmbly opens the deal and pauses the sequence on its own. From there you get one timeline that threads every send, open, reply, and stage change back to the exact sequence step that started it.
Born from the reply
A reply classified positive in the unibox opens the deal and pauses the sequence, so nothing keeps sending to someone who already said yes.
One timeline, traced to the send
Every send, open, reply, and stage change lands on the deal, each tagged with the sequence step and mailbox it came from.
Pipeline and forecast in one view
Move deals across your stages on the board while value, weighted total, and probability stay current on the record.
Tasks with a type and an owner
A positive reply spins up a typed follow-up task on the deal, assigned to a teammate with a due date, so the next step never slips.
Changelog Shipping continuously
New features, behavioural changes, and fixes, in the order they reached production. Every entry is dated, tagged, and traceable to a commit.
2026-07-26 #85 Fixed
2026-07-22 #84 New
2026-07-22 #83 New
2026-07-22 #82 New
Older releases and the full history Read the full changelog
Read exactly how warmup, sending and deliverability really work, self-host the whole platform, and send a pull request. Help us build the largest open-source cold email and warmup platform.
Apache 2.0
Fork it, ship it
Public
Issues and pull requests
warmbly · self-host
$ git clone https://github.com/warmbly/warmbly.git
$ cd warmbly
$ make up # build images, boot the full stack
Warmbly is live on http://localhost:8080
$
One caveat: the shared warmup pool runs on our cloud. It only works with a large base of vetted mailboxes sending to each other, which a single self-hosted instance starts without. Self-hosting still gives you the full sending, inbox, CRM and API stack. The pool is the one part that needs the cloud.
Built with Go · Rust · Elixir · React · Astro DocsArchitectureChangelogApache 2.0 license
Personalization / Templating
Every step is a Go text/template. Merge fields, if/else conditionals, and spintax all resolve per recipient the moment the email goes out, and the composer previews exactly what each contact will receive.
Pull any contact field with a leading dot. Missing values render empty, so a blank field never breaks the line.
{{.FirstName}}{{.LastName}}{{.Company}}{{.Email}}{{.Phone}}
Branch on a contact field with if / else / end. Compare values with eq.
Combine checks with and / or, for example
{{if and (eq .role "Engineer") .Company}}.
List variants in braces and Warmbly picks one per send, so the same step reads a little differently to every recipient.
Picks one variant
Hey Alex Hi Alex Hello Alex
Everything resolves at send time, and the composer previews the result against sample data before you launch.
How we differ
Cold-email platforms typically optimise for volume. Warmbly optimises for sender reputation. The numbers below ship as defaults and the system enforces them.
One platform
The signal one part collects is the signal the next part acts on.
Watch band kicks in at 10% spam placement, months before mailbox providers act.
Healthy
Watch
Quarantined
Blocked
We probe inbox placement through the pool, then act on it.
One worker per machine. Each with its own IP. Migrable on the fly.
Up to 12 steps. Variants per step. Business-hour delays by recipient time zone.
Step 12 variants
Intro · plain text
Step 2if no reply
Wait 3 biz days
Step 34 variants
Follow-up · context
Step 4if no open
Soft break · 7 days
Premium pool diversity across Gmail, Outlook, iCloud, Yahoo and self-hosted IMAP.
Pricing
The number on each card is daily send volume. Warmup, the unified inbox, analytics, CRM and the API are in every paid plan.
All plans include warmup, sending, inbox, analytics and CRM.
See full comparisonThe free tier is a limited demo with an unfilled warmup pool. Use it to see what the product does, not to send at volume.
Connect a mailbox, warm it up, send your first campaign today.