on this page

MastMoving from Opsgenie

Moving from Opsgenie

Opsgenie shuts down on 2027-04-05. Atlassian's own migration path runs 120 days of parallel access and deletes whatever has not moved by the shutdown date, so for most teams the real month is March 2027, and the tooling below is scheduled to be ready before it. This page is written before the importer exists. Where it says what the importer takes, that is the design; the line near the end says what you can do with it as of this page.

Grafana OnCall OSS is a different story. The project was archived on 2026-03-24 and its cloud connection stopped the same day. There is no OnCall importer and none is planned: what you can do is export from a still-running OnCall instance, which its API supports, and re-create by hand or through channels as code. The re-key checklist below applies to that path too.


What the importer takes

The importer reads an Opsgenie export and creates three kinds of things on your Tissue account.

Users, matched by email. Each Opsgenie user becomes an invitation to the account under the same email address. A person who already belongs to the account is matched to that membership. The match is by exact email; a user in Opsgenie under d.smith@example.com and on Tissue under dsmith@example.com is two people until you say otherwise, and the dry run below names every one it could not match, because an unmatched user is a rotation slot that is silently empty. Team membership in Opsgenie decides which people are proposed for which schedule.

Channels. Every Opsgenie integration that could raise an alert (API, email, a monitoring tool's webhook) becomes a channel on your account, named after the integration, with a fresh key. Alert priority P1 and P2 map to a loud channel, P3 and below to a quiet one; you can change any of it after the import. The integration's own key does not transfer. See the re-key checklist.

Schedules. A schedule with one weekly, daily or hourly rotation and a fixed set of participants comes over as a Mast schedule with the same rotation length, start day and time zone. Overrides inside the next twelve months come over as overrides. Escalation policies come over as one policy per Opsgenie escalation, with each step's delay and who it goes to.

What never transfers

These are the same for every tool that imports from Opsgenie, and they are the reason a printed checklist exists.

  • Integration keys and webhook secrets. An Opsgenie API key is a credential for Opsgenie, and it stays there. Every monitor, script and pipeline that posted to Opsgenie needs a new URL, which is a Mast key.
  • Time-restricted and overlapping rotations. A rotation that is on duty only between 09:00 and 17:00, or two rotations layered on one schedule, has no single equivalent. The importer creates the schedule with the plain rotation and lists the restriction in the report so you can decide what to do with it.
  • Overrides beyond the twelve-month iCal window. Opsgenie's export carries a year of overrides. Anything further out is not in the file.
  • Escalation repeat semantics. Opsgenie can repeat an escalation policy from the top a fixed number of times, with its own interval and a reset when the alert is acknowledged. Mast escalation runs each step once, and the page keeps repeating on every phone it reached until someone acknowledges it. The importer keeps the steps and drops the repeat count, and says so in the report.
  • Historical alerts. Closed alerts, notes, and the acknowledgement history stay in Opsgenie. Export them there for your own records before the shutdown; nothing on the Tissue side reads them.
  • Notification rules per user, on-call reminders, heartbeats. A person's own "SMS after 5 minutes, then call" rules have no equivalent: Mast pages the phone and the phone's own settings decide the rest. Opsgenie heartbeats are close to vitals, but they are re-created from the checklist, not imported, because the thing that beats needs a new URL anyway.

The re-key checklist

The importer prints this at the end of a real run, one line per channel it created, and you can print it from the dry run as well. It is the list of everything that used to point at Opsgenie and has to point at Mast instead.

integration                    opsgenie key        new mast URL
Prometheus (prod)              ge2…b41  (revoke)   https://mast.tissue.dev/mk_7c1a…
Datadog                        a90…f02  (revoke)   https://mast.tissue.dev/mk_2e9d…
backup-cron (email)            ops+backup@…        https://mast.tissue.dev/mk_5f30…/fail

Work through it in this order:

  1. Update the senders first, while Opsgenie still accepts alerts, so both receive for a day or two and you can compare. A Prometheus Alertmanager receiver, a Datadog webhook or a shell script changes one URL. Anything that sent email to an Opsgenie address needs a real change, since Mast has no email ingest; a curl in the same cron line is the usual replacement.
  2. Send one test page per channel from the sender itself, not from curl on your laptop, and watch it land on the phone that owns the channel.
  3. Revoke the Opsgenie keys once every sender has moved. A key left live is a monitor that still pages the wrong place after the shutdown date.
  4. Turn heartbeats into vitals. Each Opsgenie heartbeat becomes one vital with the same interval; the job that pinged Opsgenie pings the vital's URL instead.
  5. Check the schedule on the phone, in the app, for the coming week. A rotation whose participants were unmatched shows the gap there.

Keys are readable back from GET /v1/mast/state at any time, so the printed list is a convenience, not the only copy.

The dry-run report

--dry-run reads the export, touches nothing, and prints what a real run would do and what it could not do:

users        14 in export   11 matched   3 unmatched
  unmatched: j.doe@example.com, oncall@example.com, m.li@example.org
channels     9 to create    (0 exist already)
schedules    3 to create    1 with a time restriction (Weekday business hours), kept as a plain rotation
policies     2 to create    1 repeats 3 times in Opsgenie; Mast repeats the last step until acked
overrides    17 inside the 12-month window, 0 beyond it
not imported: 2,340 closed alerts, 14 per-user notification rules, 4 heartbeats (see checklist)

Fix the email mismatches on the account (invite the person under the address Opsgenie has, or change the address in their profile) and run the dry run again until the unmatched line is empty. Then run it for real. A real run is idempotent by name: running it twice creates nothing twice, and a channel you renamed after the first run is left alone.

What is available today

The importer is not built yet. What works as of this page:

  • The Opsgenie export itself, from Opsgenie's settings, which is worth taking before anything else: it is the file the importer will read, and it is the only copy of your history after the shutdown.
  • Channels as code, which creates channels and vitals from a catalogue file and reads the keys back. Writing the catalogue from the export's integration list is a few lines of jq, and it gets you the channels and the re-key list without waiting.
  • The account's members page, for inviting people under the email address Opsgenie has for them, which is the one thing worth doing early because the match is by email.

Schedules and escalation policies are on the Team and Company plans, which are listed after the importer. Until then a channel per team with the team's phones on it is the working substitute.