If you send bulk email with PowerMTA, bounces are part of daily life. The difference between a healthy sender and a ruined IP reputation often comes down to how well you handle them. This PowerMTA bounce processing setup guide walks you through the complete workflow: understanding hard and soft bounces, reading PowerMTA accounting files, configuring bounce domains, using VERP for per-recipient tracking, setting up feedback loops, and building a suppression workflow that protects your sender reputation.
What Is Bounce Processing and Why It Matters
Bounce processing is the system that catches, classifies, and acts on delivery failure notifications (DSNs). When a message cannot be delivered, the receiving server returns a bounce message — either synchronously during the SMTP session or asynchronously as a new email to the envelope sender address. Without automated bounce processing, your mail queue fills up with dead addresses, your retry schedules waste bandwidth on undeliverable recipients, and mailbox providers flag you as a sloppy sender.
For email marketers and bulk senders, bounce processing does three jobs: it keeps your lists clean, it stops you from repeatedly mailing dead addresses (protecting your IP reputation), and it gives you diagnostics — knowing why messages bounce tells you whether the problem is your list, your content, or your infrastructure.
Hard Bounces vs Soft Bounces
Not all bounces are equal, and treating them the same is a classic mistake.
Hard Bounces (Permanent Failures)
A hard bounce means the message will never be delivered to this address. Common causes include:
- Non-existent mailbox (550 5.1.1 “user unknown” or “mailbox unavailable”)
- Invalid domain name
- Blocked sender or policy rejection (some appear permanent, e.g., spam blocklist listings)
Hard bounces must be suppressed immediately. Continuing to mail hard-bouncing addresses is one of the fastest ways to damage your domain reputation — ISPs treat it as a clear signal of poor list hygiene.
Soft Bounces (Temporary Failures)
A soft bounce is a temporary delivery failure. The address is valid, but the message cannot be delivered right now:
- Mailbox full (552 5.2.2)
- Server temporarily unavailable or greylisting (421, 451)
- Message too large
- Content-based temporary deferral
Soft bounces should be retried according to PowerMTA's retry schedule (defined per-domain with max-smtp-out and retry intervals), but if the same address soft-bounces repeatedly over weeks, it should eventually be suppressed too.
PowerMTA Bounce Processing: Accounting Files
PowerMTA's primary bounce data source is its accounting files — CSV files written in real time as delivery events happen. These files are the raw material of any serious bounce-processing pipeline.
Configure accounting in your pmta.conf:
<domain *>
acct-file /var/log/pmta/acct.csv
</domain>
Each record in the acct file is a delivery event with fields including: event type (d = delivered, b = bounced, t = transient failure), time of the event, job ID, recipient address, DSN code, bounce category, and the SMTP response text from the remote server. The b records with their DSN codes are exactly what your bounce parser needs.
Best practice: rotate acct files frequently (daily or hourly) so your parser always works on fresh data, and never delete them before parsing — they're your only ground truth for what happened in delivery.
Configuring Bounce Domains in PowerMTA
Asynchronous bounces return as email to the envelope sender (return-path). Use a dedicated bounce subdomain such as bounces.yourdomain.com so these messages don't mix with your sending domain's traffic. Then either:
- Pipe bounces into a parser: use a mail filter or a dedicated MTA (like Postfix with a pipe transport) to feed bounce messages into your parsing script.
- Process them from acct files only: many senders skip physical bounce mailboxes entirely and rely on acct-file parsing, since PowerMTA logs everything at delivery time.
Using VERP for Per-Recipient Bounce Tracking
VERP (Variable Envelope Return Path) encodes the recipient address into the envelope sender, e.g. [email protected]. When a bounce comes back to that unique address, you instantly know which recipient bounced — no message-body parsing required. Most high-volume senders generate VERP-style return paths in their application layer when injecting messages via the SMTP MAIL FROM command, giving deterministic bounce attribution even when DSN bodies are mangled by intermediate servers.
Setting Up Feedback Loops (FBLs)
Feedback loops are the complaint-side cousin of bounces: mailbox providers forward spam complaints to you so you can unsubscribe the complainer. Register for FBLs at the major providers (Yahoo CCF, Gmail via Postmaster Tools, Microsoft JMRP), point the report address to a mailbox your parser monitors, and treat every complaint like a hard bounce: suppress the address immediately and permanently.
PowerMTA Bounce Processing Best Practices
Suppress Hard Bounces Immediately
The golden rule: the first hard bounce retires the address. Build your parser so that any permanent 5.x.x DSN writes the address to a global suppression list, and check that list before every send. One hard bounce is information; the second one is negligence.
Maintain List Hygiene Continuously
Bounce processing is not a one-time cleanup — it's a standing process. Run a scheduled job that parses new acct files, classifies bounces, and updates suppression lists; expire addresses with repeated soft bounces after a threshold (e.g., 10 failures or 30 days); sunset inactive subscribers before they generate bounces from abandoned mailboxes; and validate new signups with double opt-in plus real-time mailbox verification to keep hard bounces near zero from day one.
Scaling Bounce Handling with a Reliable VPS
As your volume grows, bounce processing moves from a cron script to a dedicated pipeline — parsers running 24/7, suppression databases, and dashboards tracking bounce rates per domain and IP. That workload needs a VPS with consistent performance and a clean IP reputation, since everything downstream depends on it. Budget providers with a track record for email senders, such as Contabo or RackNerd, are popular choices in the bulk-sending community for exactly this reason.
Tools and Scripts for Parsing Bounces
You don't need expensive software for PowerMTA bounce processing. Practical options:
- Custom acct-file parsers: a Python or PHP script that tails the acct CSV, filters
bandtrecords, classifies them by DSN code, and pushes results into MySQL/Redis. This is the most common setup at scale because it catches synchronous bounces that never generate return mail. - Bounce-message parsers: libraries that parse RFC 3464 DSN reports into bounce categories — useful when you maintain a bounce mailbox.
- PowerMTA console and web monitor: the
pmta show bouncescommand and the web management interface give quick per-domain bounce summaries for ad-hoc diagnosis.
Key Takeaways
- PowerMTA bounce processing starts with accounting files: the
brecords in your acct CSV are the ground truth for every delivery failure. - Retry soft bounces on a schedule, but expire addresses that fail persistently.
- Use VERP-style return paths so every bounce maps unambiguously to one recipient.
- Register for feedback loops and treat spam complaints like hard bounces.
- Automate parsing on a schedule and keep suppression lists checked before every send.
- Suppress hard bounces on first occurrence — repeated mailing to dead addresses destroys your sender reputation.
Related Guides
- How to Install PowerMTA on Ubuntu 24 — get PowerMTA running from scratch before you configure bounce handling.
- Best VPS Providers with Open Port 25 — choose a mail-friendly VPS for your PowerMTA bounce processing pipeline.