Appearance
Reporting and email
This section documents the recurring report emails Avoca sends and the shared infrastructure they ride on. Scope here is the responder daily report family: the per-team daily that ships today, and the enterprise-rollup variant currently mid-ship for EAS. Other email surfaces (Coach Alerts, Capacity Notifications, transactional invites, Web Chat handoffs) are out of scope until they become load-bearing for an FDE workstream.
Surfaces
| Surface | Audience | Cadence | Status | Doc |
|---|---|---|---|---|
| Per-team responder daily | Per-team email list (coach_config.email_recipients) | Daily 4 AM ET, per-team timezone delivery | In production | Per-team daily responder report |
| EAS enterprise weekly | EAS leadership (env-var recipients) | Weekly Mon 9 AM ET; validation-period test loop every 5 min, env-gated | Code complete; awaiting PR + Vercel deploy | EAS enterprise weekly report |
Shared infrastructure
Both surfaces ride the same five-stage pipeline: a daily Inngest cron in apps/web/lib/inngest/functions/coach-report-schedule.ts fans out per-recipient-group Inngest events; per-event handlers in apps/web/app/api/inngest/route.ts wait until each recipient's local delivery time, then call a build-and-send function in apps/web/lib/email/ that pulls metrics from calls, renders a @react-email/components template under apps/web/emails/, and ships through Resend.
See Shared architecture for the full sequence diagram, the prod-only cron gate, and the recipient-storage patterns.
Conventions used in this section
- Comp pattern. Each report doc has a "comp" section showing the existing surface it mirrors. The enterprise report is structurally a copy of the per-team report with the SQL aggregated and the template branded; the comp section makes that obvious.
- Status banner. Frontmatter
status:is the source of truth for what's in prod vs in flight. Update when the surface changes state, not when the doc gets edited. - Sequence diagrams. Use Mermaid
sequenceDiagram. Show the cron, the handler, the build/send function, the metrics query, the template, and Resend as separate participants. Hide infrastructure that doesn't change between surfaces (Vercel, Inngest dashboard).