ServiceNow — Integration Setup
ServiceNow is CMDash's second bi-directional integration (alongside Jira): CMDash reads existing Security Incident Response and security-tagged change records as incidents, and can push risks/remediations out to ServiceNow as new incidents.
⚠ Push only — status does not flow back. An earlier version of this line claimed CMDash would "poll them for status changes". It does not: CMDash never reads incident status back from ServiceNow. Closing an incident in ServiceNow will not close the corresponding CMDash task. Corrected 2026-08-12; tracked as a follow-up.
Prerequisites
- ServiceNow instance with Security Incident Response (SIR) enabled (for the read direction) and standard Incident Management (for write-back)
- A ServiceNow user account with read access to
sn_si_incidentandchange_request, and (for write-back) create/edit access to the standardincidenttable - CMDash Essentials tier or above
Step 1: Create a ServiceNow Integration User
- In ServiceNow, go to User Administration → Users → New.
- Create a dedicated service account, e.g.
cmdash.integration. - Assign roles covering:
- Read access to the Security Incident Response table (
sn_si_incident) — typicallysn_si.reador your org's SIR read role - Read access to
change_request itil(or equivalent) for read/write access to the standardincidenttable, needed for write-back
- Read access to the Security Incident Response table (
- Set (or note) the account's password — CMDash uses HTTP Basic auth.
Step 2: Connect in CMDash
- Navigate to Integrations in your CMDash dashboard.
- Find ServiceNow and click Connect.
- Enter:
- Instance — your instance subdomain only (e.g.,
acmeforacme.service-now.com) - Username
- Password (stored as this connection's access token)
- Instance — your instance subdomain only (e.g.,
- Click Save & Test Connection.
What Syncs (Read Direction)
| Data Type | API | Sync Frequency |
|---|---|---|
| Incidents (from Security Incident Response, updated in the last 7 days) | GET /api/now/table/sn_si_incident | Every 4 hours by default (configurable per connection) |
| Incidents (from security-category Change Requests, updated in the last 7 days) | GET /api/now/table/change_request?...category=security | Every 4 hours by default (configurable per connection) |
Both queries are scoped to records updated in the last 7 days and are read page by page (sysparm_offset, 500 records per request) until the table ends, up to 25,000 records per table; reaching that ceiling marks the sync Partial with a warning rather than reporting it as complete. ServiceNow priority (1–3/other) maps to CMDash's critical/high/medium/low severity scale; SIR state and change state codes are each mapped independently onto CMDash's open/investigating/resolved/closed status.
Write-Back Direction
| Action | API | Purpose |
|---|---|---|
| Push a new incident | POST /api/now/table/incident | Create a ServiceNow incident from a CMDash risk/remediation (short description, description, urgency/impact, category, optional assignment group) |
| Fetch incident status | GET /api/now/table/incident/{sys_id} | Pull the current state/resolution notes back into CMDash |
| Update an incident | PATCH /api/now/table/incident/{sys_id} | Push field changes from CMDash back to ServiceNow |
Important asymmetry: reads pull from the Security Incident Response table (
sn_si_incident), but write-back creates records in the standard ITSM Incident table (incident) — these are two different tables in ServiceNow. An incident CMDash pushes will not appear in the next scheduled read-sync unless someone in your ServiceNow workflow promotes/converts it into a Security Incident. Plan your ServiceNow process accordingly if you rely on CMDash to close the loop automatically.
Troubleshooting
- 401 Unauthorized: The integration user's password was changed or the account was deactivated.
- 403 Forbidden on reads: The account lacks read access to
sn_si_incidentorchange_request— check its assigned roles. - Push fails with 403: The account lacks
itil(or equivalent create/write) access to the standardincidenttable. - Pushed incidents never show a status update in CMDash: expected — status sync-back is not implemented.
fetchIncidentStatusexists on the adapter but no code path calls it, from the remediation detail view or anywhere else. Track the incident in ServiceNow and close the CMDash task manually. - Pushed incident doesn't "close the loop" with the original risk: See the read/write table asymmetry noted above — pushed items land in
incident, notsn_si_incident.
Rate Limits & Sync Behavior
| Setting | Value |
|---|---|
| Sync frequency (read) | Every 4 hours by default (syncInterval is configurable per connection) |
| Pagination | 500 records per request, followed to the end; ceiling 25,000 records per table, after which the sync is flagged Partial |
| Rate limit handling | Every outbound request is paced through CMDash's shared per-tenant token bucket for this provider, and a vendor 429 (with its Retry-After) holds that tenant's budget until the vendor says it is ready (#507) |
| Failed sync retry | Job queue retries 3 times with exponential backoff (starting at 30s) — see docs/developers/dead-letter.md |
Credential Rotation
ServiceNow passwords do not expire automatically unless your instance enforces a password policy. CMDash recommends rotating the integration account's password quarterly.
To rotate:
- In ServiceNow, reset the
cmdash.integrationaccount's password. - In CMDash: Settings → Integrations → ServiceNow → Edit.
- Enter the new Password and Save.
Note: Because ServiceNow credentials carry no expiry metadata CMDash can read, the 30-day expiry warning banner is not shown for this integration.
Multiple Instances / Multi-Site
If you operate more than one ServiceNow instance (e.g., separate production and subsidiary instances), each needs its own CMDash connection.
To add another instance:
- Create an integration user in the additional instance, following Step 1.
- In CMDash: Settings → Integrations → Add Integration → ServiceNow.
- Enter the instance name, username, and password for the additional instance.
- Give the connection a descriptive name (e.g.,
ServiceNow - Prod,ServiceNow - Subsidiary). - Click Save & Test Connection.
Compliance Framework Coverage
The ServiceNow integration provides evidence for the following controls. Coverage is automatically mapped when data is synced.
| Framework | Control | Description |
|---|---|---|
| PCI DSS | 12.10 | Incident response — Security Incident Response records and pushed incidents |
| HITRUST | 09.v | Information security incident management — SIR and incident lifecycle data |
| CMMC L2 | IR.2.093 | Incident tracking — ServiceNow incident status mapped to incident handling evidence |
| SOC 2 | CC7.3 | Incident response — remediation issues pushed to and tracked in ServiceNow |
| SOC 2 | CC8.1 | Change management — security-tagged change requests |