How to Warm Up an Email Domain
A step-by-step guide to warming your email domain. Includes a 30-day schedule, technical prerequisites, code examples, and common mistakes to avoid.
You've just set up a new domain for sending emails. You're ready to blast thousands of messages to your users. Hit send and… straight to spam.
This happens because email providers like Gmail and Outlook don't trust new domains. They need proof that you're a legitimate sender, not a spammer. That's where domain warming comes in.
Domain warming is the process of gradually increasing your sending volume over 30 days to build reputation with email providers.
- Start with 10-20 emails/day to your most engaged contacts
- Ramp to full volume by day 30
- Maintain 20%+ open rates and sub-2% bounce rates throughout
- Set up SPF, DKIM, and DMARC before your first send
Domain warming is like establishing credit history. You start small, prove you're trustworthy, and slowly increase your sending volume.
This guide walks you through the exact steps to warm up your email domain properly. You'll learn the technical requirements, the day-by-day warming schedule, and how to avoid common mistakes that can destroy your sender reputation before you even start.
Why Email Domain Warming Matters
Email service providers (ESPs) receive billions of spam messages daily. Their filtering algorithms are designed to be skeptical of new senders. When you start sending from a fresh domain, you have zero reputation. ESPs will scrutinize every email you send.
Send too many emails too quickly from a new domain, and ESPs will flag you as suspicious. Your emails land in spam folders. Some might bounce entirely. Once you damage your domain reputation, it takes months to recover.
The warming process proves three things to ESPs:
- You're a real person or business, not a bot
- Your emails provide value to recipients
- You follow email best practices consistently
A properly warmed domain can achieve 95%+ inbox placement rates. A rushed or improperly warmed domain might see 30% or worse.
Technical Prerequisites Before You Start Warming
Domain warming isn't just about sending volumes. You need proper authentication records in place first.
SPF, DKIM, and DMARC Configuration
These three authentication protocols tell receiving servers that your emails are legitimate.
SPF (Sender Policy Framework) lists which IP addresses can send email for your domain. Add an SPF record to your DNS:
v=spf1 include:sendpigeon.dev ~all
DKIM (DomainKeys Identified Mail) adds a digital signature to your emails. When you set up an email service, they'll provide DKIM keys to add to your DNS. For SendPigeon, you'll get a CNAME record like:
sp._domainkey.yourdomain.com CNAME sp._domainkey.sendpigeon.dev
DMARC (Domain-based Message Authentication, Reporting & Conformance) tells receiving servers what to do if SPF or DKIM checks fail:
v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com
Start with p=none during warming. This monitors without blocking. After warming completes successfully, switch to p=quarantine or p=reject.
Verify these records are active before sending your first email. Use tools like MXToolbox or dig commands to check DNS propagation.
Dedicated Domain vs Subdomain Strategy
Should you warm your main domain or use a subdomain?
For transactional emails (password resets, order confirmations), use your main domain. Users expect these from yourbrand.com.
For marketing emails or high-volume sends, use a subdomain like mail.yourbrand.com or updates.yourbrand.com. This isolates reputation risk. If marketing emails perform poorly, your transactional domain stays clean.
Some developers set up multiple subdomains:
transactional.yourdomain.comfor critical user emailsmarketing.yourdomain.comfor newslettersnotifications.yourdomain.comfor product updates
Each subdomain needs its own warming schedule.
Reverse DNS and PTR Records
Configure reverse DNS (rDNS) so your sending IP address points back to your domain. Most email APIs handle this automatically, but verify it's configured correctly.
When your IP has proper rDNS, receiving servers see a consistent identity. Without it, you look less legitimate.
The 30-Day Domain Warming Schedule
Here's the specific warming schedule used by successful senders. This assumes you're starting with zero sending history.
The key principle: increase volume gradually while maintaining high engagement rates.
| Day Range | Daily Volume | Notes |
|---|---|---|
| Days 1-3 | 10-20 emails | Send only to highly engaged contacts |
| Days 4-7 | 25-50 emails | Continue with engaged recipients |
| Days 8-10 | 75-100 emails | Mix of engaged and recent signups |
| Days 11-14 | 150-250 emails | Broader audience, monitor bounces closely |
| Days 15-18 | 300-500 emails | Ramp up if metrics remain strong |
| Days 19-22 | 600-1,000 emails | Continue monitoring engagement |
| Days 23-26 | 1,500-2,500 emails | Near full volume for most senders |
| Days 27-30 | 3,000-5,000 emails | Full production volume |
This schedule works for most use cases. High-volume senders (50K+ emails daily) should extend warming to 45-60 days.
What Makes a Contact "Engaged"?
Start your warming with recipients most likely to open and click your emails:
- Customers who recently made a purchase
- Users who logged in within the last week
- Subscribers who opened your last 3+ emails
- Team members and partners who know your brand
Avoid sending to old, inactive contacts during warming. A string of unopened emails signals poor sender quality.
Implementing Domain Warming with SendPigeon
Let's walk through the practical implementation. SendPigeon makes domain warming straightforward because you can send from unlimited domains on one account, even on the free tier.
Initial Setup
First, add your domain and configure DNS records:
curl -X POST https://api.sendpigeon.dev/domains \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "yourdomain.com"
}'
The API returns the DNS records you need to add. Configure SPF, DKIM, and DMARC as shown earlier.
Day 1-3: Starting Small
Begin with your most engaged contacts. Here's sample code to send your first warming emails:
import { SendPigeon } from "sendpigeon";
const pigeon = new SendPigeon("YOUR_API_KEY");
// Day 1: 15 emails to highly engaged users
const engagedUsers = [
{ email: "alice@example.com", name: "Alice" },
{ email: "bob@example.com", name: "Bob" },
// ... 13 more engaged contacts
];
async function sendWarmingBatch(recipients: { email: string; name: string }[]) {
for (const user of recipients) {
await pigeon.send({
from: "updates@yourdomain.com",
to: user.email,
subject: "Welcome to our new email system",
html: `<p>Hi ${user.name},</p>
<p>We've upgraded our email infrastructure to serve you better.</p>
<p>Expect faster delivery and improved reliability.</p>`,
});
// Add small delay between sends
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
sendWarmingBatch(engagedUsers);
That 5-second delay between emails is intentional. Spreading sends over time looks more natural than batch bursts.
Tracking Warming Progress
Monitor these metrics in the SendPigeon dashboard:
- Open rate: Aim for 25%+ during warming
- Click rate: 3%+ is healthy
- Bounce rate: Keep under 2%
- Complaint rate: Must stay under 0.1%
- Unsubscribe rate: Under 0.5% is acceptable
If any metric falls outside these ranges, pause warming and diagnose the issue.
Adjusting Volume Based on Metrics
The schedule above is a guideline, not a rule. Your actual warming speed depends on performance.
If your open rate drops below 20% or bounce rate exceeds 3%, slow down:
function determineNextBatchSize(currentMetrics: {
opens: number;
delivered: number;
bounces: number;
sent: number;
previousVolume: number;
}) {
const openRate = currentMetrics.opens / currentMetrics.delivered;
const bounceRate = currentMetrics.bounces / currentMetrics.sent;
if (openRate > 0.25 && bounceRate < 0.02) {
return currentMetrics.previousVolume * 1.5; // Increase 50%
} else if (openRate > 0.2 && bounceRate < 0.03) {
return currentMetrics.previousVolume * 1.2; // Increase 20%
} else {
return currentMetrics.previousVolume * 0.8; // Decrease 20%
}
}
Leveraging the Free Tier Strategically
SendPigeon offers 3,000 free emails per month. That's perfect for warming a new domain over 30 days.
Here's how the math works:
- 3,000 emails across 30 days = 100 emails/day average
- Following the warming schedule above uses approximately 2,800 emails
- You have room for testing and adjustments
For multiple domains, the unlimited domains feature means you can warm several domains simultaneously within your monthly allocation.
Common Domain Warming Mistakes to Avoid
Mistake 1: Buying or Renting Email Lists
Never send to purchased lists during warming. These contacts didn't opt in to receive your emails. They won't recognize your sender name. Most won't open your emails.
Low engagement from purchased lists will tank your reputation immediately. ESPs notice when large percentages of recipients ignore or mark emails as spam.
Build your warming list from legitimate sources:
- Website signups
- Product users who opted in
- Event registrations
- Existing customer databases
Mistake 2: Sending Identical Content Repeatedly
Email filters watch for repetitive patterns. Sending the exact same message to hundreds of recipients looks like spam behavior.
During warming, vary your subject lines and content. Personalize where possible:
const subjectVariations = [
`Welcome, ${user.name}!`,
`${user.name}, here's what's new`,
`An update for you, ${user.name}`,
];
const subject =
subjectVariations[Math.floor(Math.random() * subjectVariations.length)];
Even small variations help you look more like a human sender.
Mistake 3: Ignoring Bounce Processing
Bounces are toxic during warming. A hard bounce (invalid email address) should be immediately removed from your list.
Soft bounces (temporary issues) deserve a few retry attempts, but stop after 3-5 failures.
SendPigeon provides detailed bounce information through webhooks. Set these up on day one.
Mistake 4: Inconsistent Sending Patterns
Don't send 500 emails on Monday, then nothing until Friday. Erratic patterns raise red flags.
Maintain consistent daily volumes. If your warming schedule calls for 250 emails on days 11-14, send approximately 250 each day, not 1,000 on day 11 alone.
Mistake 5: Neglecting Email Content Quality
Even during warming, content quality matters. Your emails should provide value and encourage engagement.
Avoid these content red flags:
- ALL CAPS SUBJECT LINES
- Excessive exclamation marks
- Misleading subject lines (clickbait)
- Large images with little text
- Broken links or poor formatting
- Spam trigger words (free, guarantee, click here)
Test your content with spam checking tools before warming begins. SpamAssassin and Mail Tester provide useful scores.
Advanced Warming Techniques for Faster Results
Warming Multiple IPs Simultaneously
Large senders using dedicated IPs need to warm each IP address separately. This is complex but necessary for high volumes.
If you're sending 100K+ emails daily, you'll need multiple IPs. Warm them in parallel but stagger start dates by 3-5 days:
- IP 1: Start day 1
- IP 2: Start day 4
- IP 3: Start day 8
This prevents overloading your engaged contact list with duplicate emails.
IP Pool Strategy
Once IPs are warmed, create pools for different email types:
const pools = {
transactional: ["192.0.2.1", "192.0.2.2"],
marketing: ["192.0.2.3", "192.0.2.4"],
notifications: ["192.0.2.5"],
};
function selectIP(emailType: keyof typeof pools) {
const pool = pools[emailType];
return pool[Math.floor(Math.random() * pool.length)];
}
This isolation protects critical transactional emails from marketing campaign issues.
Segmented Warming by ESP
Gmail, Outlook, and Yahoo have different filtering algorithms. Advanced senders warm separately for each major ESP.
Track performance by recipient domain:
const metricsByESP: Record<string, { sent: number; opens: number; bounces: number }> = {
gmail: { sent: 0, opens: 0, bounces: 0 },
outlook: { sent: 0, opens: 0, bounces: 0 },
yahoo: { sent: 0, opens: 0, bounces: 0 },
};
// Adjust volumes per ESP based on performance
if (metricsByESP.gmail.opens / metricsByESP.gmail.sent < 0.2) {
// Slow down Gmail sends
dailyGmailVolume *= 0.8;
}
This granular approach optimizes deliverability across all providers.
Maintaining Your Domain Reputation Post-Warming
Warming doesn't end after 30 days. You need ongoing maintenance to preserve your reputation.
Continued List Hygiene
Remove inactive subscribers regularly. If someone hasn't opened your emails in 90 days, they're hurting your reputation.
Implement a re-engagement campaign first:
- Send a "We miss you" email
- Wait 7 days
- Send a final "Last chance" email
- Remove non-responders
This gives genuinely interested recipients a chance to re-engage while cleaning out dead weight.
Monitoring Reputation Metrics
Check these metrics weekly:
- Sender Score: Free service from Validity. Scores range 0-100; aim for 90+.
- Google Postmaster Tools: Shows your reputation specifically with Gmail.
- Microsoft SNDS: Monitors your reputation with Outlook/Hotmail.
Handling Volume Spikes
What if you need to send a large campaign after warming completes?
Don't jump from 5K to 50K emails overnight. Increase gradually:
- Day 1: Your normal volume + 25%
- Day 2: Normal + 50%
- Day 3: Normal + 100%
- Day 4: Normal + 150%
This mini-warming period for volume increases protects your reputation.
Domain Warming Checklist
Pre-Warming
- SPF record configured and verified
- DKIM keys added to DNS
- DMARC policy set to
p=none - Reverse DNS (PTR) configured
- Email authentication tested with mail-tester.com
- Bounce and complaint webhooks configured
- Engaged recipient list identified (minimum 500 contacts)
- Email templates tested for spam scores
- SendPigeon account set up and verified
During Warming
- Following gradual volume increase schedule
- Open rate above 20%
- Bounce rate below 3%
- Complaint rate below 0.1%
- Consistent sending times maintained
- Content variations implemented
- Hard bounces removed immediately
- Engagement metrics tracked in dashboard
Post-Warming
- Weekly reputation checks scheduled
- Inactive subscriber removal process active
- Re-engagement campaigns for at-risk subscribers
- Volume increases handled gradually
- List growth via opt-in only
- Quarterly DNS record verification
- Regular content quality audits
Your Warmed Domain Awaits
Domain warming requires patience. There's no shortcut around the 30-day process. Rushing damages your reputation in ways that take months to fix.
The good news: follow this schedule systematically and you'll build a solid foundation for long-term email success. Your emails will reach inboxes consistently. Your engagement rates will stay strong. Your sender reputation will withstand occasional campaign hiccups.
Start today with SendPigeon's free tier. Configure your DNS records, identify your engaged recipients, and send your first 15 emails to begin warming. Track your progress in the dashboard, adjust based on metrics, and stick to the schedule.
In 30 days, you'll have a fully warmed domain ready for production email volumes. Your messages will reach the inbox, not the spam folder. That's the power of proper domain warming.
Next Steps
- Set up authentication first: Email Authentication Setup Guide — required before warming
- Check your records: Deliverability Checker — verify SPF, DKIM, DMARC
- Full deliverability audit: Email Deliverability Checklist
- Understand your domain: What Is an Email Domain?
- Start sending: Framework Guides — integrate with your stack