← Back to all products

Warmup Scheduler

$29

Schedule email warmup campaigns with gradual volume increase to protect sender reputation.

📁 10 files
JSONMarkdownPython

📄 Product Preview

Try the interactive reader and demo tools below, or get the full product with all content unlocked.

📖 Interactive Reader (Free Preview) ⚙ Try Demo Tools 📦 Download Free Sample

📁 File Structure 10 files

warmup-scheduler/ ├── LICENSE ├── README.md ├── examples/ │ └── sample_warmup_state.json ├── free-sample.zip ├── guide/ │ ├── 01_features.md │ ├── 02_quick-start.md │ ├── 03_configuration.md │ └── 04_faq.md ├── index.html └── src/ └── warmup_scheduler.py

📖 Documentation Preview README excerpt

Warmup Scheduler

Schedule and manage email warmup campaigns with gradual volume increase. Protect your sender reputation from day one on new domains or IP addresses.

Features

  • Exponential ramp schedule — Follows ESP-recommended volume curves (5 to 10,000 emails over 29 days)
  • Send window distribution — Spreads sends across business hours to look natural to spam filters
  • Health monitoring — Auto-pauses campaigns when bounce rate > 5% or complaint rate > 0.1%
  • Campaign state persistence — Saves progress to JSON so you can stop and resume anytime
  • Batch calculation — Tells you exactly how many emails to send next and when
  • History tracking — Full audit log of every batch, pause, and resume event
  • Multiple commands — init, status, next-batch, record, resume, history, schedule

Requirements

  • Python 3.10+
  • No external dependencies (stdlib only)

Quick Start


# Initialize a new warmup campaign
python src/warmup_scheduler.py init --domain acme-corp.example.com --target 1000

# Check campaign status
python src/warmup_scheduler.py status

# Get the next batch to send
python src/warmup_scheduler.py next-batch

# Record results after sending
python src/warmup_scheduler.py record --sent 20 --bounced 0 --complaints 0

# View full campaign history
python src/warmup_scheduler.py history

# View the complete ramp schedule
python src/warmup_scheduler.py schedule

How It Works

1. Init: Creates a campaign state file with your target volume and domain. Sets day 1 of the ramp.

2. Ramp Schedule: Each day allows more emails. The default curve ramps from 5 (day 1) to 10,000 (day 29). You can customize this via the config.

3. Send Windows: Emails are distributed across 4 time windows (9am, 11am, 2pm, 4pm) to avoid triggering volume-based spam filters.

4. Health Checks: After each batch, the tool checks bounce and complaint rates. If either exceeds the threshold, the campaign auto-pauses and logs the reason.

5. Resume: After fixing deliverability issues, resume the campaign. It picks up where you left off.

Configuration

Key constants in warmup_scheduler.py:

ConstantDefaultDescription
DEFAULT_RAMP_SCHEDULE29-day curveList of max emails per day (index = day - 1)

... continues with setup instructions, usage examples, and more.

📄 Code Sample .py preview

src/warmup_scheduler.py #!/usr/bin/env python3 """ Warmup Scheduler — Email Arsenal (DataNest) Schedules and manages email warmup campaigns with gradual volume increase. Protects your sender reputation by slowly ramping up send volume on new domains or IP addresses. Usage: python warmup_scheduler.py init --domain acme-corp.example.com --target 1000 python warmup_scheduler.py status python warmup_scheduler.py next-batch python warmup_scheduler.py history Dependencies: Python 3.10+ stdlib only License: MIT """ from __future__ import annotations import argparse import json import logging import math import sys from dataclasses import asdict, dataclass, field from datetime import datetime, timedelta, timezone from enum import Enum from pathlib import Path from typing import Any # --------------------------------------------------------------------------- # Constants # --------------------------------------------------------------------------- # Default warmup schedule: maps day number to max emails per day. # Follows an exponential ramp-up pattern that most ESPs recommend. DEFAULT_RAMP_SCHEDULE: list[int] = [ 5, 10, 20, 35, 50, 75, 100, 150, 200, 300, # Days 1-10 400, 500, 650, 800, 1000, 1200, 1500, 1800, # Days 11-18 2000, 2500, 3000, 3500, 4000, 5000, 6000, 7000, # Days 19-26 8000, 9000, 10000, # Days 27-29 ] # Warmup state file location STATE_FILE = Path("warmup_state.json") # Sending windows — when during the day to send emails for best engagement. # Spread across business hours to look natural to spam filters. SEND_WINDOWS = [ # ... 495 more lines ...
Buy Now — $29 Back to Products