Warmup Reputation-safe pools, on every paid plan

Warmup that earns
reputation.

Mailboxes ramp gradually inside the premium pool. Verification tokens distinguish real warmup from forged traffic. Bands quarantine before mailbox providers act.

The ramp

10 emails on day 1.
40 emails on day 30.

One additional warmup message each business day, until the mailbox reaches the 40 / day ceiling and holds. Aggressive ramps trip volume-anomaly heuristics on the receiver, so we keep it boring.

Day 1
10 / day

First warmup send. Normal individual activity to any provider.

Each day
+1 / day

Volume grows by one each business day. Weekends skipped.

Day 30
40 / day

Ceiling reached. Mailbox holds at 40 / day indefinitely.

~10m average gap between sends Business hours by recipient TZ Plain text only
Verification token

Every warmup message carries proof it is real.

The single biggest threat to a shared warmup pool is a sender pretending to receive its own warmup. A signed HMAC token embedded in the body, validated on classification, makes that impossible.

warmup token · embedded in body
# Token format · plain text, base64url
wbly:01HQX9F7P3A8KY2NJM4R6BWT0S:1746820392:3f9c2a8b5e1d740a
   └ pool id            └ ulid msg id
                                       └ expires            └ hmac-sha256

# Embedded as a normal-looking footer line:
Hey, just wanted to follow up on the project we discussed.
Let me know when you have a chance.

— Ben
ref: wbly:01HQX9F7P3A8KY2NJM4R6BWT0S:1746820392:3f9c2a8b

# Receiver classification → verify (HMAC + expiry + msg-id)
if token.valid() && !seen(token.id) then credit_signal
else increment_invalid_count(sender)
Validation rules
HMAC signature

Tokens are signed with a per-pool key. Forged tokens fail verification.

Expiry window

Tokens expire 48 hours after issue. Late replies do not count.

Single-use ID

Each token ULID is recorded on first valid use. Replays count as invalid.

Pool membership

Token pool ID must match the receiver's pool. Cross-pool tokens are rejected.

Sender / recipient

Token sender and recipient mailbox IDs must match the message routing.

≥ 3 invalid tokens / 24h → mailbox quarantine
The daily loop

One loop. One mailbox. One day.

Warmup is not a black box. Every step has a defined input and output, and every quarantine has a reason you can read.

Read about warmup pools
  1. 01
    Pool member selection
    partner = pool.draw(exclude_recent: 7d)

    A partner mailbox is drawn from the same pool the sender belongs to. Recent partners are excluded for 7 days to prevent degenerate pairs.

  2. 02
    Token issue + embed
    token = hmac(pool_key, sender:recipient:ulid:exp)

    A signed token is generated for this pair and inlined as a `ref:` footer in the body. Receivers extract and validate it on classification.

  3. 03
    Send through worker
    worker.send(msg, schedule: business_hours(recipient_tz))

    The mailbox's assigned worker dispatches the message during the recipient's business hours, with spacing that matches human typing cadence.

  4. 04
    Partner classification
    receiver.classify(msg) → {inbox|promotions|spam}

    The receiving mailbox classifies the message and reports the result back along with the token. Inbox arrivals are credited as positive placement signals.

  5. 05
    Score update + band
    score = rolling_sum(placement, complaints, tokens)

    The per-mailbox rolling score is updated. If thresholds are crossed, the mailbox transitions to Watch, Quarantined, or Blocked.

Why warmup matters

A fresh mailbox is suspicious by default.

Gmail and Microsoft treat new senders cautiously. Without a behaviour history, a brand-new domain that immediately starts cold outreach looks like the worst-case sender. Warmup is the only way to build that history without a complaint event.

Without warmup
  • No sending history. Providers default to suspicion on first volume spike.
  • Inbox vs spam classification has no positive signal to lean on.
  • Any complaint or hard bounce moves reputation faster because the baseline is empty.
  • Engagement signals (replies, moves from spam) take longer to accrue.
  • First catastrophic event can hit within days of starting cold sends.
With Warmbly warmup
  • Gradual volume ramp matches what a real mailbox usage looks like.
  • Inbox arrivals at vetted partners build a positive placement signal.
  • Replies in the pool produce real engagement history at the receiver.
  • Verification tokens prove the activity is genuine, not self-replied noise.
  • Per-mailbox bands quarantine drift weeks before providers would act.

Reputation is per-mailbox, per-IP, and per-domain. Warmup builds all three simultaneously. We do not publish placement-improvement percentages because the answer depends on your domain age, content quality, list hygiene, and DMARC posture more than anything we control.

Health bands

Bands that act before providers do.

Spam placement on the X axis. Each band starts where the previous one ends. Warmbly's thresholds (in sky) sit well to the left of Google's and SES's published enforcement points (in rose) so we pull a mailbox out of the shared pool weeks before it would earn a public complaint.

Spam placement · 0% → 100%
Per-mailbox rolling window
HEALTHY · 0–10%
WATCH · 10–20%
QUARANTINED · 20–40%
BLOCKED · 40%+
0%
10%
20%
40%
80%
100%
↑ providers act
Healthy
Spam< 10%
Complaint< 0.03%
Bounce< 1%

Default state. Continue ramp.

Watch
Spam≥ 10%
Complaint≥ 0.03%
Bounce

Lower volume, increase spacing.

Quarantined
Spam≥ 20%
Complaint≥ 0.10%
Bounce≥ 5%

Removed from shared paid pool for 7 days.

Blocked
Spam≥ 40%
Complaint≥ 0.30%
Bounce≥ 10%

30-day block. Review required for re-entry.

Spam-placement band requires at least 20 warmup deliveries in the past 7 days. Complaint band requires at least 100 delivered messages in the past 30 days.

Pool isolation

Four pools. Zero crossover.

Mailboxes never silently move between pools. A free-trial mailbox stays in the free pool. A quarantined paid mailbox drops into recovery, not back to premium. Dedicated infrastructure runs alongside without sharing IPs.

Free pool
Free trial
trial mailboxes only
  • Recipients drawn exclusively from other free-plan mailboxes.
  • Same auto-quarantine thresholds as premium.
  • Cannot send to premium-pool mailboxes.
Most paid plans
Premium pool
Starter · Grow · Business
vetted paid mailboxes only
  • Stricter quarantine bands than free pool.
  • Quarantined senders move to recovery, not back to premium.
  • Recipients only drawn from other healthy premium mailboxes.
Recovery pool
Automatic
quarantined mailboxes serving cooldown
  • 7-day cooldown after quarantine trigger.
  • Must pass 20-delivery probation to re-enter premium.
  • Completely isolated from healthy premium senders.
Dedicated
Enterprise
isolated worker + IP per org
  • One worker process and IP allocated to one organisation.
  • Still participates in the premium pool for warmup recipients.
  • Infrastructure isolation, not a reputation shortcut.
Running this yourself

The pool needs scale. That is what the cloud provides.

Warmbly is open source, so you can self-host all of it. The one part that does not travel is the shared warmup pool, because a pool only works once enough vetted mailboxes are in it.

Defaults

The numbers we ship with.

Tuned for the median sender. Override per mailbox if you have a real reason. The right column is the reasoning we will defend in an incident review.

01 · Starting volume

Low enough to read as normal individual activity to any provider.

10 / day
02 · Daily ramp

Aggressive ramps trip volume-anomaly heuristics on the receiver.

+1 / day
03 · Volume ceiling

Maintains reputation without crowding the cold-campaign budget.

40 / day
04 · Recent-partner gap

Stops two mailboxes from forming a degenerate warmup pair.

7 days
05 · Spam-score block

Removes proactively, before mailbox providers act.

> 50
06 · Invalid token block

A flurry of malformed tokens is the token-forgery signature.

≥ 3 / 24h
07 · Re-entry probation

Enough fresh data to confirm health, not just dormancy.

20 deliveries
Source: internal/scheduler/warmup_scheduler.go · internal/repository/pg_warmup.go
Warmup FAQ

Four questions we get most.

Want the full mental model? Read the warmup guide.

Plan on 3 to 6 weeks for a brand new mailbox to reach a stable warmed state. We ramp +1 / day from a 10 / day start with a 40 / day ceiling.

No. Free pool mailboxes never silently appear in the premium pool. Dedicated workers still participate in the premium pool by default.

3 or more invalid warmup tokens in 24h, spam score above 50, complaint rate over 0.10%, or spam-folder placement over 20% on at least 20 deliveries in 7 days.

Yes, and you should. Warmup runs in parallel with cold sending so any reputation dip is caught and offset before campaigns hit it.

Connect a mailbox. Start warming today.

OAuth in 30 seconds. First warmup send in under a minute.