MailKite
Get your API key
All guides

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.

DimensionlistmonkKeila
InstallationDownloadable binary or Docker ComposeDocker image pentacent/keila
DatabasePostgreSQL, documented minimum 12 for binary installPostgreSQL required; minimum version undocumented on requirements page
Reverse proxy requirementApplication listens on port 9000 in install examples; proxy contract not specified thereForward WebSockets correctly behind a reverse proxy
Software licenseGNU AGPL version 3 license fileGNU AGPL version 3 license file
Email transportDefault SMTP backend; custom messengers also supportedSMTP, SES, SendGrid, Mailgun, Postmark sender types; managed sending on Keila Cloud

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

RequirementlistmonkKeila
Campaign contentAPI lists richtext, HTML, Markdown, plain, and visual content typesUI documents block, Markdown, plain text; API additionally lists MJML and HTML API
Template languageGo template expressionsLiquid, contact fields/custom data, unsubscribe-link variable
Audience filteringPartial PostgreSQL SQL expressions, including JSON attributesVisual conditions or JSON query language inspired by MongoDB
API authenticationBasicAuth or Authorization token header with API-user permissionsBearer authentication with a private API key
Campaign controlCreate, preview, test, update, schedule, run, pause, cancel through documented status transitionsCreate/update; separate schedule and send actions
Subscription workflowSingle/double opt-in lists; confirmed/unconfirmed/unsubscribed membershipEmbeddable signup forms; campaign template exposes unsubscribe link Templates
Published fixed campaign recipient capUndocumented in checked campaign APIUndocumented in checked campaign API

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.

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.