Email delivery first
Django's default email backend uses whatever the server provides, which frequently means messages sent without proper authentication and discarded by recipient providers without a bounce.
The application logs a success, the user is told it was sent, and nothing arrives. It is the most expensive silent failure in business applications.
Getting delivery right
- Authenticated SMTP or a transactional service
- Send from a domain you control with correct authentication records
- Queue every send, so a provider outage does not break the request
- Log every send with its outcome
- Handle bounces rather than ignoring them
Notify only who must act
- The person who has to do something next
- Not everyone with an interest
- Not on every state change, only the meaningful ones
- With a clear statement of what is required
- And a direct link to the thing
Notifying everybody about everything produces a channel people mute, at which point the important notification is missed too.
Let people control it
| Setting | Why |
|---|---|
| Per notification type | Different people care about different things |
| Digest option | Reduces volume without losing information |
| Per channel | Email, in-app, or both |
| Honoured immediately | Otherwise people stop trusting it |
Test the templates properly
Email rendering varies enormously between clients. Test the actual templates in the clients your users have, not just in a browser.
And check the plain text alternative, which is what some clients and most accessibility tools will use.