Migrate from Better Stack
Guided one-shot migration of Better Stack teams, on-call configuration, heartbeats, supported monitors and status pages, with an explicit cutover report.
Overview
HowlOps reads the Better Stack Uptime API and builds one dependency-aware preview before it writes anything. The migration can create referenced teams and invited identities, heartbeats, a reviewed on-call subset, supported monitors and unpublished status pages. Unsupported or secret-bearing behavior stays visible as a skipped cutover item. HowlOps never changes Better Stack and never stores the API token.
Use a short-lived team-scoped token (an Uptime API token scoped to that team) when migrating one team. A global token can discover teams referenced by exported resources. Better Stack does not publish a REST endpoint that lists every team. For an otherwise empty team, run a team-scoped import and enter its real, unique Source team label. The scoped members response omits the team identity, so HowlOps uses this label as the stable source ID; a missing label fails preview instead of merging multiple empty teams.
Run the migration
- Open Settings → Import, choose Better Stack, and paste the token from Better Stack → API tokens.
- Select Run read-only preview. Review the Exact, Imports with changes and Unsupported rows and their dependencies, then download the complete cutover-preview CSV. The final job report contains the rows you selected; the preview CSV is the complete manual inventory.
- Select the graph you want. A schedule or monitor cannot be selected without its required team, schedule or policy unless that dependency was linked by an earlier run.
- Select people to invite. New identities remain invited; their team, rotation, override and escalation bindings become active after they accept and first sign in.
- Confirm the one-shot import and download the job CSV report. Confirmation is bound to secret-free item fingerprints and current invitation candidates. If the source changes after preview, HowlOps performs no writes and asks for a new preview. Re-running is idempotent: linked resources are skipped, and source drift is reported instead of overwriting later HowlOps edits.
What is imported
| Better Stack resource | HowlOps result | Fidelity and limits |
|---|---|---|
| Referenced or team-scoped empty team | Team | Team names are the source identity. Members and pending invitations are attached to the matching team. A scoped empty team requires a unique user-supplied label. team_lead maps to team lead; organization admin is reduced to team lead and marked lossy; billing/custom roles become members with a warning. |
| Heartbeat | Heartbeat | Period, grace and team import. Every heartbeat is staged paused until the job uses its newly generated HowlOps URL. Source timezone/DST, heartbeat-group membership, per-heartbeat policy, delivery flags and recurring maintenance remain explicit review items. |
| On-call schedule | Schedule | Hourly and every-N-hour/day/week rotations import with their exact elapsed-minute cadence in UTC, ordered email participants, and exclusive end boundary. Only events marked override=true become overrides; generated base events are not duplicated. An invalid or simultaneous multi-user override fails the whole schedule closed instead of importing incomplete coverage. |
| Linear escalation policy | Escalation policy | Whole-minute delays and user, current-on-call/default schedule, entire-team and explicit schedule recipients import. Repeats import when their delay is a whole number of minutes. |
| Status / expected-status monitor | HTTP monitor | URL, method, interval, HTTP timeout in seconds, expected codes, redirect/IP preference and supported expiry switches import. Source-paused and lossy monitors are created atomically paused. |
| Keyword / keyword absence | Keyword monitor | Requires a non-empty keyword; malformed source rows are skipped instead of becoming a different check. |
| Ping / TCP | Ping / TCP monitor | Target, interval and TCP port import. Better Stack expresses these timeouts in milliseconds; their provider-specific timeout is reported as a difference. |
| Status page with direct monitor resources | Unpublished status page + active components | Created only when every direct monitor reference is importable or already linked. Each direct monitor resource becomes a named, ordered component whose live state is computed from the imported monitor. Otherwise the whole page remains manual. The page is never published during migration. |
Monitor groups, heartbeat groups, policy/severity groups, metadata-rule ownership, every status-page component and all discoverable integration families are included as credential-redacted cutover inventory. Resolved incident history can be selected and is created as inert resolved history with lifecycle timestamps, acknowledgement time, monitor/team ownership, name and cause. Active incidents remain inventory-only and never start a second escalation. Response bodies, metadata values, delivery details, comments, attachments and timeline payloads are not copied. Status-page inventory retains component identity, type, placement, widget and whether incident-metadata rules exist; arbitrary rule keys/values and explanations are hidden. Resource names and team metadata remain visible and may contain user-entered PII; credential values and arbitrary record payloads do not. To keep history from blocking configuration migration, preview processes at most 10,000 incident rows and tells you to export any remainder separately.
What fails closed or remains manual
- Event-only or malformed schedule rotations are not approximated. A malformed or multi-user simultaneous override makes the entire schedule unsupported.
- Policy time/metadata branching, wait-until rules, instructions/reminders, resolve/remove actions, fallback policies, integration targets and non-minute delays make that policy unsupported. HowlOps never creates a shorter active escalation path by dropping those steps.
- UDP, SMTP, POP, IMAP, Better Stack DNS-server and Playwright monitors are not converted into different checks.
- HTTP request headers, bodies and authentication are not copied because arbitrary values can contain credentials. URL userinfo and URLs with query parameters fail closed and must be recreated without exposing their values. A monitor with omitted behavior is staged paused for review.
- Better Stack severity (
urgency_id) delivery preferences do not have a one-to-one policy-step mapping. The escalation structure is retained with a warning; review HowlOps notification preferences before resuming dependent monitors. - Monitor/heartbeat regions, heartbeat timezone/DST and group membership, proxy credentials, recovery/confirmation behavior, cookie persistence, exact SSL/domain thresholds and recurring maintenance may require manual configuration as listed on each preview row.
- Status-page heartbeat/group/manual/integration components, section layout, metadata status rules, reports/history, branding, custom CSS/JavaScript, custom domains, passwords, allowlists and subscribers are not activated. Direct monitor components become live after the page is reviewed and published.
- Slack, Teams, Jira, PagerDuty, outgoing/incoming webhooks and other integrations require a new HowlOps endpoint or authorization. Provider-bound webhook URLs, routing keys, passwords, headers and templates are never copied into the preview.
- Only resolved incident lifecycle history is imported. Active incidents, response payloads, metadata values, comments, attachments and timeline payloads remain in Better Stack; export them separately for your required retention period.
Do not disable Better Stack after the import count alone looks correct. A complete cutover also requires the downloaded preview inventory, changed-items job report, new heartbeat and webhook endpoints, notification tests and deliberate status-page publication.
Validate and cut over
- Invite or verify every person used by a schedule or policy, then confirm that pending bindings appeared after sign-in.
- Review each imported schedule in calendar preview, including hand-off time, order, overrides and the preserved Better Stack rotation end.
- Re-enter monitor secrets, recreate notification channels and test every policy with a controlled incident.
- Point heartbeat jobs and incoming provider integrations to their new HowlOps endpoints.
- Review the unpublished status page, configure its domain/password/subscribers, then publish it deliberately.
- Run both platforms in parallel for at least 24 hours. Test failure, acknowledgement, escalation, resolution and status-page updates before disabling Better Stack.
ChatOps
Slack or other ChatOps installations are identities and OAuth grants owned by Better Stack. They cannot be transferred. Install the HowlOps ChatOps integration, authorize the destination workspace/channel, test acknowledgement and resolution, and only then disconnect the Better Stack app.
Related documentation
Was this page helpful?