Email Warmup
Email warmup is the process of gradually increasing send volume from a new mailbox to establish sender reputation. Sending high volumes from a cold mailbox triggers spam filters. Warmup builds the sending history needed to land in inboxes.
zend.sh includes a built-in warmup system that runs automatically in the background. Warmed accounts exchange emails with a network of seed mailboxes, generating authentic engagement signals (opens, replies, inbox placements).
How the 28-day ramp works
The warmup ramp starts at 5 emails/day on day 1 and increases to 40 emails/day by day 28. The actual volume on any day depends on the account's current health score:
| Day | Base volume | Health 100 | Health 70 |
|---|---|---|---|
| 1 | 5 | 5 | 3 |
| 7 | 15 | 15 | 10 |
| 14 | 25 | 25 | 17 |
| 21 | 33 | 33 | 23 |
| 28 | 40 | 40 | 28 |
After day 28, the account enters maintenance mode — it continues to exchange warmup emails at a steady rate to maintain reputation.
Enabling warmup on an account
Warmup is opt-in per account. Enable it when connecting a new mailbox:
import Zend from 'zend-sh'
const zend = new Zend({ apiKey: process.env.ZEND_API_KEY })
// Enable warmup when creating account
const account = await zend.accounts.create({
email: 'sender@yourdomain.com',
provider: 'google',
warmup_opt_in: true,
// ...other credentials
})Or enable it on an existing account:
await zend.accounts.update('acc_abc123', {
warmup_opt_in: true
})Once enabled, the warmup worker picks up the account in the next cycle (typically within an hour) and begins the ramp.
Monitoring warmup progress
Use the warmup status endpoint to track progress:
const status = await zend.accounts.warmupStatus('acc_abc123')
console.log(status.state) // 'warming', 'maintenance', or 'inactive'
console.log(status.ramp_day) // Current day in the 28-day ramp (1-28)
console.log(status.target_volume) // Emails to send today
console.log(status.sends_today) // Emails sent in warmup today
console.log(status.health_score) // Current health score (0-100)
console.log(status.estimated_ready_date) // ISO date when warmup completesHealth trend
The health_trend array shows inbox placement rates per ramp day — useful for catching reputation problems early:
for (const point of status.health_trend) {
console.log(`Day ${point.day}: ${(point.inbox_rate * 100).toFixed(1)}% inbox rate`)
}If inbox rate drops below 70% for multiple consecutive days, review the account's DNS setup (SPF, DKIM, DMARC) and consider pausing campaigns temporarily.
Warmup states
| State | Meaning |
|---|---|
inactive | Warmup is disabled for this account |
warming | Actively ramping (days 1-28) |
maintenance | Ramp complete, maintaining at steady volume |
Interaction with campaign sending
During warmup, accounts are still available for campaign sends. The warmup system runs in parallel — warmup sends count toward warmup_daily_limit, while campaign sends count toward daily_limit. These limits are tracked separately.
However, campaigns with health_weighted rotation strategy will allocate fewer sends to accounts with lower health scores. A warming account with health score 70 will receive proportionally fewer campaign sends than a fully warmed account at health score 95.
Maintenance mode
After day 28, the account transitions to maintenance mode automatically. In maintenance mode:
- The account sends a steady volume of warmup emails daily to maintain reputation signals
ramp_dayis set to 28 and no longer incrementsestimated_ready_dateis null (ramp is complete)- The account is fully available for campaign sending at its
daily_limit
You can check if an account has completed warmup by checking status.state === 'maintenance'.
Tips for successful warmup
-
Ensure DNS is correct before starting — Run
POST /accounts/{id}/validateto confirm SPF, DKIM, and DMARC are configured. Invalid DNS will cause warmup emails to bounce, hurting reputation rather than helping it. -
Do not send cold campaigns during the first 7 days — Let the warmup runs establish a baseline inbox rate before adding campaign load.
-
Watch the health trend — A declining inbox rate early in the ramp is a signal to check domain reputation, blacklists, and authentication records.
-
Use placement tests alongside warmup — Run
POST /placementto see how your domain is actually landing across major providers (Gmail, Outlook, Yahoo). -
Warmup works best on dedicated domains — Shared domains with existing history may be affected by other senders' behavior.