# Migrate from PagerDuty

EvoHub On-Call has a built-in importer that reads your PagerDuty account with a read-only REST API key and creates the matching schedules, escalation policies and integrations. This page explains how to run it, what it maps and what you finish by hand.

## How PagerDuty concepts map to EvoHub

| PagerDuty | EvoHub | Notes |
| --- | --- | --- |
| Users | Organization members | Matched by email. Invite everyone — EvoHub has no per-seat fee. |
| Teams | Teams | Not created. You choose which of your EvoHub teams each PagerDuty team's schedules, policies and integrations go into. |
| Schedules and layers | Schedules and layers | Imported, in the same time zone. |
| Layer restrictions | Shift windows | Imported when EvoHub can express them (see below). |
| Schedule overrides | Overrides | Not imported; recreate upcoming ones. |
| Escalation policies | Escalation policies | Imported, including loops. |
| Services | — | EvoHub has no services. Each service's integrations are imported with the service's name. |
| Service integrations (Events API v2, email, CloudWatch, Datadog…) | Integrations | Imported, each with a new URL to point the sender at. |
| Event orchestrations and rules | — | Not imported. |
| Notification rules | Notification settings and notification schedule | Not imported; each person sets their own. |

## Before you import

- **Invite your people first.** The importer matches PagerDuty users to EvoHub members by email address. Anyone who is not a member yet is left out of rotations and escalation steps. The preview lists them and, if you are allowed to invite, offers an **Invite N people** button. People who join later can still be added: see [Run it again](#run-it-again).
- **Make sure they can respond to alerts.** Members whose role cannot respond to alerts are also left out, with a warning naming them.
- **Create a read-only REST API key.** In PagerDuty: **Integrations → API Access Keys → Create New API Key**, tick **Read-only API Key** and copy it. A user's personal REST API key also works but only sees what that user can see.

You need the On-Call settings permission to import (Owners, Admins and Members have it by default).

## Run the importer

:::steps
### Open the importer
Go to **On-Call → Import from PagerDuty** (also linked from the **Moving from Opsgenie or PagerDuty?** banner on the Integrations page).
### Enter the key and service region
Paste the **PagerDuty REST API key** and choose the **Service region**: **US** (api.pagerduty.com) or **EU** (api.eu.pagerduty.com). Click **Preview**. The key is used for this import only; EvoHub does not store it.
### Review the preview
Nothing is created yet. The preview shows **People** (who matched), **Teams** (where each PagerDuty team's objects go — by default, your current team), **Schedules** with their layers, **Escalation policies** with their steps and delays, **Integrations** with the EvoHub type each maps to, and every warning. Untick anything you do not want.
### Import
Click **Import N items**. The result lists what was created (with links), what was **Skipped** and why, and the warnings.
### Point your senders at EvoHub
For each imported integration, the result shows its new URL. Update each sender. Alerts reach EvoHub only after you do this.
:::

Only one import runs at a time per organization. If PagerDuty limits the key's requests, the importer waits and retries; if it is still limited, wait a minute and try again.

## What is imported, and how

### Schedules

Each PagerDuty schedule becomes an EvoHub schedule in the same time zone, and each layer becomes a layer. PagerDuty's top layer — the one that wins — becomes EvoHub's first layer.

- **Turn lengths** of whole days carry over: one day is daily, seven days is weekly, any other number of days is a custom rotation. Turns of hours are rounded to whole days, with a warning; for shifts shorter than a day, give each shift its own layer with a shift window after importing.
- **Restrictions** become shift windows when EvoHub can express them: one daily window (it may run past midnight, such as 22:00–06:00), the same window on selected weekdays (such as Mon–Fri 09:00–17:00), or whole days (such as Saturday and Sunday). Two daily windows, or a weekly restriction that runs across days (Friday 18:00 to Monday 09:00), are not imported; the layer covers the whole day and a warning tells you to set a shift window.
- Layers that have already ended are skipped. A layer with a future end date is imported without it (EvoHub layers have no end date), and one that only starts in the future starts from the import; both get a warning.
- Each person is kept once, in order.

### Escalation policies

Each PagerDuty escalation policy becomes an escalation policy, and each target of a rule becomes a step:

- Steps can target a **user** or a **schedule**.
- PagerDuty's delay is the wait *after* a rule; EvoHub's is the wait *before* a step, using 1, 2, 3, 5, 10, 15, 30 or 60 minutes. The importer converts them so each step lands as close as possible to its PagerDuty time and warns about any difference.
- A rule with several targets notifies them at once in PagerDuty; in EvoHub each target is its own step, a minute apart.
- **Loops** become repeats, up to EvoHub's maximum of 5, after the last rule's delay.

### Integrations

PagerDuty services are not imported as services — EvoHub has none. Instead, each integration of an active service becomes an EvoHub integration named **Service · Integration** (for example "Checkout API · Events API v2"), attached to the service's escalation policy if that policy is imported.

- **Events API v2** integrations become EvoHub **API** integrations, which accept the Events API v2 format as it is: the same body, the same `dedup_key`, and the same answer (`202` with `status`, `message` and `dedup_key`). The sender changes only two things: the URL (`https://events.pagerduty.com/v2/enqueue` → the integration's URL) and the `routing_key`, which must be the new integration's key. A `routing_key` in the body is read before the `?key=` in the URL, so the old one must not stay.
- An integration made for a tool EvoHub has its own integration for (Datadog, Prometheus, Grafana, New Relic, Amazon CloudWatch, Sentry and others) becomes that integration; point the tool at its URL in the tool's own settings.
- **Email** integrations become email integrations with a new address.
- **Events API v1** integrations are imported, with a warning: EvoHub reads the v2 format, so switch the sender to v2 when you point it at EvoHub. **Change events** are not read.
- Integrations of disabled services are not imported.

## Run it again

You can run the importer again at any time. Items that were already imported are marked and skipped, so a re-run never creates duplicates.

A schedule imported before that people have joined since — they were invited after the first run, or were given a role that can respond — shows **Add N new people**. Tick it and import: they are added at the end of their layers. Nobody is removed or reordered, and changes you made to the schedule stay. Adding people changes who is on call from then on, so check the schedule afterwards.

## What you recreate by hand

The preview lists these under **Not imported yet**: services, schedule overrides, team members, event orchestrations and rules, response plays, business services and status pages, maintenance windows, notification rules and change events. Recreate upcoming **overrides** and **maintenance windows** in EvoHub, and ask each person to set [their own notifications](https://docs-dev.evohub.io/notifications.md).

## Run both in parallel, then cut over

Where a sender supports several destinations, add the EvoHub URL next to PagerDuty for a week or two, fire a test alert through each integration, and compare what each paged. Then remove the PagerDuty destinations.

The import itself is free. Alerts and notifications in EvoHub are billed by usage — see [How billing works](https://docs-dev.evohub.io/how-billing-works.md). For help planning a migration, contact info@evosync.io.

## Related

- [Migrate from Opsgenie](https://docs-dev.evohub.io/migrate-from-opsgenie.md)
- [Integrations overview](https://docs-dev.evohub.io/integrations-overview.md)
- [Schedules and rotations](https://docs-dev.evohub.io/schedules-and-rotations.md)
- [Escalation policies](https://docs-dev.evohub.io/escalation-policies.md)
