maborak.com~/blog/pagerduty-vs-jsm-sresoftware & infrastructure engineering
Back to all articles

PagerDuty vs Jira Service Management: an SRE's field guide to every on-call concept

Overview

What each PagerDuty object becomes in Jira Service Management: events, dedup, escalation, phone paging, Slack, Terraform, rate limits and webhooks, checked against both APIs, both Terraform providers and Atlassian's bug tracker.

Opsgenie shuts down on 5 April 2027 and its alerting now lives inside Jira Service Management (Atlassian (opens in a new tab)). Our company is moving PagerDuty teams there too [reported], so we mapped every PagerDuty object an SRE touches to its JSM equivalent. Each cell comes from the vendor API references, the two Terraform providers (PagerDuty 3.37.0, atlassian-operations 2.1.0), Atlassian’s public bug tracker, or engineers reporting what broke.

Checked 7 November 2026.

Feature by feature

Data model

Concept PagerDuty JSM What bites
What pages people Service, through its escalation policy Team with Operations enabled, through its routing rules In JSM, “Routing rules are not triggered if even one individual responder is specified in an alert”
Inbound signal Event: POST events.pagerduty.com/v2/enqueue, 512 KB Alert: POST api.atlassian.com/jsm/ops/integration/v2/alerts, GenieKey auth, async 202 JSM alert message is capped at 130 characters
What you acknowledge Incident. Alerts have “two only states: triggered and resolved” Alert One PagerDuty ack covers a group; JSM acks per alert
Incident record Incident, up to 1,000 alerts Jira work item, linked to alerts JSM incidents use the Jira REST API, not the Ops API
Dedup key dedup_key, 255 characters, per integration key alias, 512 characters, across integrations Same key from two integrations: PagerDuty keeps two alerts, JSM merges them
Severity severity + urgency (high/low) + 5-level priority Priority P1–P5 only No urgency; raising JSM priority restarts the notification flow
Custom data Incident and service custom fields, incident types Jira fields and work types; alert extra properties, 8,000 characters total JSM’s List Alerts API doesn’t return extra properties (JSDCLOUD-17011 (opens in a new tab))
Service catalog Business and technical services, dependencies Assets schemas (Software Registry, Business Portfolio), optional Compass sync “Adding a service to an alert doesn’t change alert routing” in JSM

Sources: PagerDuty alerts (opens in a new tab), send an alert event (opens in a new tab), event management (opens in a new tab); JSM alert notification flow (opens in a new tab), alert fields (opens in a new tab), alert priorities (opens in a new tab), services and incidents (opens in a new tab).

The biggest shift is the unit of work. In PagerDuty you acknowledge an incident and every alert grouped under it goes quiet. In JSM each alert is acknowledged on its own, and the Jira incident is a separate record that an automation rule has to create.

The dedup difference cuts both ways. PagerDuty ignores a dedup_key sent through a different integration key, so a check routed through two integrations pages twice. JSM merges the same alias whatever the source, and one ticket warns that “the team won’t realize the missing alert unless someone manually verifies” (JSDCLOUD-15956 (opens in a new tab)).

Routing and noise

Concept PagerDuty JSM What bites
Global routing Event Orchestration: global → router → service Global alert policies, then team routing rules (up to 100) JSM has no router that picks a team from content; the team comes from the integration owner, a policy or the payload
Suppress suppress: alert recorded, no incident. drop_event on global only Notification policy suppress; route to “No one”; integration ignore rule Both keep a record unless you drop or ignore
Hold a flapping alert suspend N seconds: a resolve in time means no incident. Auto-pause: 2, 3, 5, 10 or 15 min Notification policy delay_action PagerDuty swallows the flap; JSM delays the page but the alert exists
Grouping Time, content, intelligent or global; window 300–3,600 s Rovo grouping: AI similarity, or rules with a window and group-by fields From 3 December 2026, group actions such as “Ack all” spend Rovo credits; with extra usage off they are blocked until the 1st
Templating Extraction with RE2 variables; cache variables (100 per orchestration, values kept 24 h) Integration action rules with {{ field.extract(/re/) }} No cache variables in JSM
Auto-close auto_resolve_timeout auto_close_action Equivalent
Re-page if still open acknowledgement_timeout; escalation loops up to 9 auto_restart_action up to 20; escalation repeat up to 20 PagerDuty’s Terraform default for acknowledgement_timeout is 1800, so acknowledged incidents re-page after 30 minutes
Maintenance Per service; integrations disabled Per feature: policies, integrations, syncs PagerDuty can’t resolve via the Events API during maintenance
Heartbeat None built in. Documented workaround: cache variables + suspend + webhook, window up to 4 h heartbeats with a ping endpoint JSM ping returns 202 even for a heartbeat that doesn’t exist, and needs a user API token (JSDCLOUD-18241 (opens in a new tab))
Change context Change Events API, kept 90 days; Recent Changes on the incident Deployment tracking from Bitbucket, Jenkins, CircleCI, Octopus into change requests JSM’s Ops API has no change-event ingest

Sources: PagerDuty Event Orchestration (opens in a new tab), cache variables (opens in a new tab), orchestration examples (opens in a new tab), auto-pause (opens in a new tab), maintenance windows (opens in a new tab), change events (opens in a new tab); JSM routing rules (opens in a new tab), alert policies (opens in a new tab), alert grouping (opens in a new tab), integration actions (opens in a new tab), deployment tracking (opens in a new tab), JSM Ops REST spec (heartbeat ping).

Grouping on either side can hide the second problem. In PagerDuty, alerts that join an existing incident don’t page again, a behaviour Prometheus users have complained about since 2018 (alertmanager #1587 (opens in a new tab), 32 comments), and PagerDuty confirmed that Slack “does not send a new notification for each one” (PagerDuty Community (opens in a new tab)).

PagerDuty Community question by sharmaji0007 asking whether Slack sends another notification when a second alert is grouped into the same incident, with the best answer by lupimiguel: “when additional alerts are grouped into the same incident, Slack does not send a new notification for each one. The incident in PagerDuty will update with the new alert details, but you won’t see a new Slack message for every grouped alert.”

PagerDuty Community thread on grouped alerts in Slack, June 2025, captured 7 November 2026 at 07:10 UTC.

On-call

Concept PagerDuty JSM What bites
Schedule Shift-based schedules (API v3, Terraform pagerduty_schedulev2); legacy ones can’t be created Schedule with base, override and final layers; rotations Upgrading a PagerDuty schedule can’t be undone, and scripts on the v2 Schedules API stop working
Overrides /v3/schedules/{id}/overrides; edit means delete and recreate /v1/schedules/{id}/overrides; “Take on-call” for one hour No Terraform resource on either side (PagerDuty #112 (opens in a new tab), open since 2019)
Escalation delay Per level: each delay starts when the previous level fires From when the escalation was added, normally alert creation PagerDuty levels of 5 and 5 minutes become JSM rules at 0, 5 and 10
Escalation targets Up to 20 rules, 9 loops; round_robin or assign_to_everyone next, previous, all, random, users, admins; repeat up to 20 No round-robin in JSM (JSDCLOUD-13054 (opens in a new tab), 48 votes)
Business hours Support hours switch urgency; low urgency never escalates Time restrictions on routing rules In JSM, routing straight to a schedule “no escalation takes place if the alert goes unacknowledged”
Handoff notice Up to 48 h ahead; no SMS for new users since 10 December 2024 schedule-start / schedule-end: just before, 15 min, 1 h or 1 day Fixed offsets in JSM

Sources: PagerDuty shift-based schedule upgrade (opens in a new tab), escalation policies (opens in a new tab), round robin (opens in a new tab); JSM escalation policies (opens in a new tab), escalate an alert (opens in a new tab), overrides (opens in a new tab).

The escalation row is the one that silently changes paging after a migration. Atlassian’s own example has an alert created at 7:48 and rules firing at 7:48, 7:53 and 7:58: every delay counts from the start. Copy PagerDuty’s per-level numbers across and the third level fires earlier than it used to.

PagerDuty’s newer schedules are not settled in Terraform either. An open issue filed on 28 October 2026 reports that changing an active event in pagerduty_schedulev2 deletes it before creating the replacement, so a failed apply “leaves the schedule with nobody on call” (#1158 (opens in a new tab)).

Notifications

Concept PagerDuty JSM What bites
Contact methods Phone, SMS, push, email, WhatsApp (falls back to SMS) Voice, SMS, mobile, email Adding an SMS or voice number in JSM “doesn’t create a default alert notification rule”
Per-user rules By urgency, with a start delay By action (create, ack, close, note, schedule start/end) and criteria; first match wins No urgency split in JSM
Batching Bundles open incidents; no published window SMS every 1 minute, calls every 4 minutes JSM skips the call if everything was acknowledged meanwhile
Act from a call 4 acknowledge, 6 resolve, 8 escalate 3 acknowledge, 2 close, 4 escalate, 6 ack all; call ends at 2 minutes Different keys for the same muscle memory
Act from SMS Reply codes ending in 4, 6 or 8; 14 and 16 act on all ack 4421 JSM: “recipients can’t reply” when SMS comes from the “JSM” sender ID
Call a number to page Live Call Routing, ring 15–60 s per responder; no API or Terraform Incoming call routing Both exist
Bypass Do Not Disturb iOS critical alerts; Android DND and volume override; high urgency only iOS critical alerts; quiet hours bypassed per alert with an OverwriteQuietHours tag No critical alerts on Android in JSM (JSDCLOUD-15997 (opens in a new tab), 63 votes)

Sources: PagerDuty notification content and behaviour (opens in a new tab), SMS (opens in a new tab), mobile app settings (opens in a new tab), Live Call Routing (opens in a new tab); JSM SMS and voice (opens in a new tab), notification rules (opens in a new tab), notification preferences (opens in a new tab).

The phone is where engineers complain most. On JSM, the Opsgenie app’s long ringtone is gone: “all the sounds provided in JIRA Cloud are under 2-3 seconds”, and another admin wrote “I can see our on-call engineers missing critical notifications” (Atlassian Community (opens in a new tab), March 2025). Atlassian’s tracker has an open bug where a voice call is logged “no-answer” but never rang (JSDCLOUD-19207 (opens in a new tab), In Progress), and a request to lengthen the fixed call timeout for international numbers (JSDCLOUD-15759 (opens in a new tab), 58 votes). On PagerDuty, iOS users have asked since 2020 to set the critical-alert volume; one wrote in October 2025 that it was “so quiet I couldn’t even hear it from the next room” (PagerDuty Community (opens in a new tab)).

PagerDuty Community reply by dmurvihill: “I’m having the opposite problem! On iOS 18.6.1, PD 8.35, the critical alert was a friendly chime, and so quiet I couldn’t even hear it from the next room.”

Reply in the PagerDuty Community thread on iOS critical-alert volume, opened in 2020, captured 7 November 2026 at 07:10 UTC.

Atlassian Community posts. Rahul Sonar, 21 March 2025: “In Opsgenie, there was a ringtone that would ring for much longer, but all the sounds provided in JIRA Cloud are under 2-3 seconds.” Kris Massey, 24 March 2025: “the current notifications are not even close to the Opsgenie sound, and I can see our on-call engineers missing critical notifications”

Atlassian Community thread “Sounds for Alert notification”, captured 7 November 2026 at 07:10 UTC.

Incident response

Concept PagerDuty JSM What bites
Automation Incident workflows; triggers on type, condition, manual or API Jira Automation with alert triggers Opsgenie actions and incident rules are not migrated; they must be rebuilt
Roles Incident Commander, Customer Liaison, up to 10 custom; no REST API, webhook incident.role.assigned None. Assignee and Responders field Opsgenie responder roles are not migrated
Conference bridge Bridge field on the incident; workflow actions for Zoom, Google Meet, Teams Built-in conference calls (50 people), Zoom, Teams Both work; JSM’s needs no third party
Slack /pd (/pdeu in EU), dedicated incident channels /jsmops, incident channels JSM doesn’t update the Slack message on acknowledge (JSDCLOUD-18368 (opens in a new tab), 28 votes)
Microsoft Teams Standard channels only; dedicated incident chats Standard channels only; incident chats and meetings Neither supports private channels
Run scripts in your network Automation Actions and runner, outbound HTTPS Jira Edge Connector, polls a queue, outbound only JSM’s JEC API is marked Experimental
Status pages Status updates; pages are read-only in the API Status pages in Operations; API Experimental Neither manages pages in Terraform
Post-incident review /incidents/{id}/review, one per incident PIR work item, exportable to Confluence JSM’s PIR template can’t be changed (JSDCLOUD-12167 (opens in a new tab), 77 votes)
MTTA/MTTR /analytics/... API, data within about 24 h Reports in the UI; no reports API No programmatic MTTA in JSM Ops

Sources: PagerDuty incident workflows (opens in a new tab), incident roles (opens in a new tab), conference bridge (opens in a new tab), Slack user guide (opens in a new tab), Microsoft Teams (opens in a new tab), Automation Actions (opens in a new tab), post-incident reviews (opens in a new tab); JSM shift from Opsgenie (opens in a new tab), incident responders (opens in a new tab), conference calls (opens in a new tab), Slack (opens in a new tab), Microsoft Teams (opens in a new tab), Jira Edge Connector (opens in a new tab), PIR (opens in a new tab).

Migrated integrations are where teams lose pages. One admin reported that “after migrating from Opsgenie to JSM Operations, all Zabbix integrations for all teams stopped working” and had to move to the Edge Connector (Atlassian Community (opens in a new tab), December 2025). Alertmanager is the easy case: its Opsgenie receiver works against JSM by changing api_url (alertmanager #4244 (opens in a new tab)).

Atlassian Community question by Hudson Diego de Paula, 10 December 2025, “migrating zabbix integration from Opsgenie to JSM Operations”: “After migrating from Opsgenie to JSM Operations, all Zabbix integrations for all teams stopped working. Checking the documentation, I discovered I need to migrate from webhooks to Jira Edge Connector (JEC).”

Atlassian Community question, captured 7 November 2026 at 07:10 UTC.

APIs and code

Concept PagerDuty JSM What bites
Event intake limit About 120 calls/min per integration key, plus account limits; a 429 event is not ingested Not published; buckets per site and request type, per Atlassian’s tracker One JSM integration in a storm shares the site’s budget (JSDCLOUD-18905 (opens in a new tab)) [inferred]
Management API REST v2, 960 requests/min per key, user or app, with rate-limit headers /jsm/ops/api/{cloudId}/v1/...; no incidents, services or reports endpoints JSM incidents need a second API
Outbound events Webhooks v3: 2xx within 5 s, retries for 48 h, disabled 24 h after 3 drops Webhook integration; description truncated to 1,000 characters JSM documents no retry behaviour
Terraform 51 resources; missing overrides, status pages, roles, Teams 16 resources; missing overrides, syncs, status pages, grouping, chat See below
CLI None official; go-pagerduty ships pd, last release January 2024 None Both are API and Terraform
Regions US and EU, separate API hosts 11 data residency locations; the service registry is not pinned Moving JSM’s region takes alerting offline for up to 24 h

Sources: PagerDuty Events API rate limits (opens in a new tab), REST rate limits (opens in a new tab), webhook behaviour (opens in a new tab), service regions (opens in a new tab), provider (opens in a new tab); JSM REST API (opens in a new tab), webhook integration (opens in a new tab), provider (opens in a new tab), Opsgenie data residency (opens in a new tab).

Terraform on both sides has rough edges an SRE will hit in a first week. PagerDuty’s Event Orchestration router is one resource holding every rule, so per-service modules can’t add their own routes (#648 (opens in a new tab), 26 reactions). On JSM, the services API began rejecting the team-ID format its own docs describe; one team saw “85 services failing” out of 93 “on an apply where every single HTTP call had returned 2xx” (PR #103 (opens in a new tab), open). The JSM provider’s GitHub repository has issues disabled; bugs go to Atlassian’s tracker.

Before you commit

When the pager itself fails

Concept PagerDuty JSM
Failure domain Its own multi-region AWS footprint The same Atlassian Cloud site as Jira and Confluence
Recent incident 28 August 2025: ~95% of events rejected with 502 for 38 min; 23% of notifications delayed 5+ min; status page silent for two hours (postmortem (opens in a new tab)) 10–11 September 2025, about 25 hours of degradation in the US region; alerts kept “notifying users, but without the intended content” (status (opens in a new tab))
Upstream outage — 20–21 October 2025: “Atlassian Cloud Services impacted” by the AWS outage, 07:56 to 05:24 UTC (status (opens in a new tab))

Neither tool can tell you it has stopped paging. Keep a check outside both that alerts through another channel.

Before the cutover

  • Recalculate every escalation delay from alert creation, not per level.
  • Decide what replaces urgency, and check that every responder has a notification rule for their phone number.
  • Rebuild PagerDuty workflows and Opsgenie actions as Jira Automation, and test each integration end to end; migrated ones can stop silently.
  • Make dedup keys unique per source, since JSM merges an alias across integrations.
  • Watch every sender for 429 after cutover; JSM gives no usage dashboard.

Sources

Back to all articles

Technologies we work with

  • Argo CD
  • Kubernetes
  • Docker
  • Podman
  • Ansible
  • Jenkins
  • Chef
  • Proxmox VE
  • Google Cloud
  • Linux
  • Red Hat
  • CentOS
  • NGINX
  • Apache
  • Traefik
  • Prometheus
  • Grafana
  • PostgreSQL
  • MySQL
  • MariaDB
  • Redis
  • etcd
  • Qdrant
  • Elasticsearch
  • Logstash
  • Kibana
  • PagerDuty
  • Go
  • Python
  • FastAPI
  • PHP
  • TypeScript
  • React