Invoice and receipt emails — payment data in the payload, template outside your code

Invoice created, payment received, plan changed — each fires a billing event. else.events renders the right receipt or invoice email with all payment details from the payload.

Why billing email templates are painful to maintain

Invoice data is complex and changes per transaction

Plan name, amount, currency, tax, invoice number, billing period — each field must be rendered correctly from the transaction.

Different billing events need different emails

Invoice created, payment successful, plan upgraded, refund issued — each needs a distinct email with appropriate copy.

PDF invoice links must be personalised

A generic "view invoice" link is not useful. The link must be per-invoice, often with a signed URL.

Tax and locale requirements add complexity

EU customers may need VAT information. Formatting currency and dates correctly per locale is custom logic.

Billing event fires → receipt or invoice email delivers automatically

Separate event types for each billing scenario

invoice.created, invoice.paid, subscription.plan_upgraded — each routes to the appropriate template.

All invoice fields in the payload

Include amount, currency, plan, invoice_number and invoice_url. The template renders them without application-side rendering.

Locale-aware formatting

Include the user locale. Rules route to locale-specific templates that format dates and currency correctly.

Edit receipt copy without a deploy

Update the payment confirmation email copy in the else.events UI — no code change, no release.

Template variables for invoice and receipt emails

  • {{ user.name }} Customer display name
  • {{ data.plan }} Plan name at time of invoice
  • {{ data.amount }} Invoice total with currency
  • {{ data.invoice_number }} Human-readable invoice reference
  • {{ data.invoice_url }} Personalised link to view or download the invoice
  • {{ data.billing_period }} Billing period covered by the invoice

Frequently asked questions

How do I include the invoice PDF link?
Generate the signed invoice URL in your backend and include it in the event payload data as invoice_url. The template renders it as the CTA link.
Can I send different emails for invoice created vs payment received?
Yes. Use distinct event types (e.g. invoice.created vs invoice.paid). Each routes to its own template with appropriate copy.
Do invoice emails need to include VAT information?
Include VAT amount and registration number in the event payload if required. The template can render them conditionally.
Can I send receipt emails in the customer's language?
Yes. Include a locale field in the event payload. Rules route to the correct language template automatically.

Invoice and receipt emails — from billing events, not code

Fire the billing event. else.events renders the right email with all payment details.

  • Free during public beta
  • All invoice fields from payload
  • Locale-aware formatting