High Performance

Built to send
millions per day

7 priority queues, parallel batch processing, ClickHouse analytics. Punchmail's architecture is designed for serious sending volume.

terminal
$ git clone https://github.com/punchmail/punchmail
$ cd punchmail && docker compose up -d
# That's it. You're sending.
✓ Punchmail is running at http://localhost

Built by an email deliverability expert with 27 years of experience

0
Monthly fees
Subscribers
Emails / month
1
Price. Forever.
https://your-server.com/dashboard
📊 Dashboard
👥 Subscribers
📋 Lists
📨 Campaigns
🎨 Templates
◇ Segments
⚡ Automations
⚙️ Settings

Dashboard

Subscribers
24,891
↑ 12.3%
Sent (30d)
148K
↑ 8.1%
Open Rate
42.3%
↑ 2.4%
Click Rate
8.7%
↑ 1.1%
Campaign
Status
Sent
Open Rate
Clicks
Black Friday Sale
Sent
24,891
42.3%
2,147
Weekly Newsletter #48
Sent
18,204
38.1%
1,432
Holiday Campaign
Scheduled

An engine built
for serious scale

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 with dedicated workers
500
Emails per batch, bulk-inserted in parallel
Dedup layers prevent duplicate sends
<1ms
ClickHouse query time on millions of events
🚀

Multi-Queue Architecture

7 priority queues — tracking, sending, campaigns, automations, bounces, imports, default. Each with dedicated workers via Laravel Horizon.

Parallel Batch Processing

Campaigns split into 500-subscriber batches. Multiple workers process batches simultaneously. Template compiled once, cached in Redis, reused across all batches.

📊

ClickHouse Analytics Engine

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.

🔒

Atomic Send Protection

Redis SETNX locks → MySQL unique index with INSERT IGNORE → job idempotency. Three layers guarantee zero duplicate sends, even during crashes and restarts.

Theoretical throughput
100K+ emails/hour
Scales linearly by adding worker containers

Everything you need. Nothing you don't.

Enterprise email marketing features without the enterprise price tag. Built by someone who's been sending email since before Gmail existed.

🎨

Block-Based Editor

Drag-and-drop email builder with 10 block types. Compiles to bulletproof HTML via MJML. Looks perfect in every client — yes, even Outlook.

🎯

Power Segmentation

Nested AND/OR conditions across subscriber fields, tags, engagement history, and campaign activity. "Opened campaign X but didn't click in 90 days" — milliseconds.

Automation Engine

Trigger-based workflows with conditions, delays, and actions. Welcome series, re-engagement, cart abandonment. Set it and forget it.

🔌

SMTP Pools

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.

📊

ClickHouse Analytics

Event tracking powered by ClickHouse. Millions of events, instant queries. Full per-campaign reports and per-subscriber activity timeline.

🧪

A/B Testing

Test subject lines and content with 2-3 variants. Auto-send the winner based on opens or clicks. Data-driven sending.

🛡️

Bounce Intelligence

IMAP/POP3 mailbox polling plus webhook receivers for SES, Postmark, and SendGrid. Automatic hard/soft classification with configurable thresholds.

🚫

Suppression System

Multiple suppression lists with email AND domain blocking. Platform-wide suppression for spamtraps and global unsubscribes. Three-layer dedup prevents duplicate sends.

📬

Full Compliance

RFC 8058 one-click unsubscribe (Gmail/Yahoo required), in-body unsubscribe, and full preference center. List-Unsubscribe headers automatic on every send.

Most email tools break at scale.
Punchmail was built for it.

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.

🚀

100K+ Emails/Hour

Multi-queue parallel processing with 500-subscriber batches. Scales linearly by adding worker containers.

📊

Sub-Millisecond Analytics

ClickHouse with 6 materialized views. Query millions of events instantly. No more slow MySQL dashboards.

🛡️

Zero Duplicate Sends

Three-layer deduplication: Redis locks, MySQL unique indexes, job idempotency. Safe even during crashes and restarts.

⚙️

Horizontal Scaling

Add more worker containers to increase throughput. No code changes, no configuration — just more processing power.

How Punchmail stacks up

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

Frequently Asked Questions

What hardware do I need to send 100K+ emails per hour?

+
A server with 4+ CPU cores, 8GB+ RAM, and SSD storage handles 100K/hour comfortably. ClickHouse needs its own resources for analytics. For higher volumes, add worker containers on additional servers. The architecture scales horizontally without code changes.

How does Punchmail prevent duplicate sends during failures?

+
Three layers: Redis SETNX locks prevent the same email from being picked up by two workers simultaneously. MySQL unique indexes with INSERT IGNORE catch any that slip through. Job idempotency ensures reprocessed jobs don't resend. Even a server crash mid-campaign won't cause duplicates.

Can I throttle sends per SMTP provider?

+
Yes. Punchmail supports per-campaign throttling and per-SMTP-provider rate limits. If your SES account allows 50 emails/second, Punchmail respects that limit while distributing sends across your other providers via weighted SMTP pools.

How does ClickHouse compare to MySQL for email analytics?

+
ClickHouse is a columnar database designed for analytical queries. A query like "count opens grouped by hour for the last 30 days" that takes 45 seconds in MySQL returns in under 1ms in ClickHouse. At scale, this is the difference between a usable dashboard and a timeout error.

Can I add more workers without downtime?

+
Yes. Spin up additional worker containers and they automatically start processing jobs from the queues. No restart required for existing containers. This is the advantage of queue-based architecture — scaling is just adding more consumers.

Up and running in 60 seconds

No PhD required. If you can copy-paste three commands, you can run Punchmail.

1

Clone & configure

Clone the repo, copy the environment file, set your admin credentials.

git clone https://github.com/punchmail/punchmail && cp .env.example .env
2

Launch

One command spins up all 7 containers — app, database, analytics, queue, cache, email renderer. Done.

docker compose up -d
3

Connect your SMTP

Add your SMTP provider in settings — Amazon SES, Postmark, your own Postfix, whatever. Create pools, set weights, configure failover.

4

Start sending

Import subscribers, build your first campaign with the block editor, hit send. Welcome to email freedom.

One price. No limits. Forever.

No subscriber tiers. No send limits. No "contact sales." Just a price that makes sense.

Lifetime License
€199
49
One-time payment. Not per month. Not per year. Once.

🚀 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.

Bram, Creator of Punchmail & email deliverability veteran

Stop renting.
Start owning.

Your subscribers. Your data. Your server. One price, forever.

Get Punchmail → See How It Works