Adapt this incident management system to your team's size, tooling, and processes.
Add a "Region" select to the On-Call Schedule:
Create a Timeline view grouped by Region to visualize 24-hour coverage.
For companies where outages have extreme business impact:
| Level | Name | Response | Example |
|---|---|---|---|
| SEV0 | Existential | 5 min | Data breach, complete data loss, regulatory violation |
SEV0 should page everyone in Tier 1 + Tier 2 simultaneously and auto-notify Tier 3 management.
If SEV3 and SEV4 feel redundant:
| Level | Name | Response | Replaces |
|---|---|---|---|
| Critical | Page immediately | 15 min | SEV1 |
| Major | Slack alert | 1 hour | SEV2 |
| Minor | Next business day | 4-24 hours | SEV3 + SEV4 |
Update the Severity select options and adjust all formula references.
This Notion system complements (doesn't replace) alerting tools. Here's how they fit together:
| Tool | Role | Notion Integration |
|---|---|---|
| PagerDuty | Real-time alerting, phone/SMS escalation | Sync on-call schedule via API. Log incidents from PagerDuty webhook. |
| OpsGenie | Alert routing and deduplication | Use OpsGenie for pages, Notion for postmortems and SLA tracking. |
| Datadog | Monitoring and dashboards | Link Datadog dashboard URLs in the Incidents database. |
| Grafana | Metrics visualization | Embed Grafana snapshot URLs in postmortem pages. |
| Slack | Communication hub | Create a #incidents channel. Bot posts to Slack when new incident is logged. |
1. Auto-create incident — Webhook from PagerDuty creates a new Incidents database entry
2. SLA monthly update — Cron job pulls uptime data from monitoring and updates SLA Targets
3. On-call reminder — Send Slack message on rotation day linking to handoff notes
4. Postmortem deadline — Auto-create postmortem entry 24h after incident resolution
Add these properties to the Postmortems database:
Replace the free-text Contributing Factors with a Multi-select:
This enables filtering postmortems by common failure patterns over time.
Create a separate Action Items database instead of tracking counts:
This gives you a dedicated board view of all outstanding action items across incidents.
Create a separate SLA Monthly History database:
This enables trend analysis over time without overwriting current-month data.
Add these properties to SLA Targets:
Create a filtered Board on Incidents:
Create a Table on Incidents:
Track on-call health with a table showing:
Add a Notification Rules page documenting when to use which channel:
| Severity | Primary Channel | Secondary Channel | Management Notify |
|---|---|---|---|
| SEV1 | Phone call | Slack #incidents | Immediate |
| SEV2 | Slack DM + mention | Within 1 hour | |
| SEV3 | Slack #incidents | Daily summary | |
| SEV4 | Slack #incidents | None | Weekly report |
Step-by-step instructions for setting up the On-Call & Incident Tracker in your Notion workspace. Allow 20-25 minutes for the full setup.
databases/ folderpages/ and templates/ foldersImport this first — other databases reference team members.
1. Navigate to your target Notion page
2. Type /table → select "Table - Full page"
3. Click ··· → "Merge with CSV" → select databases/escalation_contacts.csv
| Column | Set Type To | Notes |
|---|---|---|
| Name | Title | |
| Role | Text | |
| Team | Select | Platform=blue, Infrastructure=purple, Product=green, Security=red, Engineering=gray |
| Tier | Select | 1=green (first responder), 2=yellow (specialist), 3=red (management) |
| Phone | Phone | |
| Slack Handle | Text | |
| Timezone | Select | |
| Notification Preference | Multi-select | Slack=blue, Phone=red |
| Availability Notes | Text |
1. By Tier — Board view grouped by Tier
2. By Team — Table grouped by Team
3. Alphabetical — Default table sorted by Name
1. Create new "Table - Full page"
2. Merge with CSV → select databases/sla_targets.csv
| Column | Set Type To | Notes |
|---|---|---|
| Service | Title | |
| Category | Select | Core=red, Product=blue, Supporting=yellow, Infrastructure=purple |
| Uptime Target | Text | Display as percentage string |
| Response Time Target (p99) | Text | |
| MTTR Target (minutes) | Number | |
| Current Month Uptime | Text | |
| Current Month MTTR | Number | |
| Incidents This Month | Number | |
| Last Incident Date | Date | |
| Status | Select | Meeting SLA=green, At Risk=yellow, Breached=red |
| Notes | Text |
1. Health Board — Board view grouped by Status
2. Core Services — Table filtered to Category = "Core"
3. At Risk — Table filtered to Status = "At Risk" or "Breached"
1. Create new "Table - Full page"
2. Merge with CSV → select databases/on_call_schedule.csv
| Column | Set Type To | Notes |
|---|---|---|
| Week Starting | Date | |
| Week Ending | Date | |
| Primary On-Call | Relation | Link to Escalation Contacts database |
| Secondary On-Call | Relation | Link to Escalation Contacts database |
| Shift Type | Select | Weekday=blue, Weekend=orange, Weekday + Weekend=purple |
| Handoff Notes | Text | |
| Swap History | Text | |
| Coverage Gaps | Text |
1. Calendar View — Use "Week Starting" as the date field
2. Timeline View — Shows rotation blocks visually, use Week Starting to Week Ending range
3. Current + Future — Table filtered to Week Starting is on or after Today, sorted ascending
4. My On-Call — Table filtered by Primary or Secondary = your name
1. Create new "Table - Full page"
2. Merge with CSV → select databases/incidents.csv
| Column | Set Type To | Notes |
|---|---|---|
| Incident ID | Title | Format: INC-YYYY-NNN |
| Title | Text | |
| Severity | Select | SEV1=red, SEV2=orange, SEV3=yellow, SEV4=gray |
| Status | Select | Active=red, Investigating=orange, Mitigated=yellow, Resolved=green |
| Affected Services | Relation | Link to SLA Targets database |
| Detected At | Date | Include time |
| Acknowledged At | Date | Include time |
| Mitigated At | Date | Include time |
| Resolved At | Date | Include time |
| Incident Commander | Relation | Link to Escalation Contacts database |
| Detection Method | Select | Monitoring Alert=green, Customer Report=orange, Internal Report=blue |
| Root Cause Summary | Text | |
| Customer Impact | Text | |
| Action Items Status | Text |
1. Active Incidents Board — Board grouped by Status, filtered to Status is not "Resolved"
2. Severity Board — Board grouped by Severity
3. Timeline — Sort by Detected At descending (most recent first)
4. This Month — Table filtered to Detected At is within current month
1. Create new "Table - Full page"
2. Merge with CSV → select databases/postmortems.csv
| Column | Set Type To | Notes |
|---|---|---|
| Postmortem ID | Title | Format: PM-YYYY-NNN |
| Incident ID | Relation | Link to Incidents database |
| Title | Text | |
| Date Written | Date | |
| Author | Relation | Link to Escalation Contacts database |
| Severity | Select | Same colors as Incidents |
| Duration (minutes) | Number | |
| MTTR (minutes) | Number | |
| Contributing Factors | Text | |
| Action Items Count | Number | |
| Completed Actions | Number | |
| Status | Select | Complete=green, In Progress=yellow, Draft=gray |
1. Action Item Status Board — Board grouped by Status
2. By Severity — Table grouped by Severity
3. Incomplete Actions — Table filtered to Completed Actions < Action Items Count
Copy markdown content from pages/ into new Notion pages:
1. Incident Dashboard ← pages/incident-dashboard.md
2. Incident Response Runbook ← pages/incident-response-runbook.md
3. Escalation Policy ← pages/escalation-policy.md
Embed linked database views into the dashboard as described in each page's instructions.
Dates import without times:
When setting date columns, enable "Include time" in the date property settings. Then re-enter the time values for incident timestamps.
Relations show no results:
Verify the relation is pointing to the correct database name. Notion matches relations by exact database title.
SLA Status formula not working:
Copy the formula from formulas/FORMULAS.md exactly. Property names in formulas must match your column headers character-for-character.