The engineering bottleneck with assembled stacks
Product teams send mail and chat notices from wherever the event happened to occur in code, so the notification logic for one event ends up copied across handlers, each copy drifting: one sends the old template, one forgets the chat copy, and one mails the customer twice when the handler retries. The customer experiences the architecture directly, in their inbox, twice.
Architecture on the Software Lifecycle Cloud
Producers emit an event — kind, subject, template data — and start the notification workflow. Steps fan out per channel: the email worker renders the project’s template, the conversation step posts to the bound topic (mirrored to Telegram or WhatsApp where bound), and each outcome writes a receipt row. Preferences are recipient rows: channels a user muted are skipped by the step that would send, with the skip recorded too.
Receipts end the argument
Every channel attempt leaves a receipt — sent, bounced, skipped-by-preference, failed with the provider’s words. Support stops asking engineering to check the mail vendor’s console, because the answer lives in the same project as the order that triggered it. Template changes are code changes with review dates, so “which wording did customers get in March” is a git question.
- One event, one workflow run: all channels for an order share a single inspectable history
- Muted channels record a skip receipt, distinguishing “we chose not to” from “it broke”
- Templates live with the code; wording changes are reviewed diffs, not vendor-console edits
Channels the platform does not pretend to be
Email delivery itself runs through your sending provider called from the worker — deliverability, domains, and suppression lists remain that provider’s craft. What the project owns is the orchestration and the evidence: which events produced which sends, for whom, with what result.
Frequently asked questions
As project files rendered by the sending worker, versioned with the code. A wording change is a reviewed diff with a date, and receipts tie each send to the run that produced it — so template history is auditable, not archaeological.
Yes. Preferences are recipient rows consulted per channel step: email can be muted while chat continues, and the skipped channel records a skip receipt so nobody mistakes preference for failure.
The receipt row: event, channel, recipient, provider response, timestamp. It is written by the sending step in the same table family as the triggering data, so support answers from the project, not from a vendor console.
Related capabilities, architectures, and comparisons
Ship your stack on the Software Lifecycle Cloud.
Closed preview on dedicated European infrastructure. Bring a repository or start from a blueprint.