Notifications catalog
Curated index of every email template the platform sends. The list is loaded from packages/notifications/src/templates/ at build time.
| Template | Product | Recipient | Purpose | Trigger |
|---|---|---|---|---|
cycle-request | Payroll | Client contact | Initial monthly request for client to start the intake | cycle-initiate worker job (hourly cron, per-client 09:00 local) |
reminder | Shared | Either | Generic reminder for an outstanding action | send-reminder worker job |
approval-request | Payroll | Client contact | Ask the client approver to sign off on the cycle | send-approval-request worker job, after exec marks ready |
client-action-request | Payroll | Client contact | Ad-hoc data/document request from staff to a client contact | send-client-action-request worker job |
bookkeeping-batch-ready | Bookkeeping | Staff user | A journal batch is ready for senior accountant review | classify-and-draft worker job at batch boundary |
bookkeeping-upload-file | Bookkeeping | Staff user | Upload file is ready to download and post into the accounting platform | generate-upload-file worker job |
reconciliation-magic-link | Bookkeeping | Client contact | Magic link for client to respond to unreconciled items | reconciliation dispatch action |
reconciliation-client-response | Bookkeeping | Staff user | Notify staff that a client has responded in the portal | process-client-response worker job |
reconciliation-complete | Bookkeeping | Staff user | Final reconciliation report is ready | generate-reconciliation-report worker job |
How to debug a missing email
- Open the Outbox page (
/dashboard/outbox) and find the related event. - If the event isn't there, the trigger never fired — check the Audit tab for the cycle / batch / run.
- If the event is there but the email didn't land, check the SMTP adapter (in dev: Mailpit at
localhost:8025). - For magic-link emails, the recipient sees a 48h-expiring URL. Resending re-mints a new token.
See also Outbox stuck runbook.