Migrating from Statuspage
IsItStillUp’s importer moves a Statuspage page across whole — components, years of incident history with its postmortems, templates, subscribers and your page’s look and feel — in one pass, with a preview before anything is written. This page is the honest version: exactly what comes with you, the few things that can’t, and a cutover you can run in an afternoon without your status page ever being unavailable.
Before you start
You need two things from Statuspage and one decision from yourself.
- Your page ID — the id segment in your management URL:
manage.statuspage.io/pages/<this part>. - An API key — Statuspage → Account Settings → API Keys. IsItStillUp uses it once, for this import, and never stores it. It is held encrypted for the few minutes between the preview and your confirmation, then destroyed.
- A target page in IsItStillUp — importing into an existing page merges into it rather than replacing it, so a fresh empty page is the simplest thing to aim at the first time.
A note on that key: Statuspage has no read-only API keys, so the one you generate can write as well as read. IsItStillUp only ever issues GET requests against it — the importer has no code path that writes to Statuspage — but it is still worth revoking the key once you’ve finished migrating.
Then open Import from Statuspage in your dashboard. The first step is read-only: it fetches everything, shows you counts for each kind of thing, and writes nothing until you press the button.
What comes across
Everything below is what the importer actually does, item by item. “Partly” means it comes across with a caveat worth reading rather than a footnote you can skip.
| What | Status | Detail |
|---|---|---|
| Components | ||
| Components and component groups | Imported | Names, descriptions, display order and one level of grouping. A component whose group is missing is imported at the top level rather than dropped. |
| Current component status | Imported | Statuspage's vocabulary is mapped onto IsItStillUp's: degraded_performance becomes degraded, under_maintenance becomes maintenance, and the rest keep their names. |
| Incidents | ||
| Incidents and maintenance windows | Imported | Up to the 500 most recent, with their original start, resolve and schedule times — not the time you ran the import. Impact becomes severity (critical / major / minor). |
| The update timeline | Imported | Every incident update, with its status and body, in order. An incident with no updates gets one placeholder so its page isn't blank. |
| Backdated update times | Imported | Statuspage lets you show an update at a time other than when it was written. IsItStillUp models the same thing, and the imported update keeps both timestamps. |
| Postmortems / incident reports | Imported | The published body comes across, along with the date it was published. Reports you marked as not needed on Statuspage stay that way, and unpublished drafts are not published for you. |
| Incident templates | Imported | Name, title and body, filed as an incident or maintenance template based on the status the template opens with. |
| Incident template group names | Partly | Statuspage's API exposes which group a template belongs to, but no endpoint that turns that into a name. Grouping is preserved under placeholder names (“Imported group 1”) for you to rename. |
| Subscribers | ||
| Email subscribers | Imported | Confirmed subscribers arrive already verified — they opted in once on Statuspage and are not asked again. Nothing is emailed to them during the import. |
| SMS subscribers | Imported | Statuspage stores a national number plus a country; IsItStillUp needs E.164, so the two are recombined. A number that can't be placed with confidence is reported rather than guessed at — no one gets a text meant for someone else. |
| Unconfirmed and quarantined subscribers | Not imported | Deliberately left behind. An unconfirmed subscriber never completed Statuspage's opt-in, and a quarantined one is an address or number that already stopped accepting mail. |
| Webhook, Slack and Teams subscribers | Not imported | A Statuspage webhook is bound to Statuspage's payload shape, and a Slack subscription is an OAuth grant that can't be transferred. Re-add these in IsItStillUp under Subscribers; the payload format is documented in the API reference. |
| Look and feel | ||
| Page colors | Imported | Background, text, link and border colors become IsItStillUp's page palette; your operational green becomes the accent color. Statuspage's other status colors have no equivalent — IsItStillUp's come from its own design tokens. |
| Logo, favicon and cover image | Partly | Logos and cover images are hotlinked from Statuspage's CDN so your page looks right immediately — re-upload them under Settings → Branding before you close the Statuspage account. |
| Headline, support link and time zone | Imported | The page headline and support URL become branding fields; the time zone is validated as a real IANA zone before it's applied. |
| Custom CSS, HTML and JavaScript | Not imported | Statuspage's API doesn't expose these at all. IsItStillUp supports custom CSS on Pro and above — paste yours in under Settings → Branding. |
| Metrics and history | ||
| Metric definitions | Imported | Name, unit suffix, decimal places, and whether the metric is shown publicly. Limited by your plan's metric allowance, which the preview tells you about before you commit. |
| Metric data points | Not imported | Statuspage has no API for reading historical metric data points, so metric history starts fresh in IsItStillUp — the definitions come across, the charts begin collecting on cutover. |
| Uptime showcase history | Not imported | Statuspage can only report uptime as aggregate percentages over six-month windows, not as the underlying events. IsItStillUp computes uptime from its own monitors, so the graph starts when your monitors do. |
| Accounts and access | ||
| Audience-specific page users | Not imported | Statuspage's page access users authenticate through Statuspage itself. IsItStillUp's private pages use audiences with their own access links or password — recreate them under Audiences and re-share the links. |
| Team members | Not imported | Invite your team under Settings → Members. It's a two-minute job and it's the right moment to prune the list. |
| Third-party integrations | Not imported | Datadog, New Relic, Slack and other wiring configured inside Statuspage stays there. The equivalents in IsItStillUp are set up under Notifications and Monitors. |
Incident history is capped at the 500 most recent incidents and subscribers at 5,000 per channel. If your page is bigger than that, the preview says so before you commit — get in touch and we’ll run the rest.
What can't come across, and what to do instead
Three of the gaps above are worth more than a table row, because each has a workaround that’s better than nothing.
Metric history. Statuspage has no API for reading historical metric data points, so metric history starts fresh in IsItStillUp — the definitions come across, the charts begin collecting on cutover. This is a limit of Statuspage’s API, not of IsItStillUp: it offers endpoints to push data points and to delete them, but none that reads them back. The practical answer is to point whatever was feeding Statuspage — your own collector, or a Datadog / New Relic integration — at IsItStillUp instead. That system still has the history; Statuspage was only ever displaying it.
Page followers on private pages. Statuspage’s page access users are accounts on Statuspage, with logins IsItStillUp has no way to accept. IsItStillUp’s equivalent is an audience: a named group with its own access link, optionally password-protected, that sees a chosen subset of components. Recreate your audiences under Audiences and send out the new links during the overlap week described below — that way nobody is locked out at any point.
Uptime history. Statuspage will only report uptime as a percentage over a window, and only for components with its uptime showcase turned on. There is no per-event history to import. IsItStillUp derives uptime from its own monitors, so set those up early — every day they run before cutover is a day of real history on your new page.
The 15-minute cutover
The import itself is the short part. Here is the whole sequence, with rough timings, assuming you already have an IsItStillUp account.
- Create the page (1 min). Name it and pick a slug. Leave the branding alone — the import fills it in.
- Preview the import (2 min). Paste your Statuspage page ID and API key. Read the counts against what you know is on the old page. Nothing has been written yet.
- Run it (1–3 min). Leave “Also import look & feel” ticked unless you’re redesigning at the same time — one change at a time is easier to debug.
- Spot-check (5 min). Open the public page. Check the newest three incidents, the component tree, and your subscriber counts by channel.
- Set up your domain (3 min). Add your status hostname under Settings → Domain and create the CNAME it gives you. Do not remove the Statuspage record yet — see the overlap section.
- Point your monitors and integrations at IsItStillUp (5 min). Create an API key under Settings → API keys and swap the base URL in whatever opens incidents automatically.
That is a working status page with your full history on it. Everything after this point is about retiring the old one safely.
Zero-downtime overlap
Don’t cut over in one step, and don’t cancel Statuspage the same day. Run both for about a week, with a clear rule about which is authoritative:
- Days 1–7: IsItStillUp is where you post, Statuspage is read-only. Every new incident and maintenance goes into IsItStillUp. Nobody posts to Statuspage. The old page stays up, unchanged, as a fallback and as a reference.
- Move DNS when you’ve had a real incident. The confidence you want isn’t “the import looked right”, it’s “we ran an incident through this and the notifications arrived”. If a quiet week gives you no incident, post a short scheduled maintenance and watch it land.
- Lower your DNS TTL first. Drop the record’s TTL to 300 seconds a day before you switch it, so a rollback takes five minutes instead of an afternoon. Raise it again once you’re settled.
- Re-run the import right before you close the account. It fills gaps rather than duplicating, so anything that happened on Statuspage during the overlap gets picked up.
The subscribers are why this ordering matters. They came across already verified, so they start receiving IsItStillUp’s notifications from the moment you post here — which means during the overlap they are already being served by the new page, before the URL they bookmarked has moved. That’s the property that makes the switch invisible to them.
Your existing tooling keeps working
The reason most Statuspage migrations stall isn’t the data — it’s the pile of scripts, bots and runbooks that call the API. IsItStillUp’s REST API covers the same operations with the same vocabulary: components with a status you flip, incidents you open with a body and a list of affected components, updates you append, maintenance you schedule. In most cases the change is a base URL and a key, not a rewrite.
# Before (Statuspage)
curl -sS "https://api.statuspage.io/v1/pages/$PAGE/incidents" \
-H "Authorization: OAuth $STATUSPAGE_KEY" \
-d "incident[name]=Elevated error rates" \
-d "incident[status]=investigating"
# After (IsItStillUp)
curl -sS "$BEACON_URL/api/v1/pages/$PAGE_ID/incidents" \
-H "Authorization: Bearer $BEACON_API_KEY" -H "Content-Type: application/json" \
-d '{"title":"Elevated error rates","status":"investigating","body":"We are investigating."}'Two differences to know about. IsItStillUp takes JSON bodies and a bearer token rather than form-encoded fields and OAuth. And an incident here always opens with an update body, because a status page entry with no text on it helps nobody.
Beyond that: the same key drives an MCP server if you’d rather an agent operated your status page, and incident webhooks are signed so you can verify them. Both are covered in the API reference. Watching a third-party MCP server as one of your dependencies? See MCP status.
Re-running the import
The importer is safe to run more than once against the same page. It doesn’t duplicate what it already brought across, and each re-run is an upgrade rather than a copy:
- Components and templates are matched by name, so existing ones are reused, not cloned.
- Incidents are matched on title plus start time. An incident that’s already here is skipped — except that a postmortem written on Statuspage since your last run gets filled in.
- Subscribers are matched on their address or number, so only genuinely new people are added.
- Branding is merged, so anything you’ve customized in IsItStillUp since survives a re-run.
This is what makes the overlap week practical: import early, keep working, and re-run just before you close the Statuspage account to sweep up everything that happened in between.
Stuck on something this page doesn’t cover? The import preview reports every case it had to make a judgement call on, and those warnings are the fastest thing to send us.