listmonk vs Keila for self-hosted newsletters
Reviewed
listmonk and Keila are self-hostable newsletter applications that manage campaigns and subscriber data while using a configured sending service. Choose listmonk when its binary deployment, SQL-based subscriber querying, and campaign status API suit your team. Choose Keila when its visual segment builder, Liquid templates, and project-oriented API suit the people preparing editions. Neither choice removes the need to operate delivery feedback and subscriber eligibility.
Disclosure: this guide is published by the team that builds MailKite. We compare primary documentation, checked October 14, 2026. We haven’t installed or benchmarked both systems for this article. Recommendations are architectural judgments, not measured usability or performance results. Documentation can describe newer capabilities than your installed release, so verify the release you deploy.
Installation and ownership
The table links every factual cell to the documentation or license establishing it.
listmonk’s binary option is useful if your operations already deploy small standalone services. Docker Compose is its recommended container path. Keila’s requirements start with a container engine and PostgreSQL, and explicitly call out WebSocket forwarding. These are deployment differences, not evidence that either application needs fewer resources under a given audience size.
For either system, preserve the database, uploaded assets, configuration, and secrets. Pin the application release, rehearse upgrades on a restored copy, and check that your backup can actually be recovered. A working container with an empty database doesn’t restore unsubscribe history or a campaign’s progress.
The AGPL license files apply to the software. In particular, their remote-network clause concerns modified versions offered over a network. Keep the applicable notices and source obligations with your deployment. The license isn’t a sending policy, and it doesn’t override the terms of the SMTP/API provider you configure.
Editing, segmentation, and APIs
Don’t read “undocumented” as unlimited. The configured transport, resource capacity, and any hosted plan still constrain sending. Neither table supplies a messages-per-second comparison.
Recommended scenarios
A backend team with SQL skills and subscriber attributes: shortlist listmonk. Its subscriber queries can address nested JSON attributes and combine conditions using PostgreSQL expressions. The advantage is an audience rule your engineers can inspect. The trade-off is that someone must own those expressions, their semantics, and the permissions around them. A typo in an audience rule can select the wrong recipients even when sending works perfectly.
An editorial team that wants visual conditions and Liquid personalization: shortlist Keila. Its documented segment editor combines conditions visually, while the JSON query editor supports more complex rules. Campaigns expose contact data and an unsubscribe URL through Liquid. Give editors fixtures with missing optional fields before adopting a template; a successful render with one complete contact doesn’t establish every recipient’s result.
An application generating newsletter editions through an API: both merit evaluation. listmonk has documented preview and test endpoints plus explicit status-transition rules. Keila separates draft creation from schedule and deliver actions. Pick the lifecycle your integration can represent cleanly rather than translating both into a single “sendCampaign” function that hides their differences.
A team that doesn’t want to own a campaign service: self-hosting may be the wrong boundary. Keila also offers Keila Cloud, billed by monthly email volume, with unlimited contacts/projects advertised on its plans. MailKite, which we build, offers hosted broadcast management for consented campaigns if its workflow fits. Those alternatives move operating responsibility; they aren’t evidence of feature parity with either self-hosted app.
Submission success is not newsletter completion
Keila’s campaign API documents a 202 delivery-queued response. It explicitly warns that an invalid campaign, such as one missing a sender, or insufficient account credits can prevent delivery regardless of that response. Store the campaign ID and inspect the campaign’s subsequent state. Don’t treat a queue acknowledgment as a delivered audience.
listmonk’s status API documents which transitions are valid: a draft can be scheduled, draft or paused work can run, and running work can be paused or canceled. A retry must respect the current state rather than repeating the original transition blindly. Pause and cancellation also cannot recall mail already accepted by the configured transport.
This distinction should appear in your application ledger. Save the edition, campaign ID, expected audience, last observed state, and delivery reconciliation time. A second campaign with the same content is not a neutral retry; it can create a second newsletter edition for the same subscribers.
Preserve opt-outs during migration
Export subscription status before importing contacts. In listmonk, an unconfirmed subscriber can receive a single-opt-in campaign, while double-opt-in lists require confirmation. Map those relationships deliberately. Importing every row as enabled loses the difference between “stored address” and “confirmed subscription.”
Translate templates rather than copying them verbatim. Go expressions and Liquid have different field paths and syntax. Rebuild the unsubscribe action using the destination application’s contract; an old application’s link may become unusable after shutdown. Keep the old suppression data available until the new system has reconciled it and your queued jobs no longer depend on it.
For feedback, listmonk documents bounce processing through a configured POP mailbox or supported provider APIs, with settings to blocklist or delete bounced subscribers. Keila’s segmentation documentation includes bounced, complained, and unsubscribed message fields. That demonstrates available data, not automatic support for every provider’s webhook. Verify the feedback integration for your chosen sender instead of assuming a named sending adapter covers all event handling.
Costs and policy boundaries
Self-hosted cost is the application host, PostgreSQL, backup storage, sending transport, and operator time. Neither AGPL license sets an email-volume price. Compare those components under the same audience and edition frequency; don’t equate “open source” with a zero-cost delivery system. For transport billing, use the bulk email API comparison.
Keila Cloud terms explicitly govern Cloud rather than self-hosted Keila, which uses the software license. We didn’t find a service-wide self-hosted sending AUP in the checked listmonk installation/API sources. Your transport’s current policy still applies. MailKite terms prohibit unsolicited bulk/commercial mail, unconsented recipients, and opted-out recipients. Configuring SMTP in a campaign application doesn’t change that rule or establish outreach permission.
Make the final choice with one edition
Build the same small consented audience and edition in the candidate you prefer. Include an opt-out, missing profile data, and a duplicate contact. Verify preview, scheduling, recovery, and audience exclusions using that release’s documentation. This is a proposed acceptance exercise, not a test we claim to have performed.
Use programmatic newsletters for the lifecycle design, then the JavaScript or Python guide for application integration. Choose the application your editors and operators can maintain together, including the failed-send path and the next unsubscribe.