High
Failed enqueue marks reminder as processed too early
Illustrative reference: services/reminders/scheduleRetry.ts:84-111
The refactor updates last_attempted_at before the queue publish resolves. If the publish call fails, the scheduler will skip the invoice on the next sweep because it looks already attempted.
Behavioral impact: A transient queue outage can silently suppress all future reminders for affected invoices.
Medium
Timezone normalization changed without migration note
Illustrative reference: lib/billing/reminderWindow.ts:14-39
The new logic schedules in tenant-local midnight instead of UTC midnight, but existing reminder timestamps are still persisted in UTC without a recalculation path.
Behavioral impact: Some reminders may move a day earlier or later immediately after deploy for non-US tenants.
Medium
Retry cap no longer distinguishes hard bounce vs temporary delivery error
Illustrative reference: workers/reminders/processReminderAttempt.ts:52-96
All failures increment the same retry counter. Previously, hard-bounced addresses were disabled immediately while soft failures could retry.
Behavioral impact: The system may spend unnecessary retry budget on known-undeliverable addresses.
Low
New event name is more generic than existing analytics taxonomy
Illustrative reference: analytics/events.ts:122-130
invoice_reminder_attempted became notification_attempted without a companion dimension for type.
Behavioral impact: The metrics dashboard will become harder to segment unless downstream queries are updated.