Architecture
System map
The API saves the notification and its outbox record together in PostgreSQL. The relay moves work to Redis; the worker processes each delivery. PostgreSQL remains the source of truth if queue processing is temporarily interrupted.
An HTTP 202 Accepted response means the request was accepted. External delivery happens asynchronously; it does not mean the recipient has received or read the message.
Credential boundaries
The API key stays on your backend. The backend derives the account and user IDs from its authenticated session. A frontend-supplied account ID alone is not proof of membership.
Data mapping
| Your application | Notify |
|---|---|
| Organization owning your integration | Notify tenant |
| Product deployed in staging | Application in staging |
| Product deployed in production | Separate application in production |
| Customer organization or workspace ID | Customer account external_key, then request account_key |
| User ID inside that customer organization | recipient.external_user_id or token recipient_external_id |
| Business event name | event_key |
| Stable event/transaction ID plus event type | Idempotency-Key |
| Message content | Published template and variables, or explicitly permitted raw content |
Runtime deployment
The standard Docker stack has five long-running services: API, relay, worker, PostgreSQL, and Redis. A migration service runs once and exits. Docusaurus and Swagger are static assets served by the existing API container through the documentation domain. Node is used only to build the documentation.
Read Environment and URLs for public entry points and Implementation guide for the application-side work.