Guides

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:

DayBase volumeHealth 100Health 70
1553
7151510
14252517
21333323
28404028

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 completes

Health 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

StateMeaning
inactiveWarmup is disabled for this account
warmingActively ramping (days 1-28)
maintenanceRamp 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_day is set to 28 and no longer increments
  • estimated_ready_date is 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

  1. Ensure DNS is correct before starting — Run POST /accounts/{id}/validate to confirm SPF, DKIM, and DMARC are configured. Invalid DNS will cause warmup emails to bounce, hurting reputation rather than helping it.

  2. Do not send cold campaigns during the first 7 days — Let the warmup runs establish a baseline inbox rate before adding campaign load.

  3. Watch the health trend — A declining inbox rate early in the ramp is a signal to check domain reputation, blacklists, and authentication records.

  4. Use placement tests alongside warmup — Run POST /placement to see how your domain is actually landing across major providers (Gmail, Outlook, Yahoo).

  5. Warmup works best on dedicated domains — Shared domains with existing history may be affected by other senders' behavior.

API reference