Self-hosted lifecycle messaging for SaaS products

SaaS teams that want onboarding, product and lifecycle messages without sending user data to a volume-priced vendor can run Dittofeed and listmonk in their own infrastructure. This page covers what to decide first.

On this page

Why lifecycle messaging on your own infrastructure changes the build for SaaS

A SaaS product team can keep its user events, account data and message logic inside its own VPC by self-hosting Dittofeed for event-triggered journeys and listmonk for newsletters. Both are open source and run on infrastructure the operator controls, so the messaging vendor no longer holds the copy of every user profile. Dittofeed describes self-hosting as a way to keep sensitive personal data inside the operator's own VPC and to avoid volume-based pricing, which matters when a product's user base grows faster than its message budget. SaaS differs from a marketing newsletter in three ways. Onboarding and lifecycle messages are triggered by product events such as a workspace being created or a trial ending, so the event pipeline becomes part of the messaging build. Each user's traits and segment membership move through that pipeline continuously, which makes data flow mapping a first task. Many SaaS products also run several tenants or workspaces, so the team must decide whether one Dittofeed workspace serves all customers or whether tenants are separated, and confirm how sending domains and suppression lists are scoped per tenant. Push and SMS usually run alongside email, and each channel needs its own provider, consent handling and rate controls.

Dittofeed is currently published as pre-release tags, with v0.24.0-alpha.21 the most recent release listed in the supplied facts. Before committing, confirm with the project which release is considered production-ready, what its upgrade path looks like between alpha tags, and whether its Helm charts and Docker Compose deployment meet your hosting standard. listmonk is a more mature choice for newsletters, with v6.2.0 published on June 26, 2026, but it is a one-way broadcast tool, so event-triggered journeys would need another component. Test both against a sample of real events in a non-production environment before you choose a split between them.

Which requirements shape a self-hosted lifecycle messaging build

This table maps each requirement that commonly applies to a SaaS team sending lifecycle messages to what it asks for and what it changes in the build. Read each row as a question to answer for your own product, customers and jurisdictions, then confirm applicability with counsel and your auditor.

RequirementWhat it asks forWhat it means for the messaging build
GDPR Article 28(3) processor contractsProcessing only on documented instructions, including for transfers, and Article 32 security measuresMap every sending service, Dittofeed host and email provider as a processor. Event data and user segments stay in your VPC, and the contract defines where they go.
GDPR Article 32 security of processingAppropriate technical and organizational measures for personal dataEncrypt event streams and the Postgres store, restrict API keys for event ingestion, and log access to user profiles and send histories.
EU Data Act switching rightsCustomers can switch providers or move to on-premises infrastructure, with a two-month maximum notice and 30-day transitional periodKeep templates, segments and journey definitions exportable in open formats, such as git-held templates and documented API exports, so a move does not depend on one vendor.
EU Data Act switching chargesNo switching charges from 12 January 2027; reduced charges before then may not exceed direct switching costs (Data Act, Article 29)Ask any hosted vendor how exports work and what they charge after that date. Self-hosting removes per-volume fees, but your own export tooling becomes your cost.
SOC 2 Trust Services CriteriaSecurity common criteria CC1 to CC9 apply to every SOC 2 report, with Type 1 covering design and Type 2 covering operating effectiveness over a periodEnterprise customers ask how messaging access, change approval and log retention are controlled. Evidence includes access reviews, deployment records for journeys and retained audit logs. Confirm scope with your auditor.
Template and journey change controlDocumented, reviewable changes to customer-facing communicationsStore email templates and journey branches in git, require review before merge, and tag releases so you can show which template version reached each user.
Cyber Resilience Act reportingArticle 14 reporting obligations apply from 11 September 2026 to in-scope products placed on the market; full requirements apply from 11 December 2027Determine whether your SaaS product or a component you distribute is a product with digital elements. If it is, plan vulnerability handling and reporting for any packaged messaging code you ship.
Consent and suppression recordsProof of consent and honored opt-outs across all channelsKeep suppression lists shared between email, push and SMS channels so a user who unsubscribes in one place is not messaged on another.

Which open-source platform fits which lifecycle job

Event-triggered journeys respond to what a user does inside the product, such as finishing a setup step, inviting a teammate or going quiet for a set period. Dittofeed is built for this job. It takes user data from Segment, reverse ETL or its API, builds segments with multiple operators, and sends one-off broadcasts or automated journeys over email, mobile push, SMS, WhatsApp and Slack. It is MIT licensed, so you can modify and host it without copyleft obligations on your own code.

  • Channel coverage: Email, push, SMS, WhatsApp and Slack are documented channels, but Dittofeed hands email delivery to a provider such as SendGrid or Amazon SES, so that provider is a separate contract and cost.
  • Release maturity: Recent GitHub releases are pre-release tags, with v0.24.0-alpha.21 published on October 4, 2026. Confirm the production support position with the maintainers before you commit a customer-facing journey to it.
  • Engineering workflow: Templates can live in git, campaigns can use branch-based version control, and a testing SDK can check campaigns in CI.
  • Data location: Self-hosting keeps event and profile data inside your own VPC, which matters when product events contain personal data.

Confirm the production status, the supported deployment path and the upgrade policy in writing before you plan the rollout.

How a lifecycle messaging rollout moves from event map to live journeys

A lifecycle messaging rollout starts with the events and identities your product emits and ends with monitored journeys running in your own infrastructure, with a documented way to leave if you ever need to.

  1. Map events, identities and consent data

    The product, data and marketing owners list the events that should trigger messages (sign-up, activation, plan change, trial end, inactivity) and the user attributes each journey needs. The engineering lead confirms how user identifiers flow from the application through Segment, reverse ETL or the Dittofeed API, and which fields hold consent status. Done when every journey has a written event list, a named data source and an agreed owner for each attribute, reviewed against your privacy notice.

  2. Deploy Dittofeed and listmonk inside your VPC

    The platform team deploys Dittofeed with its documented Docker Compose or Helm chart paths, and listmonk from its Docker image with PostgreSQL, inside the cloud account or cluster where your user data already lives. They set up backups, secrets management, single sign-on where supported, and network rules so no user data leaves your boundary by default. Done when both services run in a non-production environment, restore from backup has been tested, and access is limited to named roles.

  3. Configure the sending service and domain authentication

    The messaging and security teams connect Dittofeed to your email service provider, such as SendGrid or Amazon SES, and set up SPF, DKIM and DMARC for the sending domain, along with the unsubscribe handling your mailbox provider and marketing rules require. Push and SMS providers are wired in at this stage if they are in scope. Done when test messages pass authentication checks and the provider's suppression and bounce feedback is routed back to your systems.

  4. Build templates and journeys in git

    Engineers and lifecycle marketers write email templates in HTML or MJML, store them in a repository, and use Dittofeed's branch-based workflow to propose journey changes through review rather than editing live campaigns by hand. Segments and journey logic are documented alongside the templates. Done when every template and journey change is traceable to a reviewed commit and an approver.

  5. Test campaigns in CI with the testing SDK

    Engineers add the Dittofeed testing SDK to the pipeline so each journey change is checked before merge, covering trigger conditions, segment membership for sample users and required template fields. Failing checks block the merge. Done when the pipeline runs on every change and a deliberately broken journey fails the build in a test run.

  6. Run a controlled pilot on one segment

    The team enables one journey for a limited, internally agreed segment, such as a single product tier or a set of recently signed-up test accounts, and reviews deliveries, bounces, complaints, unsubscribes and whether events fired at the right moment. Corrections go back through the git workflow. Done when pilot results match the expected event flow and the sending domain shows clean authentication and bounce rates your team has agreed to accept.

  7. Go live with monitoring and a switching plan

    Journeys are expanded to the full audience with dashboards for delivery, error and event-processing health, alert routing to the on-call team, and a runbook for suppression and consent changes. The exit plan records how templates, segments, consent records and sending history would be exported, and how a move to another provider would be carried out. Done when the runbook has been exercised, alerts reach a named owner, and the exit plan is stored with the platform documentation.

What security and compliance reviewers ask for from the messaging stack

This table maps the evidence a security or compliance reviewer typically asks for to the component in a lifecycle messaging stack that produces it. Read each row as a question to answer before go-live, with the owner and the artifact to request. The main takeaway is that most evidence comes from configuration history and records kept by your team, while the reports themselves come from independent assessors.

Evidence areaWhat the reviewer asks forWhere the evidence comes from
Processor agreements and data processing recordsSigned processor terms with the sending service, documented instructions for processing, and a record of which data goes to which providerContracts held by your legal team, plus a data flow register listing Dittofeed, listmonk, the email provider and any SMS or push vendor
Access logs and SSO configurationWho can edit journeys, lists and templates, how staff sign in, and whether access is removed when people leaveOIDC single sign-on settings and role assignments in listmonk, admin logs from the hosting layer, and API token inventory
Git history and approvals for templates and campaignsProof that each template or campaign change was reviewed and approved before it reached usersBranch-based git workflows for Dittofeed campaigns and email templates, pull request approvals and protected branch rules
CI test results for messaging logicEvidence that journeys and templates are tested before release, with failures blocked from deploymentResults from the Dittofeed testing SDK run in your CI pipeline, retained with the build that deployed them
Backup and restore recordsProof that subscriber data, journey definitions and PostgreSQL databases can be restored, and how often restores are testedBackup job logs, restore test reports and the recovery steps for the PostgreSQL database behind listmonk and Dittofeed
Hosting environment control descriptionsA description of the controls over the infrastructure that holds user data, such as availability, change management and incident responseSOC 2 control descriptions from the cloud or data center provider, and your own control mapping for the self-hosted layer
Data location and retentionWhere personal data sits, how long event data and sent messages are kept, and how erasure requests reach every copyYour VPC or data center configuration, retention settings in the stack, and the deletion procedure for backups and third-party processors

What a self-hosted lifecycle messaging implementation costs and needs

What drives the effort of a self-hosted lifecycle messaging implementation?

Effort is driven mostly by the number of event sources, the number of journeys, and the channels in scope. Each event that starts a journey needs a defined schema, a path from your product into Dittofeed (through Segment, reverse ETL or the Dittofeed API), and a test. Each channel adds its own work: email needs a sending service integration, push and SMS need provider credentials and consent handling, and each template needs review. Data quality matters as much as volume. If user traits are inconsistent across services, segmentation work grows quickly. Ask any partner to break the estimate into event mapping, journey design, channel integration, template build, testing and hosting, so you can see which line moves when scope changes.

Can a SaaS team build self-hosted lifecycle messaging with its own engineers?

Often yes, if the team already runs containers, manages a PostgreSQL database and owns its email sending domain. Dittofeed is MIT licensed and describes itself as free forever, so the software licence itself carries no fee. The cost is the engineering time to deploy, integrate, secure, back up and upgrade it, plus the sending service you choose. listmonk is licensed under the AGPL v3 license, which carries its own obligations if you modify and distribute it, so have legal review that before you customize it. Build internally when the team has capacity and the messaging logic stays close to the product. Bring in a partner when deadlines, compliance evidence or a shortage of platform engineers make internal delivery slower than the business needs.

How long does a self-hosted lifecycle messaging rollout take?

The duration depends on how many events feed journeys, how many channels go live at launch and how clean the user data is. A first rollout usually covers one or two journeys over email, with push or SMS added later. Each additional channel or journey adds integration, template and test cycles. No researched timeline is available for this combination, so ask any implementation partner for a schedule tied to a written scope, with milestones for event instrumentation, sending domain setup, testing in CI and a controlled launch to a small audience before full traffic. Treat any duration quoted without a list of events and channels as unverified.

What does the work need from product, data and security teams?

Product owns the lifecycle map: which moments trigger messages, what each message is for and when a user should stop receiving them. Data owns the user traits, event names and segment definitions that Dittofeed uses, and must confirm where personal data flows in the reverse ETL or API path. Security owns the hosting decisions: whether Dittofeed runs in your own VPC, how secrets for sending services are stored, who can publish templates and how access is reviewed. Legal or privacy staff should confirm consent basis and retention for each message type. Naming one accountable owner from each team before the scope is signed usually prevents the most common delays.

What does the self-hosted lifecycle messaging platform cost after go-live?

Recurring costs fall into four groups: infrastructure for the messaging platform and its database, sending service fees from your email, SMS or push providers, internal staff time for upgrades and journey changes, and any support or retainer agreement. The software licence does not recur for Dittofeed or listmonk. Dittofeed says self-hosting avoids volume-based pricing, so sending service fees and infrastructure become the main variable costs as volume grows. Dittofeed's recent GitHub releases are pre-release tags, with v0.24.0-alpha.21 published on October 4, 2026, so plan upgrade testing as a recurring task. Ask any partner which upgrades, security patches and monitoring are included in a retainer and which are billed separately.

Does the EU Data Act affect switching costs for a hosted messaging platform?

Yes, if the platform is a data processing service and you are an EU customer. The EU Data Act requires providers to let customers switch to another provider or to on-premises infrastructure, and from 12 January 2027 providers may not impose any switching charges. Until then, reduced charges may not exceed the costs directly linked to switching. This matters when you compare a SaaS messaging tool with a self-hosted platform, because contract terms on exit and data export affect total cost. Confirm with your legal team whether your provider falls within scope and what your contract says about export formats and notice periods.

What do you need to ask an implementation partner about cost?

Ask for a written, fixed scope that lists event sources, journeys, channels, templates, integrations, environments and handover documents. Ask which items are one-time work and which recur, such as hosting, upgrades, monitoring and support. Ask what the partner needs from your team and what assumptions the price depends on, especially data quality and the number of stakeholder reviews. DeployOpen does not publish a price list. Most engagements are fixed-scope and agreed in writing before work starts, so a quote follows from the scope you define. Ask for the exit terms too, including handover of configuration, source code and runbooks.

Questions to put to an implementation partner before signing

Start with the event schema, because it decides whether Dittofeed journeys fire correctly at all. Ask the partner to show, in writing, how each product event (signup, trial start, feature first use, plan change, cancellation) maps to a Dittofeed user trait or event, whether the data arrives through Segment, reverse ETL or the Dittofeed API, and who owns the mapping when your product team renames a field. Ask which Dittofeed version is pinned in the deliverables. Dittofeed's recent GitHub releases are pre-release tags (v0.24.0-alpha.21 was published on October 4, 2026), so ask how the partner will test upgrades, what happens when a pre-release changes a journey or API behavior, and whether a rollback path is part of the fixed scope. Confirm the current release status on the Dittofeed GitHub releases page before the contract is drafted.

Next, ask how the sending service is connected and authenticated. Dittofeed integrates with providers such as SendGrid and Amazon SES rather than sending mail itself, so the partner should name the provider, the credential type, where secrets are stored, how keys are rotated, and which sending domain, SPF, DKIM and DMARC records they will set and verify. Ask how bounce and complaint events return to Dittofeed and suppress future sends. For git-based template workflows, ask who creates the branch model, how email templates in git are reviewed and merged, and whether the testing SDK checks campaigns in your CI pipeline. Ask for the pipeline definition and a sample failing test, not only a description.

Finally, ask what evidence is handed over and how the scope ends. For SOC 2 readiness, request the list of controls the partner configures (access reviews, change logs for journeys, secret management, backup and restore tests) and the format of each artifact, and confirm that the partner prepares evidence without issuing an attestation, which only an independent auditor can do. Ask for the written export and switching procedure, including how journeys, segments, templates and consent records are exported, and whether that is tested. Last, make sure the fixed scope lists deliverables and acceptance criteria, and that any post-go-live support retainer states response expectations, upgrade handling and what is excluded.

Where SaaS lifecycle messaging builds usually go wrong

Lifecycle messaging fails in predictable places: the sending domain, the user data feeding the journeys, the testing and release path, and the consent records behind each channel. Each card names one of these risks and the check that catches it before customers see the problem.

Unauthenticated sending domains

Dittofeed hands message delivery to an email service provider such as SendGrid or Amazon SES, so the sending domain's authentication is set outside Dittofeed and is easy to leave incomplete. Onboarding and product emails sent from a domain without aligned SPF and DKIM, and without a DMARC policy, can land in spam even when the journey logic is correct. Confirm authentication records for every sending subdomain and check placement with seed accounts before the first journey goes live.

User identifiers drifting from the product

Journeys in Dittofeed depend on user traits and events arriving from the product through Segment, reverse ETL or the Dittofeed API. When the product renames an event or changes how a user ID is generated, segments quietly stop matching and users receive the wrong messages or none at all. Agree one identifier and an event schema with the product team, and monitor for events that stop arriving.

Untested journeys reaching production

A journey that branches on plan, trial end or feature usage can send the wrong message to thousands of users in minutes. Dittofeed's testing SDK lets teams check campaigns in CI, but only if the tests run on every change to templates and journey logic. Ask who approves a journey before activation and whether the test suite covers branches, suppressions and send limits.

Push and SMS consent stored separately

Email consent is often the only consent record a team keeps, while push permission lives in the mobile app and SMS opt-in lives in a messaging vendor. When these records are not joined, a user who withdrew SMS consent can still receive texts from a journey. Store each channel's consent and its source in the same user profile that Dittofeed reads, and make suppression apply across channels.

Pre-release software in production

Dittofeed's recent GitHub releases are pre-release tags, with v0.24.0-alpha.21 published on October 4, 2026. A pre-release can change database schema, configuration keys or template behavior between versions, which is a risk for a system that sends customer messages. Confirm which release line the team runs, pin the version, and agree in writing how upgrades are tested before they reach production.

No tested rollback or switching path

Lifecycle messaging is tightly coupled to product data, so a failed upgrade or a bad journey can be hard to reverse. Teams often back up the database but never restore it or test a journey rollback. Define a rollback procedure for journeys and templates, rehearse a restore on a non-production copy, and document how the message history and consent records would move if the team changed platforms.

What changes for your team after go-live

After go-live, the platform becomes a service your team runs, not a project that closes. For a self-hosted Dittofeed deployment, the first recurring decision is which release line to follow. Dittofeed's recent GitHub releases are pre-release tags, with v0.24.0-alpha.21 published on October 4, 2026, so a team running it in production should decide explicitly whether it accepts pre-release builds, tests each upgrade in a staging copy of the Postgres database and the Docker Compose or Helm deployment, and records who approves each move. Confirm with your implementation partner how the Dittofeed API, segment inputs and channel integrations are checked after every upgrade, because an upgrade can change behavior that journeys depend on. The same discipline applies to listmonk, where v6.2.0 was published on June 26, 2026, and where the AGPL v3 license also carries obligations to confirm with counsel if you modify the code.

Monitoring is where lifecycle programs most often fail quietly. A journey that stops firing or a webhook to your SMS or push messenger that starts returning errors can look normal from the product side for weeks. Set up alerts on delivery outcomes from your sending service, bounce and complaint rates, journey error states, and the HTTP webhook responses that listmonk messengers use for SMS, WhatsApp and FCM push. Assign an owner for each alert and a response path, and decide who can pause a live journey and under what conditions.

Template change control is the control most teams underestimate. Dittofeed supports email templates kept in git, branch-based workflows for campaign version control, and a testing SDK for checking campaigns in CI, so template edits can go through the same review and merge process as application code. Agree on who may approve a change to a transactional template, how a rollback is performed, and how the testing SDK checks run before merge. Staff time is the cost that recurs most: plan for named people who own upgrades, monitoring and template review, and ask any partner to state in the written scope which of these tasks it performs and which remain with your team.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.