Zendesk (Two-Way)

Zendesk sends ticket webhooks to JAMS Incident Management, and JAMS calls / SMS-es / pushes your on-call team until someone responds. When they Acknowledge or Solve, JAMS writes the new status back into the Zendesk ticket and adds an internal note β€” so the ticket reflects who responded and how, without anyone double-bookkeeping. Zendesk tracks the work; JAMS makes sure a human actually picks up an urgent ticket.

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

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

What you'll get

After setup:

  • An urgent Zendesk ticket is created β†’ a Trigger fires a Webhook to JAMS β†’ recipients get a call (and/or SMS/push/email/Teams/Slack per your flow)
  • Recipients press 1 to Acknowledge or 2 to Solve β€” or do nothing and escalation continues to the next person
  • Acknowledge sets the Zendesk ticket to Open; Solve sets it to Solved
  • A private (internal) comment is added to the ticket recording who acted and how
  • If the ticket is Solved or Closed directly in Zendesk, JAMS stops escalating automatically
  • The /incidents page shows everything in flight with one-click Acknowledge / Solve buttons

What you'll need

  1. A Zendesk Support account (a sandbox / test instance is fine for trying it out).
  2. An agent with permission to update tickets, plus an API token (Zendesk Admin Center β†’ Apps and integrations β†’ Zendesk API β†’ Token access β†’ Add API token). API token is the recommended auth; email/password (Basic) and a pre-issued OAuth token are also supported.
  3. Admin access in Zendesk to create a Webhook and a Trigger.

Step 1 β€” Create the Zendesk connection in JAMS

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

  1. In JAMS, open Integrations β†’ Zendesk from the sidebar.
  2. Click Create a Zendesk Connection and fill in:
    • Connection name β€” anything memorable (e.g. support-urgent).
    • Subdomain β€” the part before .zendesk.com (e.g. acme for acme.zendesk.com).
    • Authentication β€” API token (agent email + token) is recommended. Basic (email + password) and OAuth token are also available.
    • Who gets notified β€” pick individuals, groups, or an on-call rotation, plus the channels (Call is the most reliable for urgent tickets).
    • 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/zendesk/webhook/{tenantId}/{flowId}. Copy it; you'll paste it into Zendesk next.

The credentials are used only for write-back. Inbound tickets authenticate by the secret webhook URL itself, but pushing Acknowledge / Solve back into Zendesk requires the API credentials you entered here. With API token auth, JAMS sends the standard {agent-email}/token Basic header. Without working credentials, JAMS can still call your team β€” it just can't update the ticket.


Step 2 β€” Create the Webhook in Zendesk

  1. In Zendesk, go to Admin Center β†’ Apps and integrations β†’ Webhooks β†’ Create webhook.
  2. Connect with: Trigger or automation.
  3. Name: JAMS on-call.
  4. Endpoint URL: paste the webhook URL from Step 1.
  5. Request method: POST. Request format: JSON.
  6. Authentication: None β€” the JAMS webhook URL is itself the secret.
  7. Create webhook (you can use the Test button later, once the Trigger is built).

Step 3 β€” Create the Trigger that fires the webhook

This is what makes Zendesk tell JAMS "an urgent ticket just came in."

  1. Go to Admin Center β†’ Objects and rules β†’ Business rules β†’ Triggers β†’ Create trigger.
  2. Name: Notify JAMS on urgent.
  3. Conditions β†’ Meet ALL: add Ticket: Priority is Urgent (and optionally Ticket: Status is New, so you only page on brand-new urgent tickets).
  4. Actions: add Notify by β†’ Active webhook, choose the webhook from Step 2.
  5. In the JSON body that appears, send the ticket fields. ticketId is required; the rest are recommended:
{
  "ticketId": "{{ticket.id}}",
  "subject": "{{ticket.title}}",
  "description": "{{ticket.description}}",
  "priority": "{{ticket.priority}}",
  "status": "{{ticket.status}}"
}
  1. Create / Save.

ticketId is the numeric ticket id ({{ticket.id}}) β€” JAMS stores it when the webhook arrives so it can update the exact ticket later via the Zendesk REST API. Don't substitute the external id or a custom field.


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

Without this, someone solving the ticket inside Zendesk wouldn't stop JAMS from calling the on-call. Create a second Trigger:

  1. Create trigger β†’ Name: Tell JAMS ticket solved.
  2. Conditions β†’ Meet ALL: Ticket: Status is Solved (you can add another for Closed).
  3. Actions: Notify by β†’ Active webhook β†’ the same webhook, with the same JSON body as Step 3.
  4. Save.

JAMS treats an incoming status of solved or closed as "stop escalating" and cancels any pending notifications.


How the two-way flow works

Zendesk ticket created / updated (Priority: Urgent)
   β”‚
   β–Ό
Trigger β†’ Webhook POST β†’ /api/zendesk/webhook/<tenant>/<flow>
   β”‚
   β–Ό
JAMS creates Incident (stores ticket id) + fires flow notifications (call, SMS, push…)
   β”‚
   β–Ό recipient presses 1 / 2 (or clicks button on /incidents)
   β”‚
   β–Ό
JAMS PUTs <subdomain>.zendesk.com/api/v2/tickets/<id>.json
                  { status: open | solved, comment: { body, public:false } }
   β”‚
   β–Ό
Zendesk ticket reflects the new status + internal note
JAMS escalation stops (notifications cascade to "acknowledged")

Voice-call menu

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

"Press 1 or say acknowledge to acknowledge this ticket in Zendesk. Press 2 or say solve to solve it in Zendesk."

  • 1 / "acknowledge" β†’ Zendesk ticket β†’ Open, with an internal note. (Zendesk has no "in progress" status; moving New β†’ Open signals an agent is engaged.) Escalation stops; the ticket stays open.
  • 2 / "solve" β†’ Zendesk ticket β†’ Solved, with an internal note. JAMS marks the incident resolved.

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

Why Solved, not Closed? Zendesk closes solved tickets automatically after a set period, and its API generally won't let an integration set Closed directly. JAMS sets Solved, which is the correct agent-driven resolution state.

SMS replies

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

Teams / Slack / push

If your flow delivers to Teams or Slack, the alert card carries Acknowledge / Solve 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 status back into Zendesk.

/incidents page

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

Auto-resolve

When Zendesk reports the ticket as Solved/Closed (via the close-sync Trigger from Step 4), 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 zendesk.auto_resolved in the audit trail.

Force-close (orphan incidents only)

If an incident gets stuck because the Zendesk ticket behind it no longer exists (deleted, or a test payload), a normal Solve would try to PUT Zendesk 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 Zendesk. It's logged as zendesk.force_closed so it's distinguishable from a real solve.


Open a Zendesk ticket from a JAMS alert

Everything above is Zendesk β†’ JAMS. JAMS can also go the other way: for alerts that didn't come from Zendesk β€” a JAMS job failure, an email / API / webhook alert, or a manual send β€” a recipient can open a new Zendesk ticket 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 ticket β€” no separate "press 1 to acknowledge" needed.

The new ticket is pre-filled from the alert:

From the alertZendesk ticket field
Title / flow nameSubject
Message bodyFirst comment (internal)
SeverityPriority (Critical→Urgent, Error→High, Warning→Normal, Info→Low)

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

Turn it on (admin, once per flow)

  1. Make sure a Zendesk connection exists (Step 1 above). The ticket is created with those credentials, so the agent needs permission to create tickets.
  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 Zendesk, and pick the connection. Save.

The option only appears when your plan includes Zendesk 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 Zendesk ticket button on the alert card.
  • Notifications page: a 🎫 Zendesk ticket button next to any active alert on /notifications.

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


Verify it works (end-to-end)

  1. In Zendesk, create a new ticket with Priority = Urgent (matching your Trigger condition).
  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 Zendesk, open the ticket β€” Status should flip to Open and an internal note should appear.
  4. Press 2 (or click Solve on /incidents) β€” the ticket moves to Solved.
  5. Create another urgent ticket, then Solve it directly in Zendesk β€” JAMS should stop escalating within ~30 seconds.

Tip: Zendesk's webhook editor has a Test button (and an Activity log under the webhook) that shows the exact payload and the HTTP response from JAMS β€” invaluable when a Trigger isn't firing as expected.


Troubleshooting

SymptomLikely causeFix
JAMS never callsThe Trigger didn't fire, or it isn't wired to the webhookConfirm the Trigger conditions match your test ticket (Priority Urgent), and its action is Notify by β†’ Active webhook pointing at the right webhook. Check the webhook's Activity log for delivery attempts.
Webhook Activity log shows a non-2xx from JAMSBad JSON body or missing ticketIdMake sure the body includes "ticketId": "{{ticket.id}}" and is valid JSON.
Calls land, but pressing 1 says "Zendesk refused our credentials."Wrong agent email / API token, or token access disabledRe-enter the email + API token in the Zendesk connection (Edit). Confirm Token access is enabled in Admin Center β†’ Zendesk API.
Pressing 1 says "Our Zendesk account is not authorized to update this ticket."The agent lacks permission to update ticketsUse an agent (not an end user / light agent) with ticket-edit rights.
Pressing 2 (Solve) says "Zendesk rejected the update (invalid status transition)."The ticket can't move to Solved (e.g. required fields unset)Make sure the ticket meets your account's conditions for Solved (required fields, etc.), or solve from within Zendesk.
Pressing 1 says "Zendesk no longer has this ticket."The ticket id doesn't exist (deleted)For a genuinely deleted ticket, use Force close on /incidents.
Calls keep coming after the ticket was solved in ZendeskThe close-sync Trigger (Step 4) isn't firingConfirm a Trigger fires on Status is Solved and notifies the same webhook with the same body.
"Create ticket" isn't offered on the alertThe flow's toggle is off, your plan doesn't include Zendesk, 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 "Zendesk connection not configured" or an authorization errorNo usable connection, or the agent can't create ticketsAdd/fix a Zendesk connection (Step 1) and use an agent with ticket-create rights.

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