Customer email gallery

Every transactional email Sebenza sends, rendered with sample data and labelled with the moment that triggers it. Built because a template is invisible until something fires it in production — which is how three of these went unsent without anyone noticing.

18Templates
6Stages
01

Onboarding

2

Welcome to Sebenza System!

Signs up — fires immediately on registration, before email verification.

welcome api/auth/[action].ts (register)

Registration Complete — Welcome to Sebenza!

Clicks the verification link in their inbox. Distinct from welcome — this confirms the account is fully set up.

registrationComplete api/auth/[action].ts (verify_email)
02

Billing

4

You're live on Sebenza — payment received

THE BIG ONE — a trial converts to paid. First successful subscription charge.

subscriptionActivated api/webhooks/paystack.ts → _lib/platform-payment-email.ts

Payment received — ZAR 100.00

Any add-on purchase clears: seats, storage, Premium AI / Workflows / Payroll, annual switch.

platformPaymentReceived api/webhooks/paystack.ts → _lib/platform-payment-email.ts

Sebenza payment processed — ZAR 300.00

Monthly renewal charged successfully against the saved card.

recurringChargeSucceeded api/billing-cron.ts (charge-recurring)

Payment Received — Thank You!

A frozen account settles what it owes and is automatically restored.

paymentConfirmation api/webhooks/paystack.ts (auto-unfreeze branch)
03

Dunning

5

Invoice Reminder — Payment due in 3 days

An unpaid invoice is approaching its due date.

invoiceReminder api/billing-cron.ts (invoice reminders)

Your Sebenza trial has ended

Trial period expired without a payment method on file.

trialEnded api/billing-cron.ts (check-trials)

Action needed — Sebenza payment failed (attempt 1)

A renewal charge was declined. Retry cadence is 3 / 7 / 14 days.

recurringChargeFailed api/billing-cron.ts (charge-recurring, failure branch)

Sebenza account suspended — payment required

Fourth consecutive failed renewal — the account is frozen.

recurringChargeFrozen api/billing-cron.ts (charge-recurring, freeze branch)

Account Frozen — Payment Required

Frozen for an overdue invoice (separate path from a failed card).

accountFrozen api/billing-cron.ts (check-overdue)
04

Plan changes

3

Downgrade scheduled — drops to 3 seats on 2026-08-31

Owner reduces team size — takes effect at the next cycle date.

downgradeScheduled api/subscriptions.ts (set_seats, decrease)

Reminder: 2 users will lose access on 2026-08-31

Warning ahead of a scheduled downgrade taking effect.

downgradeReminder api/billing-cron.ts (downgrade reminders)

Team size reduced to 3 seats

The scheduled downgrade has now been applied and seats deactivated.

downgradeApplied api/billing-cron.ts (apply-downgrades)
05

Support

2

Ticket TKT-M4X9K2 — We received your support

A client raises a support ticket — acknowledgement to the client.

ticketCreated api/tickets.ts (POST)

Ticket TKT-M4X9K2 Resolved

That ticket is marked resolved.

ticketResolved api/tickets.ts (PUT, status=resolved)
06

Engagement

2

How are you enjoying Sebenza?

Mid-trial nudge while days remain.

trialCheckIn api/billing-cron.ts (trial check-ins)

Checking in — How's Sebenza working for you?

Periodic relationship check-in with an active customer.

biMonthlyCheckIn api/billing-cron.ts (bi-monthly check-in)