Deliverability The work that keeps you out of spam

Keep every mailbox
landing in the inbox.

Each mailbox is warmed up, capped, and scored on its own. When one starts drifting toward spam, we slow it down or pull it from the pool before Gmail or Outlook notices.

How we think about it

A few decisions that shape the rest.

Deliverability decides whether the rest of the product matters, so we were opinionated about it early. Here is where we ended up differently from most of the category, and each one is a real choice in the code.

01
Sending is spread out on purpose.

Throughput per server is the wrong thing to optimise for. What burns reputation is sending too much from one mailbox, domain, or IP. We keep each mailbox under its own cap and spread the work across many of them, so the risk never piles up in one place.

02
Warmup has to prove itself.

Warmup only helps if it is real. Every warmup message carries a signed token that we check when the reply comes back, so a mailbox cannot fake good behaviour by quietly replying to itself.

03
We pull a mailbox before the provider does.

Once Google or SES throttles a domain, the damage has already gone out. We watch each mailbox on a rolling window and act on our own thresholds, which sit weeks earlier than the public ones.

04
Trials never share a pool with paying customers.

A trial account should never warm up in the same loop as a paying one. If it picks up bad habits, that is its own problem to work off in recovery.

How it works

Everything rides on the mailbox.

A mailbox's reputation is its own, so that is where we attach the controls: the cap, the pacing, the warmup schedule, the health score, and the suppression list. The worker and the IP are just the machine it sends through, and we spread mailboxes across many of them so one rough day never drags down the rest.

Mailbox lifecycle
01
Connect and verify auth

SPF, DKIM, and DMARC have to resolve before the mailbox can send.

02
Warm up 10 to 40

Opens at 10 a day, adds one a day, holds at 40.

03
Send within caps, watch health

50 a day, 600s apart, scored on a rolling 7 days.

04
If it slips, pull and recover

Out of the pool it cools off, then requalifies before it sends again.

Google Workspace
healthy
Cap 50 / day

The most cold email this mailbox sends in a day.

Pace 600s apart

At least ten minutes between any two sends.

Warmup 10 to 40 / day

Opens at 10, adds one a day, holds at 40.

Health rolling 7 days

A score built from spam, complaints, and bounces.

Auth SPF DKIM DMARC

Re-checked daily, not just at setup.

Suppression workspace-wide

One bounce or complaint stops every campaign.

Sending through worker w-01 · 192.0.2.14. Move it to another worker or IP and nothing about the mailbox changes.
Spread across workers and IPs
w-01
192.0.2.14
w-02
198.51.100.7
w-03
203.0.113.9

A worker is one machine on one IP, and each dot is a mailbox it sends for. We keep them spread out so a problem on one machine never reaches the others.

Defaults

The numbers we ship with.

These are set for a normal mailbox on a normal provider. Override any of them per mailbox if you have a real reason. The right column is why each one sits where it does.

01 · Cold campaign cap

The ceiling for cold email from one mailbox. You can raise it to 100, but only with a reason worth defending.

50 / day
02 · Minimum send gap

Ten minutes between sends, even when the queue is full. People do not fire off mail in bursts.

600s
03 · Warmup start

Where warmup begins. Low enough to read like a normal person sending mail.

10 / day
04 · Warmup ceiling

Warmup stops climbing here. Pushing past it buys no extra reputation.

40 / day
05 · Warmup ramp

One more warmup message per day. Faster ramps look odd to the receiver.

+1 / day
06 · Sync burst limit

If a mailbox pulls in more than 100 new messages in five minutes, the worker throttles it.

100 / 5m
07 · Sync hourly limit

Past this we pause the mailbox ourselves, before the provider has to.

500 / hr
08 · Invalid token block

Three malformed warmup tokens in a day drop the mailbox from the pool.

3 / 24h
Source: internal/config/constants.go · internal/scheduler/email_scheduler.go · internal/repository/pg_warmup.go
Pools and isolation

How mailboxes stay separated.

There are two warmup pools, free and premium, and a mailbox does not move between them on its own. A trial warms up only with other trials. When a paid mailbox crosses a band it cools off in recovery before it touches healthy traffic again. Dedicated customers get their own worker and IP, and still warm up inside the premium pool.

Free pool
Free trial

Trial mailboxes only, held to the same thresholds as paid ones.

  • Only warms up with other free-plan mailboxes.
  • Never sends to a premium mailbox.
  • Kept out of the premium health scoring.
Most paid plans
Premium pool
Starter, Grow, Business

Vetted paid mailboxes, with tighter bands and less room to drift.

  • Only warms up with other healthy premium mailboxes.
  • A mailbox that crosses a band drops to recovery and earns its way back.
  • Spam placement and complaints are scored per mailbox over rolling windows.
Recovery
A cooldown state

Where a mailbox sits while it cools off after crossing a band. Healthy traffic never sees it.

  • 7 days after a quarantine, 30 days after a hard block.
  • Comes back at reduced volume for a few days, then gets re-scored.
  • Authentication and bounce checks have to pass first.
Dedicated
Enterprise infrastructure

Your own worker and IP. It still warms up inside the premium pool.

  • One worker process and IP for one organisation.
  • Reputation is still earned per mailbox.
  • Same thresholds apply. Your own IP is not a free pass.
Auto-quarantine bands

The bands, and when each fires.

We grade each mailbox on how often its mail lands in spam, over a rolling window. Our thresholds sit well to the left of where Google and SES start penalising senders, so a mailbox leaves the shared pool weeks before it would earn a public complaint.

Spam placement · 0 to 100%
Per-mailbox rolling window
HEALTHY · 0 to 10%
WATCH · 10 to 20%
QUARANTINED · 20 to 40%
BLOCKED · 40% to 80%
CATASTROPHIC
0%
10%
20%
40%
80%
100%
Healthy
Spamunder 10%
Complaintunder 0.03%
Bounceunder 5%

Normal. Keeps warming up and stays in the pool.

Watch
Spamat or above 10%
Complaintat or above 0.03%
Bouncenot used

Volume eases back and the gaps widen, more so as it climbs. Stays in the pool.

Quarantined
Spamat or above 20%
Complaintat or above 0.10%
Bounceat or above 5%

Out of the shared pool for 7 days. Cools off in recovery.

Blocked
Spamat or above 40%
Complaintat or above 0.30%
Bounceat or above 10%

Blocked for 30 days. Cold sending pauses, and a person clears it before re-entry.

Catastrophic
Spamat or above 80%
Complaintsevere
Bouncesevere

Long block and a full reputation reset. No automatic way back in.

Between 10% and 20% the slow-down comes in two steps, watch then throttled, and the mailbox stays in the pool. Past 20% it comes out. A band only fires once there is enough to judge: at least 20 warmup deliveries in the past 7 days for spam placement, at least 100 delivered messages in the past 30 days for complaints. For reference, Google asks senders to keep spam below 0.1% and never reach 0.3%, and SES holds complaints below 0.1% and bounces below 5%.

Authentication

We check SPF, DKIM, DMARC, and PTR.

A mailbox cannot finish setup with broken authentication. We resolve every record live, show you exactly what to publish if something is missing, and re-check it daily once you are sending.

TXT record
SPF

We read the domain SPF record and confirm both your mailbox provider and any third-party senders are allowed.

if it fails If it is missing or wrong, the mailbox cannot leave the connection wizard.

Selector + key
DKIM

We find the provider DKIM selector, confirm the public key parses, and require at least 1024 bits.

if it fails A missing selector shows you the exact record to publish, ready to copy.

Policy + alignment
DMARC

We read the policy, the alignment mode, and the reporting address, and flag p=none clearly.

if it fails Reports can point at a Warmbly inbox so they surface inside the dashboard.

Reverse DNS
PTR

For your own SMTP, we check the sending IP reverse DNS resolves back to the same hostname.

if it fails A mismatched PTR is one of the fastest ways into the spam folder.

Suppression

When something goes wrong, we stop sending.

The quickest way to handle a bad signal is to stop adding to it. By default a bounce, a complaint, an unsubscribe, or a STOP reply takes the recipient off every campaign before the next send goes out.

  • Workspace-wide. Every campaign skips a suppressed recipient on the next send.
  • One-click unsubscribe handled the moment it is clicked, per RFC 8058.
  • Replies like "stop" or "remove" are caught and suppressed on their own.
Trigger
Scope
Source
What happens
Bounce
workspace
consumer.deliverability
When a send bounces, the recipient is dropped across every campaign in the workspace, and nothing else queues to them.
Complaint (FBL / ARF)
workspace
consumer.deliverability
A Gmail or Microsoft spam complaint suppresses the recipient and nudges the mailbox health score down.
One-click unsubscribe
workspace
tracking.unsubscribe
RFC 8058 one-click. The recipient is gone before the confirmation page even loads.
Reply: STOP / REMOVE
workspace
consumer.reply.classifier
Common opt-out phrases in replies are caught and suppressed without anyone in the loop.
Manual suppression
workspace
api / dashboard
Suppress by recipient or an uploaded list. CSV uploads are deduplicated against what is already there.
Cold sending posture

How to ramp a cold mailbox.

These are habits we have seen work, not guarantees. They line up with what the major receivers reward. Treat the default 50 / day cap as a ceiling to stay under.

New mailbox
10 to 20 / day

Fresh or just connected. The first couple of weeks are for reputation; pipeline comes later.

Ramping
+5 / week

Add a little each week while complaints and bounces stay clean. Back off the moment they climb.

Stable band
30 to 50 / day

The normal range for most cold mailboxes. The default cap sits at the top of it.

Above default
needs a look

Going past 50 / day on one mailbox takes clean signals and a real reason first.

600s minimum gap, always Business hours by recipient time zone Warmup runs in parallel with cold
By the numbers

The whole safety policy, in one row.

Every number here is pulled straight from the code.

50 / day
cold cap per mailbox
internal/config/constants.go
600 s
min gap between sends
internal/scheduler/email_scheduler.go
10 / day
warmup start volume
internal/scheduler/warmup_scheduler.go
40 / day
warmup ceiling
internal/scheduler/warmup_scheduler.go
+1 / day
warmup ramp
internal/scheduler/warmup_scheduler.go
500 / hr
worker sync hourly limit
internal/app/worker/wmail/ratelimit.go
Deliverability FAQ

The questions we get a lot.

There is more in the deliverability handbook.

Per mailbox. Each one is scored and capped on its own, so a single account can hold five mailboxes in five different states at once.

Any of these: three bad warmup tokens in 24 hours, spam placement at or above 20% with at least 20 warmup deliveries in the last 7 days, a complaint rate at or above 0.10%, or a bounce rate at or above 5%.

Bounces, complaints, and unsubscribes are workspace-wide. Once someone is suppressed, every running campaign skips them on the next send, and nothing else ever queues to them.

Because 50 a day with a 600-second gap stays comfortably under provider scrutiny everywhere. You can raise it toward 100, but earn it mailbox by mailbox.

It leaves the shared pool, cold sending pauses, and it cools off in recovery: 7 days after a quarantine, 30 after a hard block. When the cooldown ends it comes back at reduced volume for a few days and has to re-pass the health checks before it sends normally again.

Most plans share IPs, which is fine here because we track reputation on the mailbox itself. Enterprise plans can take a dedicated worker and IP, but the same per-mailbox limits still apply.

Yes. Warmup runs alongside your cold sending to keep the mailbox active and conversational. Switching it off the day you go live is a good way to watch a mailbox go cold.

Plan on a few weeks. Warmup opens at 10 a day and adds one a day, so a fresh mailbox earns its way up to a normal cold volume instead of jumping straight there.

No, and be careful with anyone who does. Placement also depends on your content, your list quality, and your domain history. What we control is the sending itself: how fast and how much each mailbox sends, whether its authentication is clean, and pulling it the moment it starts to slip.

See where your mailbox really stands.

Connect one and get a full SPF, DKIM, DMARC, and PTR report, plus its current health, in a few minutes.