Skip to content

IP Warmup for New Mail Servers

When you deploy a new mail server on a fresh IP address, major email providers (Gmail, Outlook, Yahoo) have no history for that IP. They treat unknown IPs with suspicion — sending too much mail too quickly from an unknown IP triggers rate limiting, deferrals, or outright blocks. IP warmup is the process of gradually increasing your sending volume over 30 days to build a positive reputation.

Vectis Mail has a built-in warmup system that automatically manages daily sending limits and advances the schedule for you.

Email providers use IP reputation as a primary signal for spam filtering. A brand-new IP has a neutral reputation — it is neither trusted nor distrusted. The provider’s algorithms need to observe a pattern of:

  • Consistent sending volume
  • Low bounce rates
  • Low spam complaint rates
  • Valid authentication (SPF, DKIM, DMARC)
  • Engaged recipients (opens, clicks, replies)

Sending 50,000 emails on day one from a new IP is indistinguishable from a spammer who just provisioned a VPS. Even if every message is legitimate, the IP will be throttled or blocked.

  • Gmail: Defers messages with 421 errors (“try again later”), eventually bouncing them
  • Microsoft 365: Blocks the IP after detecting volume spikes, requiring manual delisting
  • Yahoo: Silently drops messages to the spam folder
  • Corporate mail servers: Block unknown IPs that exceed their rate limits

Recovery from a damaged reputation takes weeks to months — far longer than doing the warmup correctly in the first place.

Vectis uses a 30-day warmup ramp that starts at 50 messages per day and increases to 200,000 per day. The schedule holds each level for two days to establish a consistent pattern before increasing:

DaysDaily limitCumulative capacity
1-250100
3-4100300
5-6200700
7-85001,700
9-101,0003,700
11-122,0007,700
13-145,00017,700
15-1610,00037,700
17-1820,00077,700
19-2040,000157,700
21-2260,000277,700
23-2480,000437,700
25-26100,000637,700
27-28150,000937,700
29-30200,0001,337,700

After day 30, the warmup is automatically marked as complete and sending limits are removed.

Vectis tracks warmup state in Postgres. The warmup manager runs a check every hour:

  1. For each active warmup IP, check if 24 hours have elapsed since the last daily reset
  2. If yes, advance to the next warmup day, update the daily limit, and reset the sent counter to zero
  3. If the IP has completed day 30, mark the warmup as inactive (complete)

Every outbound message is checked against the warmup limit before being queued for delivery. If the daily limit has been reached, the message is deferred until the next day’s reset.

Terminal window
curl -X POST https://mail.example.com/api/v1/warmup \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ip_address": "203.0.113.10",
"label": "Primary mail server"
}'

Response:

{
"data": {
"id": "01914f3e-7a5c-7000-8000-000000000001",
"ip_address": "203.0.113.10",
"label": "Primary mail server",
"warmup_started": "2026-04-04T00:00:00Z",
"warmup_day": 1,
"daily_limit": 50,
"daily_sent": 0,
"active": true
}
}
  1. Log into the Vectis admin dashboard
  2. Navigate to Deliverability > IP Warmup
  3. Click Start Warmup
  4. Enter the IP address and an optional label
  5. The warmup begins immediately
Terminal window
# List all warmup entries with status
curl https://mail.example.com/api/v1/warmup \
-H "Authorization: Bearer YOUR_TOKEN"

Response:

{
"data": [
{
"id": "01914f3e-7a5c-7000-8000-000000000001",
"ip_address": "203.0.113.10",
"label": "Primary mail server",
"warmup_started": "2026-04-04T00:00:00Z",
"warmup_day": 7,
"daily_limit": 500,
"daily_sent": 342,
"active": true,
"schedule_limit": 500,
"utilization_pct": 68.4
}
]
}

Key fields to monitor:

FieldMeaning
warmup_dayCurrent day in the 30-day schedule
daily_limitMaximum messages allowed today
daily_sentMessages sent so far today
utilization_pctPercentage of daily limit used
schedule_limitThe recommended limit for the current day (matches daily_limit unless manually adjusted)
activetrue while warmup is in progress, false when complete

The Deliverability section of the dashboard shows a warmup progress card with:

  • Current day and daily limit
  • A progress bar showing utilization
  • A chart of daily sends over the warmup period
  • Projected completion date

During the first two weeks, prioritise sending to recipients who are most likely to engage with your email (open, click, reply). Engagement signals are the strongest positive reputation indicators. If you have a mailing list, start with your most active subscribers.

Keep your bounce rate below 2% throughout warmup. If you are migrating from another provider, clean your mailing list before starting:

  • Remove addresses that have bounced in the past
  • Remove addresses that have not engaged in 6+ months
  • Verify addresses with an email validation service if you are unsure

Do not send your entire daily allocation in a single batch at midnight. Spread messages throughout the day to mimic organic sending patterns. If you are using the Vectis API for transactional email, this happens naturally.

During warmup, check daily:

  • Bounce rate: Should be under 2%
  • Spam complaint rate: Should be under 0.1%
  • Deferral rate: Some deferrals are normal during warmup; persistent deferrals from a specific provider indicate a problem
  • RBL status: Run vectis rbl check or check the API endpoint to ensure you are not listed on any blocklists

If you pause sending for several days during warmup, you may lose the reputation you have built. The schedule is designed for 30 consecutive days. If you must pause, resume from the day you stopped — do not restart from day 1.

Terminal window
curl -X DELETE https://mail.example.com/api/v1/warmup/WARMUP_ID \
-H "Authorization: Bearer YOUR_TOKEN"

Removing warmup tracking immediately removes all sending limits for that IP. Only do this if:

  • The 30-day warmup is complete (it auto-deactivates)
  • You are migrating an IP that already has an established reputation
  • You are testing in a development environment

After day 30, Vectis automatically deactivates the warmup entry for the IP. From this point:

  • All sending limits are removed
  • The IP is considered fully warmed
  • You should continue to follow deliverability best practices to maintain your reputation

Your IP’s reputation is not permanent. Even after warmup, sudden volume spikes, high bounce rates, or spam complaints can damage it. Treat warmup as the foundation, not a one-time task.

The most common mistake. Even if you have 10,000 messages queued, the warmup schedule exists for a reason. If you need to send high volumes from day one, consider using an established relay service for the first 30 days while your IP warms up.

A 5% bounce rate during warmup will damage your reputation far more than the same rate from an established IP. Clean your lists aggressively before starting.

Sending password reset emails to inactive accounts or re-engagement campaigns during warmup is counterproductive. These messages have low engagement and high complaint rates — exactly the signals that harm your reputation.

SPF, DKIM, and DMARC must be fully configured and passing before you start warmup. Sending unauthenticated mail from a new IP is a recipe for immediate blocking. See the DKIM, SPF & DMARC guide.

If multiple domains share the same IP and one domain sends spam, all domains on that IP suffer. In Vectis, you control all domains on your server, so this is only a concern if you host mail for external parties.

If your deployment uses multiple outbound IPs (for example, separate IPs for transactional and marketing email), each IP must be warmed independently. Create a separate warmup entry for each:

Terminal window
# Transactional IP
curl -X POST https://mail.example.com/api/v1/warmup \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"ip_address": "203.0.113.10", "label": "Transactional"}'
# Marketing IP
curl -X POST https://mail.example.com/api/v1/warmup \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"ip_address": "203.0.113.11", "label": "Marketing"}'