# Notification Matrix (Sprint 2)

| Trigger | Type | Channel |
|---------|------|---------|
| Project overdue | `project_overdue` | In-app, email (existing) |
| Sprint overdue | `sprint_overdue` | In-app, email |
| Work item overdue | `project_ticket_overdue` | In-app, email |
| Sprint starts tomorrow | `sprint_started` | In-app, email |
| Sprint starts today | `sprint_started` | In-app, email |
| Sprint ends tomorrow | `sprint_overdue` (title variant) | In-app, email |
| Milestone due tomorrow | `project_milestone_due` | In-app, email |
| Milestone overdue | `project_milestone_overdue` | In-app, email |
| Capacity exceeded | `sprint_capacity_exceeded` | In-app, email + realtime event |
| Sprint health at risk / critical | `project_health_critical` | In-app, email |
| Project health critical | `project_health_critical` | In-app, email |

Scheduled via `MonitorProjectDueDatesJob` (every 15 minutes) calling `ProjectOverdueService` and `AgileNotificationMonitorService`.

Dedupe keys stored in `project_due_events`.
