Deferred by decision — recorded as a future item
lib/email/ exists and works, but is wired only to the Neon Auth OTP webhook (app/api/auth/webhook/route.ts). The product sends no domain email at all — nothing on submission, status change, acceptance, rejection, withdrawal, manager assignment or deactivation.
An applicant learns they were accepted only by logging in and re-reading a status badge. This is arguably the largest single gap between what the product does and what a user would expect from a recruiting platform.
Scope when picked up
- Which events notify, and whom
- Applicant-facing: submission receipt, status change, final decision
- Manager-facing: a new application on a managed position
- Opt-out handling
- Delivery-failure behaviour — a failed send must never fail the underlying mutation. The existing webhook gets this right by throwing and letting Neon retry, with no DB write entangled; domain email needs the opposite treatment, since the mutation has already happened
Notes
The infrastructure is in place (Resend, templates, verify-webhook), so this is mostly product decisions plus wiring rather than new plumbing.
From the 2026-08-10 full platform audit.
Deferred by decision — recorded as a future item
lib/email/exists and works, but is wired only to the Neon Auth OTP webhook (app/api/auth/webhook/route.ts). The product sends no domain email at all — nothing on submission, status change, acceptance, rejection, withdrawal, manager assignment or deactivation.An applicant learns they were accepted only by logging in and re-reading a status badge. This is arguably the largest single gap between what the product does and what a user would expect from a recruiting platform.
Scope when picked up
Notes
The infrastructure is in place (Resend, templates,
verify-webhook), so this is mostly product decisions plus wiring rather than new plumbing.From the 2026-08-10 full platform audit.