Volume above ceiling
Monthly volume above 5 million suggests daily peaks above 500K. Postfix queue management struggles under sustained load; deferrals accumulate at receivers without aggregated visibility.
Threshold: 5M+ monthlyB2B operations that grew for years on Postfix with modified master.cf, custom transport maps, elaborate header_checks regexes, milters written in C or Python, bounce processing scripts that feed downstream systems, and rate limiting via custom queue manipulation. It works, but the scale-up accumulates unmanageable complexity: the team that wrote the scripting is no longer at the company, operational runbooks were never documented, observability is grep across log files. The upgrade to PowerMTA or KumoMTA recovers functional parity with native observability, documented runbooks, managed multi-IP rotation, robust persistent queue, per-ISP throttling, advanced bounce classification, automated feedback loop processor. The Jobtome case study from Postmastery documents replacing 30 Postfix instances with a single PowerMTA at 2.5 million emails per peak hour and 7 minute average delivery time. No lock-in between PowerMTA and KumoMTA: the decision is based on customer variables (volume profile, multi-tenancy, compliance, in-house engineering depth, budget) rather than EMP commercial interests. Approximately 55 percent of EMP migrations route to PowerMTA, 45 percent route to KumoMTA, with the split shifting toward KumoMTA over 2024-2026 as the open-source option matured.
Postfix handles 500,000 to 1 million messages per day on tuned hardware before structural limitations appear. Below that volume Postfix is the right answer for most B2B and SaaS operations because the operational simplicity outweighs the additional capabilities of commercial MTAs. Above that volume the four signals below become visible; any one signal justifies migration consideration; two or more signals make migration the right answer for the program.
Monthly volume above 5 million suggests daily peaks above 500K. Postfix queue management struggles under sustained load; deferrals accumulate at receivers without aggregated visibility.
Threshold: 5M+ monthlyMore than 4 IPs requiring per-ISP traffic shaping, reputation segmentation between streams. Postfix orchestration via external scripts becomes unmaintainable as pool grows.
Threshold: 4+ IPsDedicated transactional vs marketing stream separation requiring isolated reputation surfaces, per-stream throttling, per-stream FBL processing.
Threshold: 2+ streamsPlatform sending on behalf of clients requiring per-tenant configuration, per-tenant reputation isolation, per-tenant compliance documentation.
Threshold: Any tenant countThe mapping table below documents the common Postfix constructs the discovery phase inventories and how each translates to PowerMTA or KumoMTA. Approximately 85 to 95 percent of constructs have direct equivalents; the remaining 5 to 15 percent require either feature changes the customer team approves or custom development that EMP scopes explicitly in the migration plan rather than discovering during execution.
| Postfix construct | PowerMTA equivalent | KumoMTA equivalent | Translation notes |
|---|---|---|---|
| main.cf parameters | pmta.conf directives | init.lua + kumomta.toml | Direct mapping; ~250 Postfix params → 200+ PowerMTA params or Lua-driven KumoMTA config. |
| transport_maps | Virtual MTA routing | Lua routing functions | vMTAs more capable than transport_maps; Lua gives full programmatic routing. |
| header_checks regexes | Header rewriting rules | Lua message hooks | PowerMTA syntax differs from PCRE; KumoMTA Lua uses native regex library. |
| DKIM milter (opendkim) | Built-in DKIM signing | Built-in DKIM signing | Both target MTAs ship native signing; milter dependency removed. |
| Custom bounce scripts | Built-in classification | Built-in + Lua hooks | Bounce classification automated; custom scripts replaced by configuration. |
| FBL processing scripts | Automated FBL processor | Built-in FBL handler | ISP FBL handling automated; legacy custom code eliminated. |
| Rate limiting scripts | Per-ISP throttling | Lua-based throttling | Native per-ISP rate controls; no external orchestration needed. |
| Log grep + custom analytics | PowerMTA logs + Postmastery | Structured logs + Grafana | Both target MTAs produce structured logs; aggregation via standard tools. |
| Custom Python/C milters | Configuration or custom | Lua scripts (preferred) | Most likely custom work item. Inventory in discovery. |
# main.cf · sending-only outbound MTA myhostname = mta1.example.com mydomain = example.com inet_interfaces = all smtpd_banner = $myhostname ESMTP # Custom transport routing transport_maps = hash:/etc/postfix/transport smtp_destination_concurrency_limit = 20 smtp_destination_rate_delay = 1s # Custom DKIM via milter milter_default_action = accept smtpd_milters = inet:localhost:8891 non_smtpd_milters = $smtpd_milters # Custom header rewriting header_checks = regexp:/etc/postfix/header_checks # Bounce handling via external script bounce_notice_recipient = bounces@example.com # Bounce processor: external Python daemon # Parses postmaster mailbox via IMAP
# pmta.conf · outbound delivery engine host-name mta1.example.com postmaster postmaster@example.com # Virtual MTA for Gmail traffic <virtual-mta gmail-pool> smtp-source-host 203.0.113.10 mta1.example.com max-smtp-out 20 </virtual-mta> # Native DKIM signing module <domain-key selector,example.com> private-key-file /etc/pmta/dkim.key algorithm rsa-sha256 </domain-key> # Built-in bounce classification <bounce-processor default> bounce-category-policy standard </bounce-processor> # Built-in FBL feedback loop <feedback-loop gmail> email-source arf@example.com </feedback-loop>
The contrast surfaces two structural patterns. First, the configuration footprint of the target MTA is smaller because capabilities that required external milters and scripts in Postfix are native to PowerMTA or KumoMTA. Second, the operational surface is consolidated: a single MTA process handles signing, throttling, bounce processing, and FBL handling that previously required coordination across opendkim, custom Python daemons, IMAP polling, and external rate limiters. The migration also recovers observability because the target MTAs produce structured logs that aggregate cleanly into Grafana, Postmastery Delivery Analytics, or similar dashboards. The runbook handoff documents the new operational discipline so the customer team has explicit procedures for selector rotation, IP warmup of new pool members, throttling adjustments per ISP feedback, and incident response.
The phases run sequentially with the parallel delivery period absorbing 30 to 50 percent of the total timeline because real production traffic is required to validate the new MTA behavior under real conditions. Compressing the parallel phase produces exactly the failure modes the migration is designed to avoid; expedited migration is not offered.
The migration produces value only when the four scale signals justify the operational complexity transition. For programs below the 1 million monthly threshold the EMP recommendation is to stay on Postfix and invest the migration budget in deliverability work that produces visible business impact: authentication cleanup, sender reputation recovery, content optimization, list hygiene discipline. The Postfix-handles-95-percent-of-cases observation from independent practitioners aligns with EMP experience; the cases where migration genuinely justifies are the ones where the four scale signals all light up. EMP runs the volume and architecture diagnosis during the Discovery + Plan tier (2,400 USD standalone) and explicitly recommends against migration when the customer profile does not justify it; approximately 20 percent of discovery engagements end with the recommendation to stay on Postfix and a refund of the unused execution-phase budget.
The phases run with strict gating: each phase requires explicit customer sign-off before the next begins. The rollback path retains Postfix configured and operational for 30 days post-cutover (60 days for Enterprise tier), with the routing proxy capable of reverting traffic to Postfix within 5 minutes if a critical issue emerges.
Postfix config audit, milter inventory, transport map analysis, bounce processor reverse-engineering, vendor recommendation PowerMTA vs KumoMTA.
Target MTA installation, configuration translation per mapping document, DKIM key migration, vMTA or Lua routing setup, custom work execution.
Routing proxy splits traffic 10/90 then 25/75 then 50/50 ramping over 2-4 weeks. Validation against real production traffic, behavior reconciliation.
Routing proxy moves to 100 percent new MTA. Postfix frozen configuration retained. Rollback path armed for 30-60 days.
Post-cutover monitoring 30-90 days, runbook delivery, customer team training, Postfix decommissioning after rollback window closes.
All four tiers are fixed-fee. The Discovery + Plan tier is sold standalone for organizations that want the migration plan and vendor recommendation before committing to execution; the document delivered standalone has value even if the customer team executes the migration internally afterward. The execution tiers include the discovery work as the first phase.
Standalone plan · no execution.
Single-domain single-pool.
Up to 8 IPs + stream separation.
Multi-tenant or multi-domain.
"Why migrate at all if Postfix has been working?"
If Postfix has been working and the four scale signals are not lit, EMP recommends staying on Postfix. Approximately 20 percent of EMP discovery engagements end with the recommendation to stay and a refund of the unused execution-phase budget. The migration produces value only when the operational complexity of legacy Postfix exceeds the operational complexity of the target MTA, which happens when volume is above the 1 million daily ceiling, when multi-IP rotation requires external orchestration, when transactional and marketing streams require isolation, or when the team that wrote the custom scripting is no longer at the company. Below those thresholds the migration is structural over-investment; the budget produces more visible business impact when allocated to deliverability work (authentication, sender reputation, content optimization) than to MTA replacement. The honest framing reflects EMP business model: customers who pursue migration without the underlying justification end up with a more capable platform they do not need plus the operational learning curve of the new MTA, and the engagement ends with mutual frustration rather than customer success.
"How does EMP choose between PowerMTA and KumoMTA without bias?"
The selection criteria are documented and the discovery deliverable shows which variables drove the recommendation. PowerMTA wins when: budget includes 30,000 to 200,000 USD annual licensing, vendor support with enterprise SLA is required, compliance explicitly names a commercial MTA, in-house engineering team is small and prefers managed configuration. KumoMTA wins when: budget is constrained, open-source transparency is preferred for audit, in-house team has Rust or Lua scripting capability, the deployment is greenfield or significantly redesigned. The 55/45 split in EMP migrations historically reflects the real population mix; if EMP recommendations were biased toward one vendor the split would not converge to this ratio. EMP publishes the selection methodology in the discovery document section that the customer audits.
"What is the message loss risk during migration?"
Zero in EMP 2024-2026 migration history; the parallel delivery design is structured specifically to make message loss impossible. The application layer sends each message exactly once to the routing proxy; the proxy decides which MTA receives the message based on the current traffic split; the chosen MTA processes the message normally. Duplicate sends are prevented by the proxy's exactly-once delivery semantic. The message identifier reconciliation step running during parallel delivery verifies that each Message-ID logged at the source appears exactly once in the receiving provider's bounce or delivery logs; any discrepancy triggers investigation before cutover proceeds. The technical pattern is well-established (parallel running in IT system migration generally) and the email-specific variant has been used by Postmastery, Sinch Mailgun migration team, and similar specialist groups for over a decade.
"What is the cost of PowerMTA licensing year over year?"
PowerMTA licensing in 2026 ranges from 30,000 USD annually for small-volume deployments (under 5 million monthly) to 200,000+ USD for large enterprises (above 50 million monthly), with the specific quote depending on volume tier, support level, and contract length. EMP does not resell PowerMTA licenses; the customer contracts directly with the PowerMTA vendor (formerly Port25, acquired by SparkPost then by Bird) and EMP delivers the installation, configuration, and migration work separately. The economic comparison: a 10 million monthly program pays approximately 60,000-80,000 USD PowerMTA licensing annually plus the EMP migration fee of 14,500-28,500 USD one-time; the same program on KumoMTA pays zero software licensing and the EMP migration fee is comparable. Over 5 years the PowerMTA program pays approximately 300,000-400,000 USD in licensing the KumoMTA program does not pay; the calculus has to include the value of vendor support and compliance positioning that PowerMTA provides.
"Can EMP train our team rather than fully running the migration?"
Yes, the engagement structure adjusts to customer preference. The Discovery + Plan tier is the EMP-light variant where the customer team executes the migration internally using the EMP plan as the runbook; EMP delivers the document, conducts 2 readout calls, and is available for 4 hours of question-and-answer support during the customer execution. This works for organizations with capable in-house DevOps and email engineering teams that need the structured plan but not the hands-on execution. Approximately 35 percent of EMP migrations follow this pattern; the customer ends up paying 2,400 USD instead of 14,500-58,000 USD and absorbs the execution effort internally. EMP recommends the EMP-light variant explicitly when the customer team has the capability; the recommendation appears in the discovery readout when applicable. The Standard, Multi-IP, and Enterprise tiers exist for customers without the in-house capability or with bandwidth constraints that justify external execution.
"What if we discover during migration that a custom milter cannot be translated?"
The discovery phase explicitly inventories every custom component including milters and identifies translation gaps before execution begins. Approximately 5 to 15 percent of custom components have no direct equivalent in the target MTA; the gaps are documented in the discovery deliverable with the options: replicate the milter functionality via custom Lua scripts in KumoMTA (typically the lower-cost option because Lua is easier to maintain than C or Python milter code), implement the equivalent logic as application-level pre-processing before the message reaches the MTA (works for header rewriting and content transformation), accept the feature change and document the behavior difference for the customer team to approve. The custom work scope is fixed-fee in the execution tier; EMP does not discover custom work during execution and request additional budget. The 5-15 percent rate reflects the realistic distribution; some legacy environments hit 25-30 percent custom work which the Enterprise tier handles, some greenfield environments approach 0 percent.
Four scale signals justify migration:
One signal justifies consideration; two or more make migration the right answer.
Vendor-neutral selection based on customer variables:
Selection rationale documented in discovery deliverable.
Routing proxy with exactly-once delivery:
Zero message loss in EMP 2024-2026 migration history.
Translation map per construct:
5-15% require custom work, scoped in discovery before execution.
Postfix retained operational 30-60 days post-cutover:
Minimized but not zero:
Tier-specific timelines:
Expedited not offered: parallel phase requires real traffic validation.
Yes, hybrid environments common:
The scheduling call gathers four data points required to size the engagement: current Postfix volume per month with daily peak estimate, number of IPs in pool and whether multi-pool or single-pool, custom component inventory (milters, bounce processors, FBL scripts), in-house team capability for handling the migration internally vs requiring full EMP execution. With those four points EMP issues a fixed-fee quote within 48 hours. The Discovery + Plan tier is available standalone for organizations that want the migration plan and vendor recommendation before committing to execution; the document delivered standalone has value even if the customer team executes internally afterward.