Email loops
Persist first, notify second. Ack on submit; status mail when a followed feature moves.
Ack email
Triggered when POST /v1/feedback includes an email. Subject pattern: Idea received — {project}.
Status change
Triggered by PATCH /v1/features/:id/status for each follower. Portal URL points at /feature/view/?slug=…. Shipped copy leans on the product line: You asked. We built it.
Delivery path
- Row written to email outbox in the store
- If
FEEDBACK_QUEUEis bound → Queue message → consumer sends via Resend - Else
executionCtx.waitUntil(sendEmail…) - Without
RESEND_API_KEY, send is mocked and outbox stays inspectable
Note
Package: @openroadmap/email. Templates are HTML + text for deliverability.