7 priority queues, parallel batch processing, ClickHouse analytics. Punchmail's architecture is designed for serious sending volume.
Punchmail isn't a hobby project with a queue bolted on. It's a multi-layered sending engine designed from day one to handle millions of emails without breaking a sweat.
7 priority queues — tracking, sending, campaigns, automations, bounces, imports, default. Each with dedicated workers via Laravel Horizon.
Campaigns split into 500-subscriber batches. Multiple workers process batches simultaneously. Template compiled once, cached in Redis, reused across all batches.
Every open, click, bounce, and unsubscribe stored in ClickHouse with 6 materialized views for instant aggregation. No more slow MySQL GROUP BY on millions of rows.
Redis SETNX locks → MySQL unique index with INSERT IGNORE → job idempotency. Three layers guarantee zero duplicate sends, even during crashes and restarts.
Enterprise email marketing features without the enterprise price tag. Built by someone who's been sending email since before Gmail existed.
Drag-and-drop email builder with 10 block types. Compiles to bulletproof HTML via MJML. Looks perfect in every client — yes, even Outlook.
Nested AND/OR conditions across subscriber fields, tags, engagement history, and campaign activity. "Opened campaign X but didn't click in 90 days" — milliseconds.
Trigger-based workflows with conditions, delays, and actions. Welcome series, re-engagement, cart abandonment. Set it and forget it.
Connect any SMTP provider. Create pools with weighted distribution for IP warmup. Automatic failover. Per-campaign throttling. This is what enterprise ESPs charge thousands for.
Event tracking powered by ClickHouse. Millions of events, instant queries. Full per-campaign reports and per-subscriber activity timeline.
Test subject lines and content with 2-3 variants. Auto-send the winner based on opens or clicks. Data-driven sending.
IMAP/POP3 mailbox polling plus webhook receivers for SES, Postmark, and SendGrid. Automatic hard/soft classification with configurable thresholds.
Multiple suppression lists with email AND domain blocking. Platform-wide suppression for spamtraps and global unsubscribes. Three-layer dedup prevents duplicate sends.
RFC 8058 one-click unsubscribe (Gmail/Yahoo required), in-body unsubscribe, and full preference center. List-Unsubscribe headers automatic on every send.
Most self-hosted email tools were designed for small lists. They work fine at 5,000 subscribers, start struggling at 50,000, and fall apart at 500,000. The problem is usually the same: single-threaded sending, MySQL-based analytics, and no queue architecture. When your campaign has 200,000 recipients, these tools queue up every email in a single line and process them one by one.
Punchmail's sending engine uses a multi-queue architecture with 7 priority queues: tracking, sending, campaigns, automations, bounces, imports, and default. Each queue has dedicated workers managed by Laravel Horizon. Campaign sends are split into 500-subscriber batches that multiple workers process simultaneously. Templates are compiled once, cached in Redis, and reused across all batches.
Analytics at scale is where most tools truly break. Querying "show me the open rate for this campaign" with 500,000 recipients in MySQL means a GROUP BY on millions of rows — queries that take minutes or time out entirely. Punchmail stores all tracking events in ClickHouse with 6 materialized views for instant aggregation. The same query returns in under a millisecond.
Three layers of deduplication prevent double-sends even during crashes: Redis SETNX locks for speed, MySQL unique indexes with INSERT IGNORE for durability, and job idempotency for safety. You can restart workers mid-campaign and not send a single duplicate. This isn't academic — it's critical when you're sending at volume.
Multi-queue parallel processing with 500-subscriber batches. Scales linearly by adding worker containers.
ClickHouse with 6 materialized views. Query millions of events instantly. No more slow MySQL dashboards.
Three-layer deduplication: Redis locks, MySQL unique indexes, job idempotency. Safe even during crashes and restarts.
Add more worker containers to increase throughput. No code changes, no configuration — just more processing power.
We're not competing with Mailchimp's marketing budget. We're competing with their feature set.
| Punchmail | Mailchimp | Mautic | Listmonk | |
|---|---|---|---|---|
| Multi-queue architecture | ✓ | ✗ | ✗ | ✗ |
| Parallel batch processing | ✓ | ✓ | ✗ | ✓ |
| ClickHouse analytics | ✓ | ✗ | ✗ | ✗ |
| Horizontal scaling | ✓ | ✓ | ✗ | Basic |
| Dedup protection | ✓ | ✓ | Basic | Basic |
| SMTP pools + warmup | ✓ | ✗ | ✗ | ✗ |
| Per-campaign throttling | ✓ | ✗ | ✗ | ✗ |
| Redis caching layer | ✓ | ✓ | ✗ | ✗ |
| Self-hosted | ✓ | ✗ | ✓ | ✓ |
| 100K+ emails/hour | ✓ | ✓ | ✗ | ✓ |
No PhD required. If you can copy-paste three commands, you can run Punchmail.
Clone the repo, copy the environment file, set your admin credentials.
git clone https://github.com/punchmail/punchmail && cp .env.example .env
One command spins up all 7 containers — app, database, analytics, queue, cache, email renderer. Done.
docker compose up -d
Add your SMTP provider in settings — Amazon SES, Postmark, your own Postfix, whatever. Create pools, set weights, configure failover.
Import subscribers, build your first campaign with the block editor, hit send. Welcome to email freedom.
No subscriber tiers. No send limits. No "contact sales." Just a price that makes sense.
🚀 Launch price for the first 100 customers. Then €99.
I've built email infrastructure for companies sending millions of emails daily. Punchmail's architecture — multi-queue, parallel batches, ClickHouse, triple dedup — is what I'd design if I were building from scratch. Because I did.
Your subscribers. Your data. Your server. One price, forever.