Communication — End-user view
This is the part of the system users feel most directly: they receive emails, push messages, and in-app messages. Below are familiar experiences and what sits behind them.
1. Receiving messages through multiple channels
"I receive a booking-confirmation email and also see a notification in the app."
One event can send through multiple channels at the same time: email, push, SMS, in-app. Each recipient / each channel is a separate OutgoingMessage record, so the system knows exactly "has the email arrived?", "has the push arrived?" for each person.
2. Content fills in the right information
"The email uses my name, the right booking code, and the right date."
Message content is based on a template with placeholders such as {{TÊN}}, {{MÃ_BOOKING}}. At send time, the system fills real data into the template. This lets each recipient receive personalized content without manual copywriting.
3. No duplicate messages
"The system seems to process my order again, but I only receive one email."
Before sending for real, the system claims each message. If a message is already "sending/sent", repeat processing exits without calling the provider again. Result: users do not receive double emails.
4. In-app inbox
"I open the app and see my notifications; parents see messages grouped for their children."
In-app messages are stored as UserMessage — one row per recipient. Parents can see a combined inbox of notifications related to their children.
5. Campaigns & recurring reports
"The center sends a holiday notice to all parents." / "I receive a report every week."
- Campaign: bulk send to many recipients at once.
- Report subscription: automated report on a schedule.
Both use MessagingJob + Blob to handle large data, then pass through the same send pipeline.
Summary for end-users
| Experience | Powered by |
|---|---|
| Receive messages by email/push/SMS/in-app | Multiple OutgoingMessage / UserMessage records by channel |
| Content has the correct name and data | Template + render in Generator |
| No duplicate messages | Claim before send (send claim) |
| In-app inbox, grouped for parents | UserMessage partitioned by recipient |
| Bulk notice / report delivery | Campaign / Report subscription |
Want the mechanism underneath? Read Core concepts.