PowerMTA monitoring dashboard showing queue and per-domain delivery stats
Home Blog PowerMTA Monitoring

PowerMTA Monitoring: The Production Playbook I Use to Catch Problems Before ISPs Do

The exact commands, accounting-log fields, and threshold numbers I watch every day — so a throttle at 9am never becomes a blacklisting by lunch.

Akshay Bangar
Written By
Akshay Bangar
Backend Engineer & Email Infrastructure Specialist

I run high-volume PowerMTA infrastructure in production. Everything below is how I actually watch a live server day to day — the commands, the log fields, and the numbers that tell me a problem is coming.

Here is the uncomfortable truth about running PowerMTA: by the time your open rates drop, the damage is already three days old. Reputation problems don't announce themselves — they show up first as a quiet trickle of 4.x deferrals to one mailbox provider, then as a rising deferred queue, and only much later as the thing everyone actually notices: mail landing in spam.

Monitoring is how you close that gap. This is the exact routine I run on production PowerMTA servers — the commands I type, the accounting-log fields I read, and the specific numbers that make me slow down or stop a stream. If you're setting PowerMTA up for the first time, read my PowerMTA configuration guide first; this article assumes it's already installed and sending.

The one idea to take away: your dashboard shows you what already happened. The queue and the accounting file show you what is happening right now. Real monitoring lives in those two places — everything else is a lagging indicator.

1. Why Monitoring PowerMTA Isn't Like Monitoring a Web Server

With a web server, "up" and "fast" is basically the whole story. With an MTA, the server can be perfectly healthy — CPU idle, process running, no errors in the log — while your delivery is quietly falling apart. The failure isn't on your box; it's in how the receiving side (Gmail, Yahoo, Microsoft) is reacting to your traffic.

That means the signals you care about are almost all per-receiving-domain and rate-based, not host-level. A single number like "messages sent" is useless. "Messages deferred by gmail.com in the last 15 minutes" is the number that saves you.

2. The Monitoring Commands I Actually Run

PowerMTA's command line gives you an instant, honest snapshot of the running engine. These five are muscle memory for me:

# Overall health — version, uptime, active connections, throughput
pmta show status

# What's in the queue right now: queued, deferred, and per-domain counts
pmta show queues

# The single most useful command — per-domain delivery stats,
# sorted so a throttling ISP floats to the top
pmta show topdomains --sort=connections

# Health of each Virtual MTA (i.e. each sending IP)
pmta show virtual-mta mta-marketing

# Live counters — messages/sec, connections, data rate
pmta show counters

The workflow is always the same: pmta show queues to see if something is backing up, then pmta show topdomains to see which ISP is causing it, then drill into that domain:

# Zoom into one receiving domain — every deferral reason shows up here
pmta show queue gmail.com

If the deferred count for one domain is climbing while everything else is flat, you've found your problem before it becomes a reputation event. That's the entire game.

Real-time web monitor: PowerMTA also ships with a built-in web console, usually exposed on port 8080. It renders the same queue and per-domain data as auto-refreshing graphs, which is handy during a live send. I keep it open on a second screen during big campaigns — but I still trust the CLI numbers first.

3. Reading the Accounting File (Where the Real Answers Live)

The queue commands tell you the now. The accounting file — usually /var/log/pmta/acct.csv — tells you the why, for every single message. This CSV is the most valuable monitoring asset PowerMTA gives you, and most people never open it.

Each row is a record with a type and a set of fields. The types you care about:

typeMeaningWhat it tells you
dDeliveryMessage accepted by the receiving server
bBouncePermanent failure (5.x) — recipient rejected
tTransient failureDeferral (4.x) — will retry; watch for clusters
rbReceived bounceAn async bounce (DSN) came back later

The fields I read on every investigation:

  • rcpt — the recipient (tells you which domain/ISP).
  • vmta — which Virtual MTA / IP sent it. Critical for isolating a reputation problem to one IP.
  • dsnStatus — the RFC 3463 status code, e.g. 5.1.1 (bad mailbox) or 4.2.2 (mailbox full). The first digit is everything: 5 = permanent, 4 = temporary.
  • dsnDiag — the raw text the receiving server returned. This is gold: it literally contains phrases like "rate limited", "blocked using Spamhaus", or "IP not in whitelist".
  • bounceCat — PowerMTA's own classification: bad-mailbox, inactive-mailbox, spam-related, policy-related, quota-issues, no-answer-from-host, and so on.

A one-liner I run constantly — count today's bounce categories to see the shape of my failures at a glance:

# Which bounce categories are hitting me most right now?
grep ',b,' /var/log/pmta/acct.csv | awk -F, '{print $NF}' | sort | uniq -c | sort -rn

If the top category is bad-mailbox or inactive-mailbox, that's a list hygiene problem. If it's spam-related or policy-related, that's a reputation problem — a completely different fire, and a much more urgent one.

4. The Six Numbers I Watch (and the Thresholds)

Monitoring without thresholds is just staring at logs. Here are the exact lines I hold, and what I do when one is crossed.

<2%Bounce rate (aim <1%)
<0.1%Spam complaint rate
95%+Delivery rate
MetricHealthyAct when…
Bounce rate< 1–2%Above 3% — pause and clean the list. ISPs read high bounces as spammer behaviour.
Complaint rate< 0.1%Above 0.3% — Gmail's hard line. Cut volume and audit content/consent immediately.
Deferral rate (per domain)Low & flatA sudden spike to one ISP = throttling. Lower that domain's rate.
Delivery rate> 95%Below 90% — something structural is wrong (auth, rDNS, or a block).
Connection successMostly 2xxRising 421/451 = rate limiting at the handshake. Back off connections.
Queue ageMinutesMessages aging into hours = delivery stalled somewhere; investigate the top deferred domain.

Notice that four of these six are things a server-health monitor (CPU, RAM, disk) will never show you. That's exactly why generic monitoring misses email problems until it's too late.

5. Deferrals vs. Bounces vs. Blocks — Reading the Difference

This is the skill that separates people who run PowerMTA from people who own a PowerMTA license. All three look like "not delivered," but they mean very different things:

  1. Bounce (5.x, type b): permanent. The address is bad, or the domain flat-out rejected you. Suppress the recipient and move on. High volume of these = dirty list.
  2. Deferral (4.x, type t): temporary. "Try again later." A few are normal. A cluster to one ISP within minutes is that ISP telling you to slow down — this is your earliest reputation warning.
  3. Block: a rejection whose dsnDiag text mentions a blocklist, "spam," or "policy." Whether it arrives as a 4.x or 5.x, treat it as a five-alarm fire: stop that vMTA and find the cause before sending another message from that IP.
A mistake that cost me an IP once: I saw deferrals to Yahoo climbing and assumed it was normal throttling, so I let it run. The dsnDiag text actually said "deferred due to user complaints." That wasn't throttling — it was Yahoo warning me. By the time I read the log properly, the IP was on a blocklist. Always read the diagnostic text, not just the status code. If you do get listed, here's my blacklist recovery guide.

6. My Monitoring Loop

Here's how the pieces feed each other. Monitoring isn't a screen you glance at — it's a control loop that decides how fast you're allowed to send.

flowchart TD PMTA{PowerMTA Engine} -->|writes| ACCT["acct.csv
every message logged"] PMTA -->|live| QUEUE["Queue & per-domain stats
pmta show topdomains"] ACCT --> METRICS["Metrics
bounce % · complaint % · deferral %"] QUEUE --> METRICS METRICS -->|within thresholds| SEND["Keep sending
at current rate"] METRICS -->|deferral spike to one ISP| THROTTLE["Lower that domain's
rate & connections"] METRICS -->|block / complaint spike| PAUSE["Pause the vMTA
investigate before resuming"] THROTTLE --> PMTA PAUSE --> PMTA SEND --> PMTA

7. Safe Config Changes: pmta reload vs pmta restart

When monitoring tells you to change something — lower a rate, pause a vMTA — you'll edit the config and apply it. How you apply it matters, because doing it wrong interrupts every in-flight message.

# Re-read the config and apply changes with NO downtime.
# PowerMTA validates first and REFUSES a broken config,
# so a typo can't take delivery down.
pmta reload

# Full stop/start. Interrupts delivery and clears in-memory
# state. I only use this for upgrades or a wedged process.
pmta restart

# Dump the effective, parsed configuration the server is
# actually running — my sanity check after any edit.
pmta show settings
"How do I run pmta check-config?" — People search for this expecting a Postfix-style validator, but PowerMTA doesn't have a separate check-config subcommand. The validation is the reload: if the file is broken, pmta reload rejects it and the previous config keeps running. To review what's actually loaded, use pmta show settings. Knowing this saves you from restarting the whole service just to test a change.

8. Watching Reputation From the Outside

PowerMTA sees your side of the conversation. To see what the ISPs think of you, you need external tools. I check these on a fixed schedule, not just when something feels wrong:

  • Google Postmaster Tools: the only place you see Gmail's view of your domain and IP reputation, spam rate, and authentication pass rates. If PowerMTA looks fine but Postmaster shows "Low/Bad" reputation, believe Postmaster.
  • Microsoft SNDS: the equivalent signal for Outlook/Hotmail — complaint rates and trap hits for your IPs.
  • MXToolbox blacklist monitor: daily checks across 100+ DNSBLs with email alerts. The moment an IP gets listed, I want to know within the hour, not next week.
  • Mail-Tester: a quick pre-flight spam-score and authentication check before any large send.

The rule I follow: internal metrics catch problems fast, external tools confirm the cause. A deferral spike in PowerMTA plus a reputation dip in Postmaster is a confirmed reputation event — not a coincidence.

9. Common PowerMTA Problems and What the Logs Told Me

Nearly every "PowerMTA isn't delivering" situation I've debugged traces back to one of these. The diagnosis always came from the accounting file, never from guessing:

SymptomWhat the log showedRoot cause & fix
Sudden deferrals to Gmail only4.7.x, "rate limited"Per-domain rate too high. Lower max-msg-rate / connections for gmail.com.
Everything to one ISP rejected5.7.1, "blocked using…"IP on a blocklist. Pause that vMTA, delist, investigate what triggered it.
Rejected at connection, before content"reverse DNS does not match"Missing/incorrect PTR record. Set rDNS for every sending IP.
Mail delivers but lands in spamDelivered (d), but low Postmaster reputationAuth or warm-up issue — check SPF/DKIM/DMARC alignment and slow down.
Queue growing, low throughputMany t records, rising queue ageConnections capped too low, or an ISP throttling. Read pmta show topdomains.
High bounce rate creeping upbounceCat = bad-mailboxStale list. Suppress hard bounces immediately and verify new imports.

10. PowerMTA's Limitations (Worth Knowing Before You Rely On It)

I use PowerMTA because it's excellent at what it does, but honest monitoring means knowing what it won't do for you:

  • It's a delivery engine, not an analytics suite. Native reporting is queue- and log-centric. Any real dashboard (trends, alerting) you build yourself on top of the accounting file.
  • It's commercial and licensed. That's a cost and a license to manage — unlike Postfix. (For a full comparison, see the table in my configuration guide.)
  • It won't fix bad inputs. Feed it a cold IP, a dirty list, or missing DKIM and it will deliver your problems at scale. Monitoring tells you this is happening; it can't prevent it.
  • Reputation is external. PowerMTA can't see a blocklist listing or your Gmail reputation — that's why the outside-in tools in section 8 are non-negotiable.

Frequently Asked Questions

What is PowerMTA monitoring?

PowerMTA monitoring is watching your MTA's live queue, per-domain delivery stats, and accounting logs to catch deliverability problems early. In practice: running commands like pmta show queues and pmta show topdomains, reading the CSV accounting file for bounce and deferral categories, and tracking rate metrics (bounce, complaint, deferral, delivery) against known thresholds so you react before an ISP throttles or blocks you.

How do I monitor PowerMTA in real time?

Use the CLI for instant snapshots: pmta show status, pmta show queues, pmta show topdomains, and pmta show virtual-mta <name>. PowerMTA also ships a built-in web monitor, usually on port 8080, with live-refreshing graphs. For historical trends, parse the accounting CSV into your own dashboard.

What is the difference between pmta reload and pmta restart?

pmta reload re-reads the config and applies changes with no downtime, validating first and refusing a broken file. pmta restart fully stops and starts the service, briefly interrupting delivery and clearing in-memory state. Use reload for config changes; reserve restart for upgrades or a misbehaving process.

Where are PowerMTA logs stored?

Two places: the main service log (typically under /var/log/pmta/) for daemon events and errors, and the accounting file (commonly /var/log/pmta/acct.csv), a structured CSV logging every delivery, bounce, and deferral with fields like type, rcpt, vmta, dsnStatus, dsnDiag, and bounceCat. The accounting file is your most valuable monitoring source.

How do I know if PowerMTA is being throttled by an ISP?

Run pmta show topdomains and look for one domain with a rising deferred count and 4xx responses in the diagnostics. Throttling shows up as temporary failures (4.x, "rate limited" / "try again later") concentrated on a single receiving domain while others deliver normally. Lower that domain's connection and message rate.

How do I check a PowerMTA config for errors before applying it?

Validation happens during pmta reload — a syntax error is rejected and the running config keeps serving traffic, so a bad edit can't take delivery down. Inspect the effective parsed config with pmta show settings. There is no separate check-config subcommand; the reload is the validation gate.

What are the main limitations of PowerMTA?

It's commercial and licensed, so cost and license management matter. It's a delivery engine, not a campaign tool — you still need something like MailWizz for lists and content. Native reporting is queue/log-focused, so most teams build their own monitoring on the accounting file. And it will send whatever you give it, so deliverability still depends on warm-up, list hygiene, and authentication.

Conclusion

Good PowerMTA monitoring isn't a fancy dashboard — it's a habit. Watch the queue and the accounting file, know the six numbers and where they break, and learn to read the difference between a deferral, a bounce, and a block. Do that and you'll catch a throttle at 9am instead of discovering a blocklist listing three days later.

Everything here is the routine I run on live servers. If you're still setting the server up, start with my PowerMTA configuration guide and my 6-week IP & domain warm-up schedule — monitoring only pays off once the foundation is right.


Found this useful, or spotted something I missed?
I keep these guides current as ISP rules change. If you have a correction, a sharper approach, or a monitoring war story of your own, I'd genuinely like to hear it — reach out here.