IP Warmup
IP warmup is the process of gradually increasing sending volume on a fresh IP address so that receiving mail servers learn to trust it before you send at full volume. Skipping warmup or rushing it will result in widespread deferrals and RBL listings that are difficult to recover from.
Pre-conditions
Section titled “Pre-conditions”Before starting warmup, verify all of the following:
- The IP is assigned to the server and bound to Postfix's
inet_interfaces. - A PTR (reverse DNS) record is set for the IP, pointing to the server's hostname. Confirm with:
Terminal window dig -x <ip> +short - SPF, DKIM, and DMARC records are published for every domain that will send from this IP. Confirm with:
Terminal window hostcraftd mail dns-check --domain=example.com - Postfix is configured and healthy:
Terminal window postfix checksystemctl is-active postfix - The deliverability dashboard is accessible at Admin -> Mail -> Deliverability.
- You have an estimate of the target daily send volume for this IP after warmup completes.
Warmup schedule
Section titled “Warmup schedule”The default ramp doubles or quintuples volume each week. Do not skip ahead; the schedule exists to build trust incrementally.
| Week | Daily send limit |
|---|---|
| 1 | 50 |
| 2 | 200 |
| 3 | 1,000 |
| 4 | 5,000 |
| 5 | 20,000 |
| 6 | 50,000 |
| 7+ | Target volume |
If your target volume is below 50,000/day you can stop early once you comfortably exceed it with a bounce rate under 2%.
Procedure
Section titled “Procedure”Step 1: Start the warmup schedule
Section titled “Step 1: Start the warmup schedule”Via the UI: Admin -> Mail -> Deliverability -> Warm up IP -> enter the IP and target volume -> Start.
Via the API:
curl -X POST https://panel.example.com/api/v1/mail/deliverability/warmup \ -H "Authorization: Bearer $HOSTCRAFT_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ip": "203.0.113.10", "target_volume": 100000}'The daemon stores the schedule and begins enforcing the per-day cap on Postfix's per-destination rate limit.
Step 2: Daily monitoring
Section titled “Step 2: Daily monitoring”Check the deliverability dashboard every day during warmup:
- Open Admin -> Mail -> Deliverability -> select the IP.
- Review the three key metrics for the past 24 hours:
- Bounce rate: must stay below 2%. Above 5% requires immediate pause (see below).
- RBL listings: any listing requires immediate investigation.
- Sender Score: aim for 70+ by week 3, 90+ by week 6.
- Check for deferred messages piling up in the queue:
Terminal window postqueue -p | head -40hostcraftd mail queue --status=deferred
Step 3: Pause if bounce rate spikes
Section titled “Step 3: Pause if bounce rate spikes”If bounce rate exceeds 5%, pause the warmup immediately before the sending cap resets the next day.
Via the UI: Deliverability -> the IP -> Pause warmup.
Via the API:
curl -X POST https://panel.example.com/api/v1/mail/deliverability/warmup/203.0.113.10/pause \ -H "Authorization: Bearer $HOSTCRAFT_TOKEN"The schedule freezes at the current week. The schedule does not advance during a pause. You will resume at the same week you paused.
While paused, investigate the bounce cause:
- Pull the bounce log:
Terminal window journalctl -u postfix --since="1 hour ago" | grep -i "bounce\|reject\|deferred" - Check for RBL listings on the dashboard. If listed, proceed to the recovery steps in the Verification section.
- Identify whether the bounces are hard (bad addresses) or soft (temporary rejections from receiving servers). Hard bounces above 2% indicate a list hygiene problem; soft bounces indicate reputation or configuration issues.
- Fix the root cause before resuming.
Step 4: Resume after pause
Section titled “Step 4: Resume after pause”Via the UI: Deliverability -> the IP -> Resume warmup.
Via the API:
curl -X POST https://panel.example.com/api/v1/mail/deliverability/warmup/203.0.113.10/resume \ -H "Authorization: Bearer $HOSTCRAFT_TOKEN"The schedule resumes from the week it was paused on. Monitor closely for the first 48 hours after resuming.
Step 5: Cancel the schedule (if needed)
Section titled “Step 5: Cancel the schedule (if needed)”If you decide not to use this IP for sending (wrong IP provisioned, IP disposed, etc.), delete the warmup schedule:
curl -X DELETE https://panel.example.com/api/v1/mail/deliverability/warmup/203.0.113.10 \ -H "Authorization: Bearer $HOSTCRAFT_TOKEN"This removes the schedule and the daily cap entirely. It does not affect any sends that already went out.
Verification
Section titled “Verification”At the end of each week, run a full deliverability check:
- Run mail-tester.com on a sample message from this IP. Target score of 9/10 or above by week 3.
- Confirm no RBL listings via the dashboard or manually:
Terminal window hostcraftd mail rbl-check --ip=203.0.113.10 - Confirm bounce rate for the week was under 2%.
- Confirm Sender Score is trending upward week over week.
Warmup is complete when you have sent at the target volume for two consecutive days without bounces exceeding 2% and without any RBL listings.
RBL recovery if you get listed
Section titled “RBL recovery if you get listed”If the dashboard shows an RBL listing during warmup:
- Pause the warmup schedule immediately.
- On the dashboard, click the listing to get the delisting URL for that RBL.
- Follow the delisting process (each RBL has its own form; typical turnaround is 24 to 72 hours).
- Investigate why the listing happened: high bounce rate, spam complaint, misconfigured SPF or DKIM, or a compromised sending account.
- Fix the root cause.
- Document the incident on the server's postmaster page (Admin -> Mail -> Postmaster) so it is visible for future operators.
- Resume warmup only after delisting is confirmed.
Rollback
Section titled “Rollback”There is no rollback for sends that have already gone out. If warmup is going badly:
- Pause the schedule to stop new volume.
- Move sending for affected domains to a different (already-warmed) IP if one is available.
- If no alternative IP exists, reduce send volume to the previous week's limit and monitor for 48 hours before attempting to advance again.