IP Warmup
Track and manage IP address warmup schedules to build sender reputation gradually
IP warmup is the process of gradually increasing sending volume from a new IP address so that receiving mail servers build trust in your sender reputation. Starting at low volumes and ramping up over 30–60 days significantly reduces the risk of landing in spam folders.
Requires active session (dashboard only).
Why warmup matters
New IP addresses have no sending history. If you immediately send 100,000 emails from a fresh IP, inbox providers will likely block or bulk-folder your messages. A structured warmup schedule builds a positive reputation signal over time.
Typical warmup ramp:
| Day | Max daily volume |
|---|---|
| 1–2 | 50 |
| 3–5 | 200 |
| 6–7 | 500 |
| 8–14 | 2,000 |
| 15–21 | 5,000 |
| 22–30 | 10,000 |
| 30+ | No limit (fully warmed) |
Get warmup report
GET /api/warmup
Returns the current warmup state for all tracked IPs plus a pool-level capacity summary.
Response
{
"success": true,
"ips": [
{
"ip_address": "198.51.100.42",
"domain": "mail.example.com",
"pool_name": "transactional",
"status": "warming",
"daily_limit_today": 2000,
"sent_today": 847,
"progress_pct": 42
}
],
"pools": {
"transactional": { "pool": "transactional", "remaining": 1153, "capacity": 2000 },
"marketing": { "pool": "marketing", "remaining": 4200, "capacity": 5000 },
"cold": { "pool": "cold", "remaining": 0, "capacity": 0 }
},
"summary": {
"totalIPs": 1,
"warming": 1,
"active": 0,
"paused": 0,
"totalCapacityToday": 7000
}
}progress_pct is the percentage of today's sending window already used.
Initialize an IP for warmup
POST /api/warmup
Content-Type: application/json
Request body
| Field | Type | Required | Description |
|---|---|---|---|
ipAddress | string | Yes | Valid IPv4 or IPv6 address |
domain | string | Yes | Sending domain associated with this IP |
poolName | transactional | marketing | cold | Yes | Which pool this IP belongs to |
targetDailyLimit | integer | No | Target volume once fully warmed. Defaults to 50000 |
Response
{
"success": true,
"config": {
"ip_address": "198.51.100.42",
"domain": "mail.example.com",
"pool_name": "transactional",
"status": "warming",
"daily_limit_today": 50,
"started_at": "2025-06-14T00:00:00Z",
"target_daily_limit": 50000
}
}HTTP 201 Created.
Pause or resume an IP
PUT /api/warmup
Content-Type: application/json
| Field | Type | Description |
|---|---|---|
ipAddress | string | The IP to act on |
action | pause | resume | Pause halts the warmup schedule; resume continues from the current day |
{ "ipAddress": "198.51.100.42", "action": "pause" }{ "success": true, "message": "IP warmup paused" }Pausing an IP does not reset its warmup progress. Resuming picks up where the schedule left off. If an IP is paused for more than 7 days, consider restarting the warmup from day 1 to avoid reputation decay.
Remove an IP from warmup tracking
DELETE /api/warmup?ip=198.51.100.42
Removes the IP from warmup tracking. The IP remains in its sending pool but is no longer subject to daily ramp limits. Use this when an IP has completed warmup and is operating at full capacity.
IP pool types
| Pool | Use case |
|---|---|
transactional | Welcome emails, password resets, order receipts — high-priority deliverability |
marketing | Newsletters, promotional campaigns, drip sequences |
cold | Outreach to contacts who have never interacted with your brand |
Example: start a warmup
curl -X POST /api/warmup \
-H "Content-Type: application/json" \
-d '{
"ipAddress": "198.51.100.42",
"domain": "mail.example.com",
"poolName": "transactional",
"targetDailyLimit": 50000
}'const res = await fetch('/api/warmup', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
ipAddress: '198.51.100.42',
domain: 'mail.example.com',
poolName: 'transactional',
targetDailyLimit: 50000,
}),
});
const { config } = await res.json();
console.log(`Warmup started. Today's limit: ${config.daily_limit_today}`);