Serve Stats
Billing
Subscription ManagementServe Stats and Burnout Detection
ServeThe Serve module runs several background jobs to keep volunteer statistics current and protect volunteers from burnout. These jobs feed the Serve dashboard, volunteer profiles, and team leader notifications.
Job Schedule
| Field | Type | Description |
|---|---|---|
| Serve Stats Recalculation | Daily, 2am | Recomputes serve counts, confirmation rates, and estimated hours for every active team member across all tenants. |
| Burnout Scan | Monday, 1am | Identifies volunteers serving significantly more than their team average. Sends burnout alert notifications to team leaders. |
| Escalation Check | Every 6 hours | Finds volunteer confirmation requests that have timed out and auto-assigns the slot to the next available candidate. |
| Re-confirmation | Daily, 10am | Sends "Still coming?" reminder emails to confirmed volunteers whose service is within the next 24-48 hours. |
Serve Stats Recalculation
This nightly job uses a single SQL aggregation query (no N+1 queries) to compute statistics for all active team members in a tenant. The following metrics are calculated:
| Field | Type | Description |
|---|---|---|
| Serve Count (90 days) | Integer | Number of confirmed serve slots in the last 90 days. |
| Serve Count (YTD) | Integer | Number of confirmed serve slots in the current calendar year. |
| Serve Count (All Time) | Integer | Total confirmed serve slots ever. |
| Estimated Hours (90 days) | Decimal | Estimated volunteer hours in the last 90 days (serve count x 2 hours per service). |
| Confirm Rate | Decimal | Ratio of responses given to total confirmation requests. Higher rates indicate more reliable volunteers. |
| Last Served At | Timestamp | Date of the most recent confirmed service. |
| First Served At | Timestamp | Date of the earliest confirmed service. |
Burnout Scan
Every Monday at 1am (tenant local time), the burnout scanner evaluates each active team and compares individual serve counts against the team average:
- For each team, calculate the average 90-day serve count across all members
- Flag any member whose 90-day count exceeds the average by the configured threshold multiplier (default: 2x)
- Create or update a
BurnoutAlertrecord for flagged volunteers - Send an in-app notification to the team leader with the volunteer's name, their serve count, and the team average
Configuration
| Field | Type | Description |
|---|---|---|
| Burnout Threshold Multiplier | Decimal | A volunteer is flagged when their 90-day serve count exceeds (team average x multiplier). Configured via Tenant Configuration (serveBurnoutThresholdMultiplier). Default: 2.0. |
Escalation Check
Every 6 hours, the escalation job looks for volunteer confirmation requests that have gone unanswered past the configured timeout (default: 48 hours):
- Find pending slot confirmations where
sentAtis before the cutoff and no response has been recorded - Mark the confirmation as declined with a note “Auto-escalated: no response”
- Set the serve slot back to OPEN status
- Attempt to auto-assign the slot to the next best available candidate (not blacked out, not already assigned, not overloaded)
- If no suitable candidate is found, the slot remains open for manual assignment
Escalation Configuration
| Field | Type | Description |
|---|---|---|
| Escalation Timeout | Hours | How long to wait for a volunteer response before escalating. Configured via Tenant Configuration (serveEscalationTimeoutHours). Default: 48 hours. |
Re-confirmation Emails
Daily at 10am, the re-confirmation job sends reminder emails to volunteers who have already confirmed but whose service is coming up within the configured window (default: 24–48 hours).
The job respects user notification preferences — if a volunteer has muted SERVE_REMINDER_DUE notifications or disabled email for that type, the reminder is skipped.
Re-confirmation Configuration
| Field | Type | Description |
|---|---|---|
| Hours Before Service | Hours | How far before the service to send re-confirmation. Configured via Tenant Configuration (serveReconfirmHoursBefore). Default: 48 hours. |