Self-hosted email marketing with full source code. Pay once, own forever. Get AcelleMail — $74 →

Deliverability · 9 min read

A 6-week IP warmup schedule for self-hosted senders

By AcelleMail Team May 8, 2026 9 min read
deliverability

A concrete day-by-day IP warmup plan: linear vs exponential ramp, why week 2 is the bottleneck, how AcelleMail's WarmupStrategy model executes it, and what to watch in SES reputation feedback during the climb.

§1

Why warmup at all?

An IP without sending history looks the same to a mailbox provider as an IP that just got handed off from a takeover. There is no signal of legitimacy — not yet. Sending 50,000 messages on day one from a fresh IP looks indistinguishable from a spammer renting a virgin IP block to send before reputation systems catch up.

So Gmail, Outlook, Yahoo, Apple iCloud Mail, and the regional providers all do the same thing on first contact: they accept a small initial volume, watch how the recipients react (open / click / mark-as-spam / delete-without-reading), and only after a few days of clean engagement do they unlock larger volumes. The "few days" is the warmup window. Skip it and you do not get blocked — you get throttled and spam-foldered for weeks afterwards, which is harder to recover from than an outright reject.

§2

Linear vs exponential ramp

There are two ramp shapes in widespread use:

  • Linear — same fixed increment per day. 50 → 100 → 150 → 200 → 250 … Predictable, slow, conservative.
  • Exponential — multiplies. 50 → 100 → 200 → 400 → 800 … Reaches target volume faster but is more aggressive at the tail.

AcelleMail’s built-in warmup engine (model: app/Model/WarmupStrategy.php) supports both via the constants GROWTH_STRATEGY_LINEAR and GROWTH_STRATEGY_EXPONENTIAL, plus two convenience presets: PRESET_BALANCED (linear, moderate increment) and PRESET_CAUTIOUS (linear, smaller increment with a longer ramp window). For brand-new sending domains with no historical reputation, cautious is the safer default. For an IP migration where the From-domain already has reputation on a different IP, balanced or exponential are acceptable.

§3

The 6-week schedule (target: 50,000 messages/day)

The exact numbers below are a cautious linear ramp. They are deliberately conservative; the discipline matters more than the precise figures. The single rule that breaks every warmup: never double yesterday's volume on the new IP until reputation is established. Once weekly bounce + complaint rates are clean for a week at peak, the IP is "warm" and warmup terminates.

DayVolumeNote
150Smallest sample — verify wiring works at all
2-3100 / 200Watch first SNS bounce events
4-7500 / 1k / 2k / 3kEngagement signal accumulates
Week 25k → 10kBottleneck week (see below)
Week 315k → 25kMost providers raise per-IP caps now
Week 430k → 40kWatch the per-domain reputation, not just per-IP
Week 5-645k → 50kTarget volume; let it stabilise for a full week

§4

Why week 2 is the bottleneck

By the end of week 1 you have proven you can send and that recipients are engaging. By the end of week 2 you are at 10,000/day — an order of magnitude jump from day one. This is when bulk-sender thresholds at Gmail and Yahoo start to apply: above ~5,000 messages/day to a single mailbox provider, the DMARC alignment, one-click unsubscribe, and complaint-rate ceilings become enforced rather than advisory. If you are missing any of those preconditions, week 2 is when it shows up — not as a block but as a quiet shift to the spam folder.

The fix is to land all three preconditions before warmup starts:

  • DMARC at p=quarantine; pct=100 minimum, ideally p=reject, with RUA reports flowing.
  • One-click unsubscribe via the List-Unsubscribe + List-Unsubscribe-Post headers (RFC 8058). AcelleMail emits these by default.
  • Complaint-rate budget — Amazon SES enforces a hard 0.1% complaint-rate ceiling. Stay below 0.05% as a working margin.

§5

How AcelleMail runs the schedule

The console command app/Console/Commands/WarmupListServers.php is the cron entry point. It iterates every active sending server with a strategy attached and applies the day-of-strategy daily cap before allowing any campaign to consume the server. The cap lives in SendingServerWarmupUsage; the per-day execution log is SendingServerWarmupLog. The strategy itself supports three limit types via constants on WarmupStrategy:

  • LIMIT_TYPE_PER_DAY_CAP — "today's send budget is N, no more"
  • LIMIT_TYPE_TARGET_VOLUME — "ramp until N/day is sustained, then mark complete"
  • LIMIT_TYPE_STOP_AFTER_DAYS — "ramp for N days, then stop"

For most operators the right combination is GROWTH_STRATEGY_LINEAR + LIMIT_TYPE_TARGET_VOLUME: ramp linearly until reaching the daily target, then disengage warmup and run normally. The strategy can be attached to any sending server — SES, Mailgun, generic SMTP, custom — independently of the underlying driver.

§6

What to watch on the SES reputation panel

If you are warming up against Amazon SES (the recommended pairing per /pricing), three numbers in the SES console "Reputation metrics" panel matter during the ramp:

  • Bounce rate — AWS warns at 5%, pauses at 10%. You should be far below 2%.
  • Complaint rate — AWS warns at 0.1%, pauses at 0.5%. Stay under 0.05% as the working margin.
  • Daily sending limit — SES auto-grows this as your sending history accumulates. If it stops growing, your warmup ramp is outpacing the auto-grant.

Each is per-account, not per-IP, so the metric is a derivative of all your sending in aggregate. If the bounce-rate number creeps up during week 2, slow down — do not push through. The provider has noticed something and the cost of investigating now is far smaller than the cost of recovering after a pause.

§7

When you can skip warmup

You can skip warmup in two situations and only two:

  1. You are using SES with shared IPs (the default — SES production accounts share a managed IP pool). The pool is pre-warmed; you inherit its reputation. Warmup is not relevant unless you upgrade to SES dedicated IPs.
  2. Your existing From-domain already has reputation built on a different IP, and you are migrating to the new IP. You still warm, but on an exponential preset rather than cautious linear, because the From-domain reputation carries forward.

For everyone else — new domains, dedicated IPs, fresh self-hosted Postal MTA installs — warmup is not optional. The longer treatment with day-by-day SES dashboard interpretation lives in /guide/email-deliverability §7.

Run this on your own infrastructure.

AcelleMail is a one-time-license self-hosted email platform. Full source code, no per-subscriber pricing.

Get AcelleMail — $74 Try Live Demo