Reputation and IP warming series. This is the tactical guide to computing your warmup schedule. For related guides on IP warmup, domain reputation, and cold IP recovery, see the reputation and warming hub →
Quick calculator reference
A warmup calculator gives you the daily volume number for every day of a ramp, given your starting volume, target volume, and growth rate. The formula is simple; the operational discipline is applying it correctly, respecting provider-specific caps, and adjusting when KPIs demand it. This guide covers the math, four ready-made schedules for common target volumes, and the code to compute a custom ramp for any target.
| Core formula | volume_day_N = min(target, initial * growth_rate^(N-1)) |
| Typical growth rates | 30% (conservative), 40% (standard), 50% (aggressive), 100% (rushed, risky) |
| Starting volume | 50-100 for cold IP; 500-1,000 for shared pool addition |
| Provider caps | Gmail: soft cap around 40% ramp; Microsoft: 25% ramp; Yahoo: 30% ramp |
| KPI-triggered adjustment | Hold volume if bounce > 2% or complaints > 0.1% for 3 consecutive days |
| Expected duration | 21-30 days for small targets; 45-90 days for large |
Who this guide is for
- Ops engineer building warmup automation
- Developer implementing a send scheduler
- Team needing an ESP-agnostic daily ramp formula
What you’ll learn
- The exponential formula and how to parameterize it
- 4 ready-made schedules for 10k, 100k, 500k, 1M targets
- Python code and provider-specific caps overlay
The reputation and warming series (4 guides)
1. IP warmup schedule
The day-by-day ramp for new IPs
2. Domain vs IP reputation
Which score matters where in 2026
3. Warmup calculator
READINGFormulas, Python and tables per target
4. Cold IP recovery
When reputation crashed and you rebuild
Every warmup ends up governed by the same math regardless of what tool computes it: pick a starting volume, pick a target, pick a growth rate, and the daily numbers fall out. The interesting decisions are in the parameters (which growth rate for which target), the overlays (provider caps, segment quality), and the adjustments (what to do when a day’s metrics say slow down). This guide shows the formula, four ready-made schedules covering the target volume ranges you will actually see, and the pseudocode to build a calculator for any custom target.
The core formula
Daily volume follows an exponential curve capped at your target:
volume_day_N = min(target_volume, initial_volume * growth_rate^(N-1))Where:
- N is the day number (day 1 is the first day of sending).
- initial_volume is what you send on day 1 (typically 50-100 for a cold IP).
- growth_rate is the daily multiplier (1.30 = 30 percent growth, 1.40 = 40 percent, etc.).
- target_volume is the daily volume you want to reach in steady state.
The min() ensures you never exceed the target once the ramp hits it. The formula produces exponential growth up to the cap, then flat at target.
Example: 100k target, 40% growth rate, initial 50
| Day | Formula | Volume |
|---|---|---|
| 1 | 50 * 1.40^0 | 50 |
| 2 | 50 * 1.40^1 | 70 |
| 3 | 50 * 1.40^2 | 98 |
| 5 | 50 * 1.40^4 | 192 |
| 10 | 50 * 1.40^9 | 1,032 |
| 15 | 50 * 1.40^14 | 5,553 |
| 20 | 50 * 1.40^19 | 29,884 |
| 25 | 50 * 1.40^24 | 160,821 (capped to 100,000) |
Full volume reached around day 24 with this parameter set. Adjust growth rate to reach target sooner or later.
Choosing the growth rate
Growth rate determines how fast the ramp reaches target. Faster is not necessarily better:
| Growth rate | Aggressiveness | Best for | Risk |
|---|---|---|---|
| 1.20 (20%) | Very conservative | Reputation recovery, low-engagement lists | Slow (60+ days to 100k) |
| 1.30 (30%) | Conservative | Standard commercial senders, first warmups | Low |
| 1.40 (40%) | Standard | Well-engaged lists, established brands | Medium |
| 1.50 (50%) | Aggressive | Very high engagement lists, tight timelines | Higher; monitor daily |
| 2.00 (100%) | Rushed | Not recommended | High; frequently causes ramp failure |
If your list is old, purchased, or has questionable engagement history, use a lower growth rate. If your list is fresh, opt-in, and high-engagement, 40 percent is standard. 50 percent is safe only with strong metrics on the ramp so far. 100 percent works occasionally but has a high failure rate.
Three worked scenarios: parameters to pick
Small target 10k/day, first-time warmup
SMALLParameters: initial 50, growth 1.40, target 10,000. Reaches target around day 17. Compressed ramp because volume is small enough that even fast growth hits low absolute numbers early.
Formula: 50 × 1.40^(N-1) capped at 10,000 · Duration: 17-21 days · Watch: weekly engagement
Standard target 100k/day, engaged consumer list
STANDARDParameters: initial 50, growth 1.40, target 100,000. Reaches target around day 24. Standard ramp for most SaaS and consumer brands with a clean opt-in list.
Formula: 50 × 1.40^(N-1) capped at 100,000 · Duration: 24-30 days · Watch: Postmaster Domain Reputation daily
Very large target 1M/day, high-volume sender
HIGH VOLUMEParameters: initial 100, growth 1.30, target 1,000,000. Reaches target around day 40. Slower growth rate because the absolute daily volumes at each stage are much larger and receivers watch big spikes closely.
Formula: 100 × 1.30^(N-1) capped at 1M · Duration: 40-60 days · Watch: per-provider distribution + SNDS
Four ready-made schedules
Schedule A: Small sender (target 10,000/day)
Starting volume 50, growth rate 1.40 (40 percent), reaches target ~day 16.
| Day | Volume | Segment |
|---|---|---|
| 1 | 50 | Top 5% engaged |
| 3 | 98 | Top 5% engaged |
| 5 | 192 | Top 10% engaged |
| 7 | 376 | Top 10% engaged |
| 9 | 737 | Top 20% engaged |
| 11 | 1,444 | Top 40% engaged |
| 13 | 2,831 | Top 60% engaged |
| 15 | 5,549 | 30d engaged |
| 16 | 7,769 | 30d engaged |
| 17 | 10,000 (target) | 90d engaged |
| 18+ | 10,000 | Full active list |
Schedule B: Standard sender (target 100,000/day)
Starting volume 50, growth rate 1.40 (40 percent), reaches target ~day 24.
Days 1-16 identical to Schedule A. Continue after target 10k:
| Day | Volume | Segment |
|---|---|---|
| 17 | 10,876 | Top 60% |
| 19 | 21,317 | Top 80% |
| 21 | 41,780 | 30d engaged |
| 23 | 81,884 | 60d engaged |
| 24 | 100,000 (target) | 90d engaged |
| 25+ | 100,000 | Full active list |
Schedule C: Large sender (target 500,000/day)
Starting volume 100, growth rate 1.35 (35 percent, slower for stability), reaches target ~day 30.
| Day | Volume |
|---|---|
| 1 | 100 |
| 5 | 332 |
| 10 | 1,489 |
| 15 | 6,675 |
| 20 | 29,929 |
| 25 | 134,180 |
| 28 | 329,921 |
| 30 | 500,000 (target) |
| 31+ | 500,000 |
Schedule D: Very large sender (target 1,000,000/day)
Starting volume 100, growth rate 1.30 (30 percent, slower for stability), reaches target ~day 40.
| Day | Volume |
|---|---|
| 1 | 100 |
| 7 | 627 |
| 14 | 4,065 |
| 21 | 26,370 |
| 28 | 171,053 |
| 35 | 1,109,431 (capped to 1,000,000) |
| 36+ | 1,000,000 |
Provider-specific daily caps
The formula above computes the total daily volume. Your recipient list is not evenly distributed across providers, so you need to cap per-provider volume within the daily total. Approximate proportional guidance:
- Gmail: up to 50 percent of the daily volume total is safe if engagement holds.
- Microsoft: keep to 25 percent maximum in weeks 1-2 (Microsoft is strictest); increase to 40 percent thereafter.
- Yahoo: up to 30 percent throughout the ramp.
- Apple: up to 15 percent (opaque reputation, watch metrics).
- Others: distribute proportionally to list share.
If your list is 70 percent Gmail (typical for consumer SaaS), you cannot send 100 percent of your day-1 volume to Gmail without over-loading; distribute proportionally within the caps and let Microsoft/Yahoo/others catch up over successive days.
Building the calculator: pseudocode + Python
Pseudocode
function warmup_schedule(initial, target, growth_rate, max_days):
schedule = []
for day = 1 to max_days:
volume = min(target, initial * growth_rate ^ (day - 1))
schedule.append({day, volume, segment_for(day)})
if volume >= target:
append_flat_days_until(schedule, target, until_day=max_days)
break
return schedule
function segment_for(day):
if day <= 7:
return "7-day openers"
if day <= 14:
return "30-day openers"
if day <= 21:
return "60-day openers"
return "full active list"Python implementation
def warmup_schedule(initial=50, target=100_000, growth_rate=1.40, max_days=45):
"""Generate a warmup schedule. Returns list of (day, volume, segment) tuples."""
schedule = []
for day in range(1, max_days + 1):
raw_volume = initial * (growth_rate ** (day - 1))
volume = min(target, int(raw_volume))
segment = segment_for(day)
schedule.append((day, volume, segment))
if volume >= target:
# Continue at target for remaining days
for extra_day in range(day + 1, max_days + 1):
schedule.append((extra_day, target, "full active list"))
break
return schedule
def segment_for(day):
if day <= 7:
return "7-day engaged"
if day <= 14:
return "30-day engaged"
if day <= 21:
return "60-day engaged"
if day <= 28:
return "90-day engaged"
return "full active list"
# Usage
sched = warmup_schedule(initial=50, target=100_000, growth_rate=1.40)
for day, volume, segment in sched:
print(f"Day {day}: {volume:,} to {segment}")Adding provider caps
PROVIDER_CAPS = {
'gmail': 0.50,
'microsoft': 0.25,
'yahoo': 0.30,
'apple': 0.15,
'other': 0.30,
}
def per_provider_daily(total_volume, list_distribution):
"""Split daily volume across providers, respecting caps."""
result = {}
for provider, list_share in list_distribution.items():
cap = PROVIDER_CAPS.get(provider, PROVIDER_CAPS['other'])
proportional = total_volume * list_share
capped = min(proportional, total_volume * cap)
result[provider] = int(capped)
return resultCombine both: compute daily total via warmup_schedule(), then split via per_provider_daily().
Adjustments when KPIs demand
The schedule is a plan, not a contract. Metrics may say slow down. Rules:
Hold at current volume if
- Bounce rate exceeds 2 percent for 3 consecutive days.
- Complaint rate exceeds 0.1 percent for 3 consecutive days.
- Postmaster Tools domain reputation drops from High to Medium (or worse).
- Delivery rate at any major provider drops below 95 percent.
Rewind to previous day’s volume if
- Bounce rate exceeds 5 percent on any single day.
- Complaint rate exceeds 0.3 percent on any single day.
- Postmaster Tools domain reputation drops to Low.
- SNDS turns Yellow or Red.
Pause entirely if
- You are blocklisted on Spamhaus, Barracuda, or another major DNSBL.
- Postmaster Tools shows Bad.
- Any single provider blocks 100 percent of your mail.
After a hold or rewind, resume the ramp only after metrics stabilize for 3+ days. Do not “make up” for lost days by accelerating; that repeats the same mistake.
10 common warmup calculator mistakes
- Ignoring provider caps. Sending 60 percent of day-1 volume to Microsoft violates their tolerance regardless of your total daily number.
- Using one growth rate throughout. Fast growth early (when volumes are small) is safer than fast growth later. Consider tapering the rate as volumes rise.
- Not adjusting for segment quality. Same volume to an engaged segment is safer than to a broad segment. The calculator gives volume; discipline about segments is separate.
- Applying calendar days instead of send days. If you send Monday-Friday only, weekends do not count; use 5-day-week schedules or explicitly compute over calendar time.
- Not accounting for weekly volume variance. Many senders naturally have higher weekday volumes. Design the ramp with weekly rhythm in mind, not just monotonic growth.
- Ignoring KPI triggers. The calculator says day-11 sends 1,444; metrics say something is wrong. Trust the metrics.
- Not planning post-target sustain period. Reaching target on day 24 does not mean warmup is done. Plan another 2 weeks at target with tight monitoring before declaring done.
- Rushing large-target ramps. Trying to reach 1M/day in 30 days almost always fails. Give large targets 45-90 day ramps.
- Not documenting the schedule used. If reputation crashes 6 months later, knowing what warmup you ran is diagnostic. Save the schedule alongside the campaign log.
- Assuming the same schedule works for every IP. Different IPs, different receivers, different lists. Every warmup gets its own schedule (which may be identical or may differ).
Warmup calculator FAQ
What starting volume is safe for a cold IP?
Between 50 and 100 messages for a truly cold dedicated IP. Lower if the IP has a poor /24 block reputation (check pre-ramp via Spamhaus and Sender Score). If you are adding domain traffic to an existing warm shared pool, starting volume can be higher (500-1,000) because the IP already has reputation. Do not start at 0; a single-message “test” from a cold IP tells receivers nothing useful and does not build reputation.
Can I use a spreadsheet for the warmup schedule?
Yes, and many senders do. In Google Sheets or Excel: column A is day number, column B is =$initial*$growth_rate^(A2-1), column C is =MIN($target,B2). Add columns for segment, provider split, and KPI notes. A spreadsheet is fine for one-off ramps; for repeated warmups (new products, new brands), a small Python script or dedicated tool is more maintainable.
What if I hit target volume before segment expansion is complete?
Extend the ramp. If your calculator says target is reached at day 20 but your segment plan requires 28 days of gradual expansion, delay reaching target to align with the segment plan. The segment discipline is the deliverability lever; hitting a volume number early does not mean the ramp is complete. Adjust growth rate downward so target aligns with segment expansion.
Should I use warmup services instead of building my own calculator?
Warmup services (Warmup Inbox, Mailwarm, and similar) simulate engagement by sending your test messages to networks of accounts that open and reply. Useful supplement in the first 1-2 weeks of warmup, especially for cold email senders without an engaged real list. They do not replace the volume ramp calculator; you still need a schedule for real recipient sends. See our best warmup tools review for a comparison of specific services.
How do I handle B2B warmup where volume is inherently smaller?
B2B senders often have small lists (5,000-50,000) and correspondingly small target volumes. The formula still applies with adjusted parameters: initial 20-50, growth 1.30, target matching your actual daily volume. Compress the ramp to 14-21 days. The bigger challenge in B2B is engagement: business recipients open less consistently than consumer recipients, so the reputation signals are less rich. Compensate by ensuring your list is opt-in and recent (imports older than 90 days should be re-verified before warmup).
What growth rate should I use if I have no data?
Start with 1.30 (30 percent) as the safe default. Monitor first-week KPIs. If bounce and complaint rates are well below thresholds and engagement is strong, increase to 1.40 for the second week. If any metric is trending toward threshold, hold at 1.30. Do not start above 1.40 without prior data justifying it. First warmups almost always go smoother at 1.30 than at 1.50.
Final words
The warmup calculator is a specific tool for a specific problem: convert a target volume and growth intention into daily numbers. The math is trivial; the discipline is knowing when to trust the numbers and when to trust the metrics. Every serious sender ends up with a written warmup schedule, whether generated by a spreadsheet, a Python script, an ESP’s tool, or a paid warmup service. The medium does not matter; the schedule does.
The mental model to keep: the calculator is a floor, not a ceiling. If your metrics look great and you are hitting all your KPIs, following the calculator conservatively is fine. If your metrics wobble, cutting the calculator’s numbers is safer than not cutting them.
For the final article in this series: cold IP recovery covers the case where reputation crashed and you need to rebuild from a crisis rather than warm from scratch.
For related content, see the 30/60/90 day IP warmup schedule, domain vs IP reputation, the best warmup tools review, Sender Score, Google Postmaster Tools, the Google and Yahoo bulk sender rules, and the Deliverability hub.
Every warmup starts with a clean list.
SMTPing catches invalid addresses, disposables, catch-all traps, role accounts and dead mailboxes before the calculator’s day 1. Bounce rates below the calculator’s threshold keep the ramp on schedule. 13 validation types, 25 free daily.
About the Author

Alaa · LinkedIn
Email infrastructure specialist with 8+ years of hands-on experience in SMTP, deliverability, and email verification. I’ve configured and troubleshot mail systems across Postfix, Exchange, and cloud relays, managed IP reputation and warmup campaigns, and built verification pipelines processing millions of addresses. My work spans DNS authentication (SPF, DKIM, DMARC, BIMI), bounce handling, blocklist monitoring, and compliance frameworks including CAN-SPAM and GDPR. I write every article on SMTPedia to give email professionals, developers, and marketers the accurate, RFC-grounded reference they need.
About SMTPedia
SMTPedia is an independent email industry reference covering SMTP, IMAP, POP3, email deliverability, marketing platforms, DNS authentication, and email verification. Every article is researched from official provider documentation, IETF RFCs, and industry best practices. Settings and configurations are verified quarterly.
We are cited as a source by ChatGPT, Microsoft Copilot, and thousands of email professionals worldwide. Learn more about our editorial process.

