No expiry time shown in the email
If the reset link expires in 1 hour, say so in the email. Users who open the email later are less confused and less likely to contact support.
SaaS email template
The password reset email is a trust-critical moment. Clear CTA, visible expiry, consistent branding. Fire it from user.password_reset_requested and manage the template outside your codebase.
If the reset link expires in 1 hour, say so in the email. Users who open the email later are less confused and less likely to contact support.
A password reset email from "noreply@company.com" with no visible app name looks like phishing. Use a consistent sender identity with your app name.
The reset token must be unique per request. Include the full reset URL in the event payload — not hardcoded in the template.
A password reset email that looks different from other product emails breaks trust and looks suspicious.
Generate the reset token in your backend. Include the full reset URL in the event payload. The template renders it as a CTA button.
Include the expiry timestamp in the payload. The template renders "This link expires in 1 hour" or "Expires at 15:30 UTC" — clear and useful.
Password reset emails use the same MJML template base and brand variables as your other emails. No phishing-like inconsistency.
The template lives in else.events. Update copy — "Did not request this? Contact us" — without a deployment.
// user.password_reset_requested event payload
{
"type": "user.password_reset_requested",
"user": { "email": "user@example.com", "name": "Alex" },
"data": {
"reset_url": "https://app.example.com/reset?token=abc123",
"expires_at": "2026-05-25T16:00:00Z",
"app_name": "ExampleApp"
}
} The reset URL with the unique token is generated in your backend and included in the payload. else.events renders it directly into the template — no token logic in the email system.
{{ user.name }} Recipient name for the greeting {{ user.email }} The email address for the account being reset {{ data.reset_url }} Personalised, time-limited password reset link {{ data.expires_at }} Reset link expiry time — shown in the email body {{ data.app_name }} App name for the email subject and sender context Secure token from your backend, clear expiry in the email, consistent branding. Managed outside your codebase.