ServiceNow (Two-Way)

ServiceNow sends incident webhooks to JAMS Incident Management, and JAMS calls / SMS-es / pushes your on-call team until someone responds. When they Acknowledge or Resolve, JAMS writes the new state back into the ServiceNow incident β€” so the ITSM record, assignment, and any downstream automation all reflect the resolution without anyone double-bookkeeping. ServiceNow records the work; JAMS makes sure a human actually picks up.

Plan availability: The ServiceNow integration is included on the Professional plan and up. See Plans & Billing.

Two directions. This page covers ServiceNow β†’ JAMS (a ServiceNow incident pages your on-call team). JAMS can also go the other way and open a brand-new ServiceNow incident from any other alert β€” see Open a ServiceNow incident from a JAMS alert near the bottom.

What you'll get

After setup:

  • A ServiceNow incident (e.g. Priority 1) is created β†’ a Business Rule POSTs to JAMS's webhook β†’ recipients get a call (and/or SMS/push/email/Teams/Slack per your flow)
  • Recipients press 1 to Acknowledge or 2 to Resolve β€” or do nothing and escalation continues to the next person
  • Acknowledge sets the ServiceNow incident to In Progress; Resolve sets it to Resolved (with a close code + note)
  • A work note is added to the incident recording who acted and how (voice, SMS, etc.)
  • If the incident is Resolved or Closed directly in ServiceNow, JAMS stops escalating automatically
  • The /incidents page shows everything in flight with one-click Acknowledge / Resolve buttons

What you'll need

  1. A ServiceNow instance (a free Personal Developer Instance works for testing).
  2. A ServiceNow integration user with permission to read and update the Incident table (the itil role is sufficient). Basic auth with this user is the fastest way to start; OAuth 2.0 is the production-grade option.
  3. Admin access in ServiceNow to create a Business Rule (or a Flow Designer flow) on the Incident table.

Step 1 β€” Create the ServiceNow connection in JAMS

The connection bundles your instance credentials, the recipients, the escalation policy, and the per-flow webhook URL.

  1. In JAMS, open Integrations β†’ ServiceNow from the sidebar.
  2. Click Create a ServiceNow Connection and fill in:
    • Connection name β€” anything memorable (e.g. prod-itsm).
    • Instance URL β€” your full instance base URL, e.g. https://dev12345.service-now.com.
    • Authentication β€” Basic (username + password of the integration user) to start, or OAuth 2.0 (client ID/secret + service-account credentials) for production.
    • Who gets notified β€” pick individuals, groups, or an on-call rotation, plus the channels (Call is the most reliable for critical incidents).
    • Escalation interval β€” how long to wait for each recipient to acknowledge before moving to the next.
  3. Save Connection. JAMS shows you the webhook URL β€” it looks like https://<your-JAMS-backend-host>/api/servicenow/webhook/{tenantId}/{flowId}. Copy it; you'll paste it into ServiceNow next.

The credentials are used only for write-back. Inbound alerts authenticate by the secret webhook URL itself, but pushing Acknowledge / Resolve back into ServiceNow requires the instance URL + integration-user credentials you entered here. Without them, JAMS can still call your team β€” it just can't update the ServiceNow incident.


Step 2 β€” Create the Business Rule that POSTs to JAMS

This is what makes ServiceNow tell JAMS "a major incident just opened."

  1. In ServiceNow, go to All β†’ System Definition β†’ Business Rules β†’ New.
  2. Name: Notify JAMS on P1. Table: Incident [incident].
  3. When to run tab:
    • When: after
    • Check Insert and Update.
    • Filter Conditions: e.g. Priority is 1 - Critical (so only major incidents page your team).
  4. Advanced tab β€” check Advanced, and in the Script field POST the ticket to your webhook URL. The body must include sysId (the record's sys_id); the rest is optional but recommended:
(function executeRule(current, previous) {
  var r = new sn_ws.RESTMessageV2();
  r.setEndpoint('https://<your-JAMS-backend-host>/api/servicenow/webhook/<tenantId>/<flowId>');
  r.setHttpMethod('POST');
  r.setRequestHeader('Content-Type', 'application/json');
  r.setRequestBody(JSON.stringify({
    sysId: current.sys_id.toString(),
    number: current.number.toString(),
    shortDescription: current.short_description.toString(),
    description: current.description.toString(),
    priority: current.priority.toString(),
    state: current.state.toString()
  }));
  r.executeAsync();
})(current, previous);
  1. Submit.

Why sysId matters. The ServiceNow Table API addresses records by sys_id (the 32-character GUID), not the human-friendly number like INC0012345. JAMS stores the sys_id when the webhook arrives so it can update the exact incident later. If you only send the number, write-back can't find the record.


Step 3 β€” Add close-sync (so JAMS stops when the ticket is resolved)

Without this, someone resolving the incident inside ServiceNow wouldn't stop JAMS from calling the on-call. Cover it by letting the same Business Rule fire on state changes (the Update checkbox in Step 2 already does this) β€” JAMS treats incoming state values of Resolved (6), Closed (7), or Canceled (8) as "stop escalating."

If you prefer a dedicated rule, create a second Business Rule with Filter Conditions: State changes to Resolved, using the same script. Either way, JAMS cancels pending notifications the moment ServiceNow says the incident is done.


How the two-way flow works

ServiceNow incident created / updated (Priority 1)
   β”‚
   β–Ό
Business Rule POST β†’ /api/servicenow/webhook/<tenant>/<flow>
   β”‚
   β–Ό
JAMS creates Incident (stores sys_id) + fires flow notifications (call, SMS, push…)
   β”‚
   β–Ό recipient presses 1 / 2 (or clicks button on /incidents)
   β”‚
   β–Ό
JAMS PATCHes <instance>/api/now/table/incident/<sys_id>
                  { state: In Progress | Resolved, work_notes, close_code }
   β”‚
   β–Ό
ServiceNow incident reflects the new state + work note
JAMS escalation stops (notifications cascade to "acknowledged")

Voice-call menu

When the call lands, after the incident summary you'll hear:

"Press 1 or say acknowledge to acknowledge this incident in ServiceNow. Press 2 or say resolve to resolve it in ServiceNow."

  • 1 / "acknowledge" β†’ ServiceNow incident β†’ In Progress, with a work note recording the acknowledgment. Escalation stops; the incident stays open.
  • 2 / "resolve" β†’ ServiceNow incident β†’ Resolved, with a close code and close note. JAMS marks the incident resolved.

You can also press 3 to replay the message at any time.

SMS replies

Reply to the alert SMS with 1 for Acknowledge or 2 for Resolve. JAMS confirms with a short reply. Same ServiceNow-side effect as the voice menu.

Teams / Slack / push

If your flow delivers to Teams or Slack, the alert card carries Acknowledge / Resolve buttons that do the same write-back. Push and email deliver the alert and can acknowledge the JAMS escalation, but only the interactive channels (voice, SMS, Teams, Slack, and the /incidents buttons) push state back into ServiceNow.

/incidents page

Open /incidents. ServiceNow incidents appear alongside other sources with Acknowledge and Resolve buttons. Buttons hit the same backend code as the voice/SMS path β€” ServiceNow stays in sync.

Auto-resolve

When ServiceNow reports the incident as Resolved/Closed/Canceled (via the Business Rule on state change), JAMS:

  1. Marks the incident resolved.
  2. Cancels any queued/sent notifications in the same group (no more pages for a ticket that's already handled).
  3. Logs servicenow.auto_resolved in the audit trail.

Force-close (orphan incidents only)

If an incident gets stuck because the ServiceNow record behind it no longer exists (deleted, or a test payload), a normal Resolve would try to PATCH ServiceNow and fail. For exactly these cases the /incidents page has a Force close button that marks the incident resolved on the JAMS side and cancels pending notifications without calling ServiceNow. It's logged as servicenow.force_closed so it's distinguishable from a real resolve.


Open a ServiceNow incident from a JAMS alert

Everything above is ServiceNow β†’ JAMS. JAMS can also go the other way: for alerts that didn't come from ServiceNow β€” a JAMS job failure, an email / API / webhook alert, or a manual send β€” a recipient can open a new ServiceNow incident straight from the alert, without leaving the phone call or chat. Great for turning "something just broke" into a tracked ticket in one step.

Opening a ticket also acknowledges the alert. It's a single Create + Acknowledge action, so JAMS stops escalating the moment the responder files the incident β€” no separate "press 1 to acknowledge" needed.

The new incident is pre-filled from the alert:

From the alertServiceNow incident field
Title / flow nameShort description
Message bodyDescription
SeverityUrgency + impact

Because the new incident is linked back to the alert, everything in How the two-way flow works then applies to it β€” a later Acknowledge/Resolve keeps it in sync, and resolving it inside ServiceNow stops any remaining JAMS activity.

Turn it on (admin, once per flow)

  1. Make sure a ServiceNow connection exists (Step 1 above). The incident is created with those credentials, so the integration user needs permission to create incidents (the itil role covers this).
  2. Open the flow you want β€” in New flow, Edit flow, or AI Helper.
  3. In the flow's settings, tick "Let recipients open a ticket from this alert," choose ServiceNow, and pick the connection. Save.

The option only appears when your plan includes ServiceNow and a connection is configured. It isn't offered on Azure Monitor flows β€” those alerts are already tied to their own incident.

How a recipient opens one

However the alert reaches them, there's now one extra choice on the menu:

  • Voice call: the menu adds a "create ticket" option β€” press the number it announces, or say "create ticket."
  • SMS: reply with the digit shown next to "create ticket."
  • Teams / Slack: a Create ServiceNow incident button on the alert card.
  • Notifications page: a 🎫 ServiceNow ticket button next to any active alert on /notifications.

JAMS confirms with the new incident number β€” e.g. "Created ServiceNow incident INC0012345 and acknowledged the alert." Choosing it twice is safe: the second press just reports the incident that's already open, never a duplicate.


Choosing the resolve close code

ServiceNow usually requires a close code and close notes when an incident moves to Resolved (an out-of-the-box business rule enforces this). JAMS sends a sensible default close code and a note like "Resolved via JAMS." If your instance uses a customized close-code choice list and rejects the default, the resolve PATCH will fail with a 4xx β€” contact support to set the close code JAMS sends to one your instance accepts.


Verify it works (end-to-end)

  1. In ServiceNow, create a new Incident with Priority = 1 - Critical (matching your Business Rule filter).
  2. Within a few seconds, the on-call recipient should get a JAMS call / SMS / push.
  3. Press 1 on the call (or reply 1). In ServiceNow, open the incident β€” State should flip to In Progress and a work note should appear.
  4. Press 2 (or click Resolve on /incidents) β€” the incident moves to Resolved.
  5. Create another P1, then Resolve it directly in ServiceNow β€” JAMS should stop escalating within ~30 seconds.

Troubleshooting

SymptomLikely causeFix
JAMS never callsBusiness Rule didn't fire, or the endpoint URL is wrongConfirm the rule's When = after, Insert/Update checked, and the filter matches your test incident. Re-copy the webhook URL from the ServiceNow connection. Check the rule's script for a typo in the endpoint.
Calls land, but pressing 1 says "ServiceNow refused our credentials."Wrong integration-user username/password, or the OAuth client is misconfiguredRe-enter the credentials in the ServiceNow connection (Edit). Confirm the user can log in to the instance directly.
Pressing 1 says "Our ServiceNow account is not authorized to update this incident."The integration user lacks write access to the Incident tableGrant the user the itil role (or equivalent write access).
Pressing 2 (Resolve) fails with a 4xxYour instance requires a specific close code JAMS isn't sendingContact support to align the close code JAMS sends with your instance's choice list.
Pressing 1 says "ServiceNow no longer has this incident."The sys_id doesn't exist (deleted, or only the number was sent)Confirm the Business Rule sends current.sys_id, not the number. For a genuinely deleted record, use Force close on /incidents.
Reminders/calls keep coming after the ticket was resolved in ServiceNowThe Business Rule isn't firing on Update (state change)Make sure Update is checked in the rule's When to run, or add a dedicated rule on State changes to Resolved.
"Create ticket" isn't offered on the alertThe flow's toggle is off, your plan doesn't include ServiceNow, no connection is configured, or it's an Azure Monitor flowEnable "Let recipients open a ticket from this alert" on the flow, confirm the plan and a saved connection. Azure Monitor flows don't support it.
"Create ticket" fails with "ServiceNow connection not configured" or an authorization errorNo usable connection, or the integration user can't create incidentsAdd/fix a ServiceNow connection (Step 1) and give the user create rights on the Incident table (itil).

If you hit something not on this list, capture the time of the failed call/SMS and a screenshot of the /incidents audit log, then reach out to support β€” that gives us enough to trace through the backend's [ServiceNow] log lines.