BIG BOX Hosting Services KumoMTA Hosting № 02.02

Managed KumoMTA
on your own infrastructure.

The open-source MTA written in Rust by some of the same engineers who built PowerMTA. Lua-scriptable, Apache 2.0-licensed, capable of pushing tens of millions of messages per hour from a single node. AWeber migrated to it in 2024. Cloudmark migrated in 2025. We host the production deployments behind that wave of migrations.

01  /  What this is

The MTA that broke the per-server licence model.

KumoMTA is the first serious open-source MTA designed from scratch for the throughput tier where PowerMTA and Momentum and the legacy commercial engines have lived for two decades. Released under Apache 2.0 in 2023, written in Rust, configured in Lua. Built by engineers who used to ship PowerMTA — and who decided the licensing model deserved to be replaced.

The argument KumoMTA's authors make against commercial MTAs is straightforward and, after running both in production for two years, we agree with it. You should not pay annual licence fees to send your own email through your own infrastructure. The relevant intellectual property — how to throttle Gmail correctly, how to parse a Yahoo bounce, how to handle a soft-fail cascade — is not proprietary to any vendor. It is operational knowledge that lives in documentation, in configuration files, and in the people who write them. Open-sourcing the engine does not give that knowledge away. It removes the artificial dependency on a vendor whose roadmap is not aligned with your needs.

What KumoMTA gets right beyond the licence model is the architecture. The core is written in Rust, which delivers two things at once: memory safety (no class of bugs that plague C-based MTAs) and asynchronous concurrency that scales to tens of thousands of simultaneous SMTP connections per box without thread-per-connection overhead. The configuration layer is Lua, which is a tiny scripting language that has been embedded in performance-critical software (Cisco IOS, Adobe Lightroom, World of Warcraft's UI) for twenty-five years. Lua is fast — also predictable and easy to read — and for an MTA configuration, the part that matters most is that it supports conditionals plus loops plus runtime computation. PowerMTA's flat-file directives don't.

The reason that matters is operational. Configuration as code is now the default model for any serious infrastructure team — checked into git, reviewed in pull requests, deployed with CI. PowerMTA's flat-file syntax can be put into git, but a 4,000-line config that needs the same throttling values for fifty domains has to be repeated fifty times. The KumoMTA equivalent is a Lua function that returns the right values based on the domain. The diff is auditable. Reviews are productive. Mistakes get caught.

Production usage caught up fast. AWeber, who has been sending email for over one million entrepreneurs since 1998, completed their full migration to KumoMTA in 2024 and published it. Cloudmark, the long-standing anti-spam infrastructure firm, followed in 2025. The list of mid-tier ESPs that quietly migrated includes several names we host. The Fall 2025 KumoMTA release brought message parsing improvements, injection-side performance work, and observability upgrades that closed the last few gaps with PMTA's mature feature set.

02  /  How Lua configuration works

Configuration as code, not as flat file.

The single biggest practical difference between KumoMTA and the older generation of MTAs is the configuration layer. Below is a redacted version of what we deploy on a typical Sender-tier client — same use case as the PowerMTA equivalent, written in Lua.

The Lua hook system is the central abstraction. KumoMTA fires named events at every important point in a message's lifecycle — when an HTTP submission arrives, when a queue is selected, when an SMTP delivery is attempted, when a bounce comes back. Your Lua script registers handlers for those events. The handler decides what happens. The configuration is the code; the code is the configuration.

The example below routes inbound messages to per-tenant queues based on an X-Tenant header — the kind of multi-tenant pattern that is standard for ESPs and platforms. In PowerMTA this would require a complicated VirtualMTA selection chain. In KumoMTA it is fifteen lines of Lua.

init.lua — tenant routing via HTTP headersimplified
-- Read the X-Tenant header, set as message metadata, strip the header
-- before delivery so it does not leak to recipients.
kumo.on('http_message_generated', function(msg)
  local tenant = msg:get_first_named_header_value('x-tenant') or 'default'
  msg:set_meta('tenant', tenant)
  msg:remove_x_headers { 'x-tenant' }
end)

-- Route to the correct queue based on tenant. Each tenant gets its own
-- egress source (= IP), its own throttling, its own DKIM key.
kumo.on('get_queue_config', function(domain, tenant, campaign)
  if tenant == 'enterprise_a' then
    return kumo.make_queue_config { egress_source = 'pool_a' }
  elseif tenant == 'enterprise_b' then
    return kumo.make_queue_config { egress_source = 'pool_b' }
  end
  return kumo.make_queue_config { egress_source = 'pool_default' }
end)

Per-receiving-domain throttling is, similarly, a function instead of a thousand lines of static directives. The example below applies the same starting points we use for PowerMTA — Gmail at 120/min on a freshly warmed IP, Microsoft at 300/min, Yahoo at 100/min — but expresses them as a Lua table that is trivially extensible. Want to add a new mailbox provider? One line. Want to apply a per-tenant override on top of a per-domain default? Three lines.

throttles.lua — per-domain rate limitsexcerpt
local THROTTLES = {
  ['gmail.com']       = { rate = 120, conn = 15, backoff = 30 },
  ['outlook.com']     = { rate = 300, conn = 25, backoff = 60 },
  ['hotmail.com']     = { rate = 300, conn = 25, backoff = 60 },
  ['yahoo.com']       = { rate = 100, conn = 10, backoff = 30 },
  ['icloud.com']      = { rate = 200, conn = 20, backoff = 40 },
  ['proton.me']       = { rate = 60,  conn = 5,  backoff = 15 },
}

kumo.on('get_egress_path_config', function(domain, source, site)
  local t = THROTTLES[domain] or { rate = 200, conn = 15, backoff = 40 }
  return kumo.make_egress_path {
    enable_tls = 'OpportunisticInsecure',
    connection_limit = t.conn,
    max_message_rate = string.format('%d/min', t.rate),
    max_deliveries_per_connection = 100,
  }
end)

The observability layer in KumoMTA is native, not bolted on. The engine exposes Prometheus metrics on every queue, every egress path, every receiving domain — queue depth, delivery rate, error code distribution, backoff state. Pre-built Grafana dashboards ship with the project. We deploy them as part of every Sender-tier installation, plugged into the same Grafana fleet that runs our internal operations. You see your numbers in real time, not in a CSV that needs Logstash to make sense of.

The integration layer goes further than any commercial MTA we know of. KumoMTA emits webhooks for every important event (message accepted, delivered, bounced, complained), and it can push the same events to AMQP or Kafka or directly to a database with a Lua handler. For ESPs with a custom analytics backend, this collapses an entire bounce-processing and event-pipeline subsystem into a few hundred lines of Lua. The teams we have helped migrate from PMTA report cutting their custom Python event-processor codebase by about 60% on average — and ending up with a system that is more reliable than what they replaced.

With features like traffic shaping, automation and management for IP pools, and all the webhooks they provide, Kumo allows us to write a lot of automation around it. Kumo is the part of AhaSend where I spend the least time. — AhaSend, public quote on KumoMTA project page
─────────────────────────────────────────────────────────────────────────
03  /  Migrating from PowerMTA

The migration most teams actually ask about.

Roughly two thirds of the migrations we run on this service are from existing PowerMTA setups. The KumoMTA project publishes their own migration guide; we have run it enough times to have an opinion on what trips teams up. Here is the honest version.

From the service-delivery angle, the migration is mostly a translation exercise on the concepts your team already knows. VirtualMTAs in PowerMTA correspond to egress sources in KumoMTA. The skill is identical: bind a logical sender to a source IP, attach a throttling policy, attach a DKIM key, attach a bounce handler. We have run this translation often enough that the mapping is in our intake notes, and the first migration call usually closes with the customer's engineer saying some version of "okay, that is less mysterious than the migration guide made it sound." The PMTA-trained reflex of thinking in VMTAs transfers without rework.

What does not map cleanly are the dozens of one-line PMTA directives that accumulated as workarounds for specific edge cases — the delete-file-holders yes, the run-as-root, the half-dozen flags that were added to fix bugs in the 2010s and stayed in everyone's config because nobody remembered they could be removed. The KumoMTA core handles those concerns natively. Removing them is part of the engagement: we will audit your existing config against the list of bugs those flags worked around, confirm none of those bugs is still relevant, and drop the workaround flags from the migrated build with a written rationale per line so a future engineer can verify the call.

What changes in scale is the configuration footprint we end up maintaining for you. PMTA configs we have inherited average 4,500-6,000 lines and lean heavily on per-domain blocks repeated for every receiving destination. The Lua rewrite we hand back is consistently shorter — 800-1,200 lines for the same operational scope — because the per-domain blocks collapse into table entries and a single iterator. The smaller config is the visible deliverable, but the operational dividend is what matters: fewer lines means fewer review cycles when your team needs to change a throttling policy or onboard a new mailbox provider's quirks. A recent migration we ran took a 5,800-line PMTA install down to a 950-line Lua install; we ran them in parallel for six weeks and the team cut traffic over only once the dashboards agreed on every metric.

The harder parts are the bits that were in shell scripts around your PMTA install rather than in the config itself. Your custom bounce handler. Your accounting log parser. Your suppression-list updater. KumoMTA absorbs most of those into Lua hooks — a handler on the get_queue_config event replaces an external bounce processor that was reading the PMTA log every minute. The migration is not literally translating config; it is rethinking the operational pipeline. We have done this enough times to have a checklist. The first time a team does it, they should plan for six weeks. We can usually do it in three.

The Lua language itself is rarely the obstacle. Engineers who have written any kind of programming language pick up Lua in an afternoon — the Programming in Lua book is freely available online, and the parts you need for KumoMTA configuration cover maybe the first 80 pages. The deeper KumoMTA-specific event model — hooks, configuration patterns, lifecycle handlers — is documented at docs.kumomta.com and we walk you through it as part of the migration engagement.

─────────────────────────────────────────────────────────────────────────
04  /  What's included

Same operational depth, open-source core.

The package matches the PowerMTA service in everything except the licence line. You are paying for the engineering work, the bare metal, the IP space, and the operational discipline — not for the binary.

KumoMTA install & patching
Latest stable build, deployed on dedicated hardware, patched on the project's release schedule. Major version migrations scheduled with you. We track upstream changes through the Discourse forum and the GitHub release notes.
Lua configuration
Per-tenant, per-traffic-class, per-receiving-domain Lua configuration written and maintained by us. Version-controlled in a private git repo for your account; you can submit pull requests for changes you want to make. Reviews are usually within 4 hours.
DNS authentication
SPF, DKIM (including key rotation every six months), DMARC advancement from p=none through p=quarantine to p=reject. ARC sealing where it materially helps placement. BIMI for verticals where the certificate cost is justified.
Bounce & complaint processing
Native KumoMTA event hooks fed into your suppression list in real time. Hard-bounce categories (RCPT failures, bad domains, inactive mailboxes) suppress immediately. Complaints from FBLs (Yahoo CFL, AOL legacy, Microsoft postmaster portal) suppress within 60 seconds.
Native observability
Prometheus metrics, Grafana dashboards, real-time queue depth and per-domain placement. We give you a read-only Grafana account on day one. Metrics are also exportable to your own monitoring stack via the standard scrape endpoint.
Webhooks & event integration
HTTP webhooks for every message lifecycle event (accepted, delivered, bounced, complained, deferred). AMQP and Kafka publishing for higher-volume integration with downstream analytics. The wiring is part of the onboarding.
IP warmup
4 to 6-week curve for new IPs starting with your 30-day-engaged segment. Daily monitoring of complaint rate, bounce rate, per-domain placement. Pause the ramp when numbers trend the wrong way; resume when they recover.
Migration from PMTA, SES, SendGrid, Mailgun
Full parallel migration with traffic split in 10% increments while monitoring placement. Suppression list transfer included. We do not charge for the overlap period with your previous provider.
Co-managed access
For Cluster-tier clients we offer a co-managed model where your senior engineers have shell access to the boxes and write access to the configuration repo, with mutual audit logging. Everyone else gets read access to logs and dashboards.
─────────────────────────────────────────────────────────────────────────
05  /  The honest fit assessment

When KumoMTA is right. And when PMTA still wins.

We host both PowerMTA and KumoMTA. The decision is rarely close — but the cases where PMTA wins are real, and we will tell you straight which side of the line you fall on.

KumoMTA is the right choice when you are starting fresh with no existing PMTA config to preserve; when configuration as code is part of your operations culture; when the per-server licence cost is meaningful against your margin; when you want native Prometheus and Grafana rather than custom log-parsing pipelines; when your team is comfortable with — or willing to learn — Lua; when you need event integration with Kafka or AMQP or a custom analytics backend; or when you want to avoid the vendor-relationship overhead that comes with any commercial product. For most new deployments past 1M sends per month, KumoMTA is the default.

PowerMTA is still the right choice when you have a mature PMTA installation with years of tuning that lifts and shifts cleanly to managed hosting without rewriting; when procurement requires a vendor SLA backed by a commercial entity (Bird) for compliance reasons; when your team has deep PMTA muscle memory that would take six months to replicate in Lua; or when you need a specific PMTA feature (the SparkPost reporting integration, the proprietary submission-via-pickup mechanism at very high volume) that has no direct KumoMTA equivalent yet. The gap on that last point closes every release; we expect it to be effectively zero by the end of 2026.

The volume thresholds are the same as for PowerMTA. Under 1M emails a month, neither dedicated MTA pays for itself — the SMTP Relay tier at €89/month does the same job with less overhead. 1M to 10M a month, KumoMTA is the default unless there is a procurement constraint. Above 10M, KumoMTA's per-node throughput advantage starts to matter materially. The 10M+ emails per hour figure on a single node has been validated in production by the AWeber and AhaSend deployments.

If you want a side-by-side feature comparison covering 10 dimensions (licensing, throughput, configuration, throttling, observability, webhooks, IP routing, lock-in, sovereignty, best-fit volume), it is on the home page in the Choosing your MTA section.

─────────────────────────────────────────────────────────────────────────
06  /  What it costs

€529 / month, no licence tax.

Slightly higher entry price than PowerMTA — the difference is the additional engineering work that comes with a Lua-configured system. After the first migration, the operational cost runs lower because the configuration scales without per-domain repetition.

Single node 100,000 / month — most senders fit here
  • Dedicated KumoMTA instance on bare metal
  • 2 dedicated IPs with full rDNS alignment
  • 100,000 sends per month (KumoMTA throughput headroom is higher)
  • Lua configuration written by us, version-controlled
  • Native Prometheus + Grafana dashboard
  • 4-hour ticket SLA, 24/7
  • Monthly per-domain placement report
€529 per month, VAT excl. Start with single node →
Cluster From 500,000 / month — ESPs, platforms
  • Multi-node KumoMTA cluster with HA
  • 10+ dedicated IPs, /29 ranges available
  • No message cap, custom Lua architecture
  • Per-tenant isolation, AMQP/Kafka event streams
  • 1-hour SLA, dedicated deliverability engineer
  • Co-managed access with your senior engineers
  • Multi-region failover (FRA + AMS or FRA + ARN)
Custom Quoted by volume Talk to sales →
─────────────────────────────────────────────────────────────────────────
07  /  Common questions

KumoMTA, specifically.

Questions from teams evaluating a move to KumoMTA from PowerMTA or from a self-hosted Postfix stack. The main FAQ covers the topics that apply across all our managed engagements rather than the KumoMTA-specific ones.

01 If KumoMTA is open-source, why do I need you to host it? +
You don't, technically. The binary is on GitHub, the documentation is excellent, and a competent infrastructure engineer can have a working install running in a day. What you would be paying us for is everything that comes after the install: per-domain throttling tuned for the current Gmail/Microsoft/Yahoo behaviour and updated as those change, FBL registration with the providers that still operate them, IP warmup discipline, suppression-list integration, real-time monitoring with someone on call, and a continuously-evolving Lua configuration that captures two years of operational learning that is nowhere in the docs. Self-hosting KumoMTA is a fine choice if you have a deliverability engineer on staff. If you don't, the operational cost of one (€80K-150K/year all-in for a senior person in Western Europe) is a useful sanity check against our pricing.
02 Can we run KumoMTA on our own infrastructure with you managing it? +
Yes, on Cluster-tier engagements. We have several clients running KumoMTA on hardware they own (or in their own AWS/GCP/Hetzner accounts) where we provide the configuration, the operational discipline, and the on-call coverage but the metal is theirs. The pricing model is different — a flat monthly fee for the engineering work, no hardware markup since we are not providing the hardware. This is the right model for organisations with regulatory requirements about asset ownership or with existing infrastructure investments that can be reused.
03 What if KumoMTA the project gets abandoned? +
The Apache 2.0 licence is the floor. The source is on GitHub. If the project lost its maintainer entirely, the existing code base would continue to work for years — MTAs are mature software and the protocol does not change. The operational risk is not "KumoMTA disappears overnight" but "feature pace slows down". If the latter happened, we would either fork and maintain the parts we care about (we already contribute upstream) or migrate clients to whatever replaces it, which we have done before with several engines over twenty years of operation. Our continuity is not bound to any single MTA's continuity. Compare with the situation where a commercial vendor decides the product is no longer strategic — there, the licence becomes worthless and the binary stops getting updates.
04 How does the KumoMTA throughput claim of 10M+ emails per hour hold up in practice? +
Validated on our own benchmarks and corroborated by the AWeber and AhaSend public statements. On a moderate dual-socket server (32 cores, 128GB RAM, NVMe SSD, 10G NIC), a single KumoMTA instance comfortably sustains 8 to 12 million messages per hour to a mix of major receiving domains, with the bottleneck being remote-end throttling rather than local CPU or I/O. We have pushed individual nodes past 15M/hour in synthetic benchmarks; in production the realistic ceiling is whatever the receiving-domain throttling lets through, which is typically 8-10M/hour for a well-mixed list. PowerMTA on identical hardware sits in the 7-9M/hour range. The Rust core is meaningfully faster than the C-based PMTA on the same workload.
05 Do we need to write Lua ourselves? +
No. The Lua configuration is written and maintained by us. You can read it (it is in a git repo we share with you) and you can submit pull requests for changes you want to make. Most clients do this once or twice a year — adding a new tenant, changing a per-domain throttle, wiring a new webhook endpoint. Our team turns those reviews around in under 4 hours during European business hours. If you want to write your own Lua, we will review it as enthusiastically as we review our own. If you want to never look at Lua again, that is also fine — most of our Sender-tier clients never do.
06 How do I integrate my application with KumoMTA? +
Three options, all natively supported. Standard SMTP submission on ports 25, 587, or 465 — works with any application that already speaks SMTP, no changes needed. HTTP submission against KumoMTA's native HTTP listener — JSON request with the message and metadata, faster than SMTP for high-volume injection because no handshake overhead. Direct Lua hook — for advanced cases where you want to pre-process every message in custom code before queuing. Most teams start with SMTP and move to HTTP submission once they hit volumes where the per-message handshake matters. We will help wire whichever fits your application best.
07 What about commercial support tiers from the KumoMTA project itself? +
KumoMTA Inc. (the commercial entity behind the project) offers paid support tiers — Silver, Gold, and Enterprise — with response-time SLAs and direct engineering access. We are happy to recommend that path if your situation is unusual enough to need it (for example, if you are running KumoMTA on an exotic platform or contributing significantly to the upstream code). For the operational cases most senders are in, our managed hosting service includes equivalent or better SLAs as part of the monthly price, so paying KumoMTA Inc. on top would be redundant. We do maintain a working relationship with the project's commercial side — we contribute back fixes we develop, and they have helped debug edge cases on our cluster-tier deployments.
─────────────────────────────────────────────────────────────────────────
08  /  The risk profile

What KumoMTA doesn't tell you.

Open source means a different risk profile than commercial software, not better or worse. The four risks below are what we have observed across the client base in the last 24 months and the ones we walk every prospect through during evaluation. None are dealbreakers for most senders. All matter at scale or in regulated environments.

KumoMTA is open source, which means a different risk profile than commercial MTAs. Not better. Not worse. Different. The four risks below are the ones we have seen show up across the client base in the last 24 months, and the ones the KumoMTA team would acknowledge but does not advertise. None are dealbreakers. All are things to plan around if you are evaluating the product against PowerMTA on equal terms.

1 — The enterprise support gap

The first risk is the enterprise support gap. PowerMTA at the Volume tier comes with a phone number to a Port25 engineer, four-hour SLAs on critical issues, and a track record of nineteen years of supporting paying customers in production. KumoMTA's commercial support comes from KumoCorp — the company that maintains the open-source project — and is a much younger operation. Response times are good, the team is technical, but the institutional knowledge of running every weird edge case at every weird customer scale that Port25 has accumulated is not yet there. For most senders this does not matter; the open-source code is well-engineered and the documentation is thorough. For a sender running 200 million messages per month with audit requirements that demand a vendor on the hook contractually, PowerMTA's support depth is a real factor in the buying decision.

2 — Lua skills as single point of knowledge

Second is the operational skills question. Lua is easy to learn, but it is one more thing your team needs to know. PowerMTA configs can be edited by anyone who can read a flat file. KumoMTA configs require someone who is comfortable with conditional logic, table iteration, and basic functional programming patterns — three skills that are not universal among email operators. Most teams pick this up in a week. Some teams have a senior who picks it up and a junior who never quite does, which creates a single point of knowledge in the organisation. We have one client whose entire KumoMTA pipeline depends on one engineer's understanding of Lua patterns, and we have flagged it as an operational risk to their leadership three times. They have not addressed it. The risk is real even when the technology choice was correct.

3 — Feature lag in niche operational areas

Third is feature lag in narrow areas. PowerMTA has nineteen years of accumulated features for niche operational needs — exotic bounce categorisation rules for legacy receivers, specific SMTP extensions used by enterprise inbox providers, throttling primitives for receivers that PMTA has had decades to characterise. KumoMTA covers 95 percent of what production deployments actually need. The remaining 5 percent matters for specific senders. We have one client running heavy Japanese market traffic where two PMTA features around DoCoMo deliverability heuristics had to be reimplemented in Lua. The reimplementation works but took three weeks of engineering time. If your sending profile has any unusual receiver concentration, audit the PMTA features you actually depend on before assuming they map to KumoMTA without effort.

4 — Open-source roadmap dependency

Fourth is the open-source roadmap dependency. KumoMTA is maintained by a small team at KumoCorp with funding that has been described publicly as adequate but not deep. If the project loses momentum, the operational continuity for senders in production becomes the community's responsibility. The code is open source under the Apache 2.0 licence. A sufficiently motivated user can fork and maintain it. In practice, the engineering depth required to maintain a high-throughput MTA is rare enough that most senders will not be able to do this themselves. We mitigate the risk in a specific way — by maintaining our own tested fork of the KumoMTA core, with patches we have tested in production but not yet upstreamed. If the upstream project stalls, our clients keep running on a known-good codebase while alternatives get evaluated. PowerMTA does not have this risk profile because Port25 has been a stable commercial entity for nineteen years and counting.

─────────────────────────────────────────────────────────────────────────

Run KumoMTA without running it yourself.

A 30-minute call with one of our engineers. We walk through your current sending setup, the volumes and the failure modes you have been seeing, and tell you whether KumoMTA is the right answer. If you are migrating from PMTA, we will pull your existing config and give you a rough estimate of the conversion effort — that takes about a week.