The reminder engine is a cron job that runs at 9am UTC every day. It queries every invoice that’s past due, cross-references the per-invoice override flags (paused, delayed, skipped types), and fires the appropriate reminder based on how many days past due the invoice is. Nothing fires before the due date. Nothing fires for a paid invoice. Nothing fires for an invoice you’ve paused.
On the dashboard, the Upcoming Reminders widget shows the next five reminders queued to send, with inline controls to delay (by days or to a specific date), skip a specific reminder type (DAY_1, DAY_7, DAY_14, DAY_30), or resume a paused invoice. The full /dashboard/reminders agenda view groups everything by Today, Tomorrow, and This Week, with a separate tab for the sent-history feed. You always know what’s scheduled and what’s already gone out.
The pre-reminder digest is a second cron that runs at 6pm UTC the evening before any reminder is queued for the next morning. It emails you a summary of every reminder going out tomorrow, with a one-click “mark as paid” magic link per invoice. No login. If a check arrived in the mail today and you forgot to update the system, the digest catches it. If you do nothing, the reminders go out as planned. False positives become vanishingly rare.
Templates live in your settings. Each reminder day has its own editable copy with {{client_name}}, {{invoice_number}}, {{amount}}, and {{due_date}} placeholders. Plain text editor, no HTML, no Liquid, no merge-field syntax. You write it once and it sends forever.