Multiple dunning scenarios require multiple templates
First attempt, second attempt, final notice — each needs a different tone, CTA and urgency level.
High-impact SaaS email
A failed payment event from your billing provider should trigger the right email automatically. No custom dunning service, no brittle retry logic, no hardcoded templates.
First attempt, second attempt, final notice — each needs a different tone, CTA and urgency level.
A Free-tier user getting a payment failed email is unusual. A Pro-tier user needs a different CTA than an Enterprise customer.
When to send the first reminder, when to follow up, when to warn about cancellation — this logic ends up in your application or a custom job.
The "update payment method" URL must be per-user or per-session to be useful. Generic links hurt conversion.
Your billing provider (Stripe, Paddle, LemonSqueezy) fires a webhook. You forward it as an event to else.events.
First attempt vs final notice, Pro vs Enterprise, English vs German — rules select the correct template automatically.
Include the payment update URL in the event payload. The template renders it directly — no generic link.
Every invoice.payment_failed event and its resulting email delivery logged together. Useful for support and compliance.
// stripe webhook → else.events event
{
"type": "invoice.payment_failed",
"user": { "email": "customer@example.com", "name": "Alex" },
"data": {
"plan": "Pro",
"attempt_number": 1,
"amount": "29.00",
"currency": "EUR",
"update_payment_url": "https://app.example.com/billing/update?token=abc123",
"next_attempt_at": "2026-06-01T10:00:00Z"
}
} else.events matches the rule for plan = Pro and attempt_number = 1, renders the first-attempt dunning template and delivers it through your provider.
{{ user.name }} Recipient display name for personalisation {{ data.amount }} Invoice amount with currency {{ data.plan }} Plan tier — affects tone and CTA copy {{ data.update_payment_url }} Personalised link to update payment method {{ data.attempt_number }} Payment attempt count — used to escalate urgency {{ data.next_attempt_at }} Next retry date, rendered in the email Fire invoice.payment_failed. else.events routes the dunning email. No custom logic required.