01What you are actually warming
The phrase is inherited from a time when reputation lived almost entirely on IP addresses, and it has stuck around past its accuracy. What you are building is a history: a record, held separately by every receiving provider, of mail sent from your domain that the people receiving it visibly wanted. Volume is the axis you control. Wanted is the thing being measured.
You are not warming an IP so much as building a per-receiver history of mail people visibly wanted, at a volume that does not look like an incident.
- Attaches to an address that can be rented for an afternoon
- Shed by moving hosts — which is exactly why receivers weigh it less
- Attaches to the name in your From header and to the DKIM d= domain
- Follows you across transports and cannot be shed — the permanence is the point
- Two years of clean sending behind a domain cannot be rented
The failure mode has a specific shape. A brand-new domain that sends nothing, nothing, nothing, and then 80,000 messages on a Tuesday has produced the exact signature of a compromised account or a throwaway spam domain, because that is the signature those things have. No receiver can tell the difference from the outside, and none will give you the benefit of the doubt to find out.
| What people assume | What actually happens |
|---|---|
| Growth is the thing being measured | Consistency matters as much: 5,000 a day for six days and then nothing for four is worse than a flat 3,000 every day, because the pattern itself is what is being read. |
| Any volume warms a domain | You cannot warm with mail nobody wants. Ten thousand a day to a purchased list does not build a reputation, it builds a bad one faster than sending nothing would have. |
02A schedule you can adjust
A ramp is one number and one rule: start small enough that nobody notices you, and multiply by somewhere under two each day you get away with it. Enter your day-one volume and where you are trying to get to; every row renders, because a plan that hides days behind a control is a plan you cannot check against what actually happened.
One number and one rule — a day-one volume small enough to go unnoticed, multiplied by something under two on every day you get away with it.
A schedule, not a guarantee. Receivers decide the real pace, and the two signals under the table are what tell you to hold.
| Day | Send | Who |
|---|---|---|
| 1 | 200 | Opened in the last 30 days |
| 2 | 360 | Opened in the last 30 days |
| 3 | 648 | Opened in the last 30 days |
| 4 | 1,166 | Opened in the last 90 days |
| 5 | 2,099 | Opened in the last 90 days |
| 6 | 3,778 | Opened in the last 90 days |
| 7 | 6,800 | Opened in the last 90 days |
| 8 | 12,240 | Opened in the last 90 days |
| 9 | 22,032 | Opened in the last 180 days |
| 10 | 39,658 | Opened in the last 180 days |
| 11 | 71,384 | Opened in the last 180 days |
| 12 | 100,000 | Opened in the last 180 days |
Hold at the current rung — do not climb — if deferrals rise, if the unknown-user rate moves, or if the complaint rate moves at all. Warming faster than receivers will accept does not compress the timeline; it restarts it.
| Reading the plan | Why |
|---|---|
| The volumes are per receiving provider, in spirit | A receiver forms an opinion of you from the mail it sees, so 20,000 messages split across five providers is four thousand-ish opinions each, not one impression of 20,000. Most consumer lists are dominated by two or three providers, so the total is a reasonable proxy; if yours is concentrated at one provider, treat the ramp as applying to that provider and be more patient. |
| Send at the same time each day, every day | Including the days where the number feels too small to bother with. The gap is the signal you are trying not to send. |
| Transactional mail is on the ramp too | If it shares the domain it counts toward the volume the receiver observes, whether or not you counted it in your plan. |
| Four to six weeks to steady six-figure monthly volume | With engaged recipients. If the planner’s arithmetic says you cannot reach your target inside thirty days, that is real information — start higher only if you genuinely have enough recently-engaged recipients to justify it, or accept the longer ramp. |
03Send to your best segment first
The order of the ramp is not a detail. Volume is what you are asking for; engagement is what pays for it. Every open, click and reply on day three is evidence a receiver uses when deciding what to do with day four, so the sequence to send in is strictly descending by likelihood of a positive reaction.
Order the ramp strictly descending by likelihood of a positive reaction — your best segment buys the volume the next one gets to use.
| When | Who | Why them |
|---|---|---|
| Days 1–3 | Opened in the last 30 days | Your best possible audience. These are the people who will open within an hour, which is the fastest positive signal available to you. |
| Days 4–8 | Opened in the last 90 days | Still clearly engaged, and now large enough to carry a meaningful volume step. |
| Days 9–15 | Opened in the last 180 days | Weaker but real. By now you have a short history at each receiver to spend. |
| Day 16 onward | Everyone still engaged | Never dormant. A subscriber who has not opened in a year does not become worth mailing because you have a schedule to fill. |
These tiers are expressible directly as segments, so the ramp does not have to be run by hand from exported CSVs:
opened_last_30d and not unsubscribed ← days 1–3 opened_last_90d and not unsubscribed ← days 4–8 opened_last_180d and not unsubscribed ← days 9–15 not never_opened and bounce_count = 0 ← the standing ceiling
- On a mixed list, order by recency of signup regardless of open history
- Recency of consent predicts a positive reaction better than almost anything else
- A subscriber from last week remembers asking
- Free-tier signups from three years ago who have never opened anything
- They belong at the end of the ramp — or, more honestly, not on it at all
04How the send path learns an unpublished quota
Every receiver enforces a limit on how much they will take from you, per hour, per connection, per domain. None of them publish it. It moves with your reputation, with their load, and with the time of day. This is the part of warming that people try to solve with a spreadsheet of guessed numbers, and it is the part the send path solves for you by not guessing at all.
The send path never learns the receiver’s number — it halves its own ceiling the moment it is rejected and doubles it after a day it did not need, which converges on the invisible limit from below.
| Day | Ceiling in force | What happened | What the rule did |
|---|---|---|---|
| Day 1 | none stored — 5,000 default | 4,100 sent, no rejection | Nothing is learned. The ceiling is still unstored, so the rollover does not grow it. |
| Day 2 | none stored — 5,000 default | provider rejects on quota after 3,000 | ceiling = max(100, floor(3,000 × 0.5)) = 1,500, written; the provider is held for 5 minutes. |
| Day 3 | 1,500 | 1,200 sent — under 90% (1,350) | A clean day under the threshold, so tomorrow’s rollover doubles it. |
| Day 4 | 3,000 | 2,900 sent — over 90% (2,700) | You used the headroom, so no growth. The ceiling stays where it is. |
| Day 5 | 3,000 | 2,000 sent — under 90% | Under the threshold again, so the rollover doubles. |
| Day 6 | 6,000 | — | Two rejections away from the real number, without ever being told it. |
A worked run of the rule the sending-domain actor actually applies. Growth happens once, at the day rollover, and never above 5,000,000.
Why that converges. The doubling walks upward until it crosses the invisible ceiling, the crossing produces exactly one rejection, the halving puts you back underneath it, and the next doubling brings you back to the boundary. The rate oscillates in a narrowing band around a number nobody ever told you — the same shape as TCP’s congestion control, for the same reason: the capacity is unknown, unstable, and only observable by occasionally exceeding it.
The asymmetry is the important part. Halving is instant and doubling is capped, so an overshoot costs one rejection and a quick recovery while over-aggression compounds. This is also the same curve the planner above draws, which is not a coincidence: a schedule that grows by a factor under two per clean day is the human-readable form of the rule the rate limiter already follows. The learned ceiling is persisted per domain, so an interrupted ramp resumes from what was learned rather than from the beginning.
05The signals that mean stop climbing
Three signals mean stop climbing. Not stop sending — hold at the current rung, send the same volume tomorrow, and only resume growing once the signal has gone. Any one of them alone is enough.
Any one of these on its own means hold at the current rung — not stop sending, and not push through to the number the schedule promised.
| Signal | What it is | What to do |
|---|---|---|
| Deferrals rising | A 4.x.x response is “not now, try later”, and one or two is background noise. A rate that climbs as your volume climbs is the receiver saying the ramp is ahead of what it will accept. | Hold at the current rung. The send path is already backing off; do not add volume on top of that backoff because the schedule said today was a bigger day. |
| Unknown-user rate moving | Hard bounces for addresses that do not exist — the hard_invalid and hard_domain classes, from enhanced codes 5.1.1, 5.1.3, 5.1.6 and 5.1.2. | You have reached a tier of the list that has decayed. Stop, clean that tier, resume. Mailing it tells every receiver you do not know who your subscribers are. |
| Complaint rate moving at all | Not exceeding a threshold — moving. You are sending to your most engaged people, so it should be near zero. | Hold. The published ceiling of 0.3% is where you are already in trouble; the number that should stop you is any visible change from your baseline. |
| Open rate falling, delivery flat | Harder to see, and the signature of spam-folder placement: an accepted message counts as delivered regardless of the folder it landed in. | Treat it as directional only, then confirm in placement terms — opens are classified into five audience classes and only human opens count. |
The first three are the stop-climbing signals. The fourth is slower to see and is evidence rather than a verdict.
Read a falling open rate carefully. In production today the classifier receives only the user agent, IP, method and country, so the timing- and ASN-based rules do not fire. Treat the percentage as directional evidence, then confirm it in placement terms rather than acting on it alone. On the deferral side, a soft throttle suppresses the address for one day, so the system’s own recovery window is already a day long.
What just happened
You have a ramp ordered by engagement rather than by convenience, and a reason to trust it: the send path is running the same shape underneath — halve on rejection, at most double after a clean day — so the plan and the software are not two unrelated pieces of advice. The thing most likely to bite you is treating the schedule as a commitment. It is a ceiling you may not reach, and the correct response to a deferral is to hold at the current rung, not to push through it and try again tomorrow from where you meant to be.