send_email binding handles delivery
directly from the worker.| Email kind | Trigger | Contains |
| Submission confirmation | Speaker submits a talk | Talk title, event name, portal link |
| Decision: accepted | Organizer notifies from Accept Queue | Congratulations, next steps, portal link |
| Decision: declined | Organizer notifies from Decline Queue | Thank you message, event info |
| Task assigned | Talk accepted (auto-created tasks) | Task name, due date, portal link |
| Task reminder | Approaching due date (cron) | Task name, days remaining, portal link |
| Schedule invite | Session placed on agenda | ICS calendar attachment |
| Schedule update | Session moved on agenda | Updated ICS with bumped sequence |
| Schedule cancel | Session removed from agenda | ICS cancellation |
| Draft reminder | Incomplete CFP submission approaching close | Form link, days remaining |
notifications@opensession.dev, but the Reply-To header
is set to the event's contact email (the organizer's email by default, editable in
Settings). When a speaker hits reply, the message goes directly to the organizer.┌─────────────────────┐ ┌─────────────────────┐ │ OpenSession sends │ │ Speaker receives │ │ from: notifications│──────────────>│ email with ICS │ │ reply-to: organizer│ │ attachment │ └─────────────────────┘ └──────────┬──────────┘ │ │ Speaker replies v ┌─────────────────────┐ │ Reply goes to │ │ organizer@event.com│ └─────────────────────┘
session-{id}@opensession.dev) so calendar apps recognize updatesdecision:{sessionId}:{speakerId}). Sending the same notification twice is impossible.
| Reminder | When it fires |
| Task due in 3 days | 3 days before the task's due date |
| Task due tomorrow | 1 day before the task's due date |
| Task overdue | After the due date passes |
| Draft reminder (3 days) | 3 days before the CFP form closes |
| Draft reminder (1 day) | 1 day before the CFP form closes |