Support playbook
How to help a Fly.io customer who is stuck: what to ask first, a table of the twelve failures that account for most tickets (with the command to diagnose and the docs page that fixes it), what each support plan includes, where to escalate, and a reply template that cites the docs. Everything here is advice built on cited facts; where the sources do not settle something it is flagged
[verify].
This page is drawn from https://fly.io/docs/getting-started/troubleshooting/, https://fly.io/docs/monitoring/error-codes/, https://fly.io/docs/about/support/, https://fly.io/support, https://fly.io/docs/apps/trouble-host-unavailable/, https://fly.io/docs/reference/health-checks/ and live community.fly.io threads fetched 2026-11-04.
Triage order
Work from the widest scope to the narrowest. Most “my app is broken” reports are one of: the platform, a host, a deploy, or the app itself.
flowchart TD
A[Customer reports a problem] --> B{Status page or dashboard<br/>shows an incident?}
B -- yes --> C[Confirm region and host, share the link, advise redundancy]
B -- no --> D{Did it start after a deploy?}
D -- yes --> E[Deploy path: logs, fly.toml, health checks, listen address]
D -- no --> F{Machines started?}
F -- no --> G[Machine state: restart, OOM, host unavailable]
F -- yes --> H[Routing and app: error code, checks, DNS, certs]- Check platform health first: the status page (https://status.flyio.net) is the place for platform-wide issues, and the dashboard shows host-level issues that might affect an app (https://fly.io/docs/about/support/).
- Host issues are not posted on the main status page: “We don’t post individual host issues to our main status page because a host issue usually affects a small number of users in a single region” is the docs’ reasoning, and affected customers get a notice on the Status page in their dashboard (https://fly.io/docs/apps/trouble-host-unavailable/). So a green public status page does not rule out a host problem.
- The docs’ own “try this first” list is: update flyctl (
fly version update), runfly doctor, validatefly.tomlwithfly config validate, watchfly logs, andfly ssh consolein (https://fly.io/docs/getting-started/troubleshooting/).
The first five questions
Ask for these in one message so the customer answers once. They match what Fly’s own support page asks customers to include in a ticket (https://fly.io/docs/about/support/).
- App name and organization.
- Region(s) and, if they know it, the Machine ID (
fly machine list). - Output of
fly status,fly logs(with UTC timestamps) andfly doctor. Ask for plain text, not screenshots (https://fly.io/docs/about/support/). - What changed: a recent
fly deploy, a fly.toml edit, a secret change, a scale command. - What they expected versus what happened, with the exact error text or proxy error code (for example
PR01,PC05,PM03; the full list is at https://fly.io/docs/monitoring/error-codes/).
Tip from the support page: prefixing any flyctl command with LOG_LEVEL=debug shows the lower-level API calls (https://fly.io/docs/about/support/).
Common failures
| Failure | Likely cause | Diagnose | Fix page |
|---|---|---|---|
| Deploy fails | Build hangs on the Depot builder; release command error; image over the 8GB limit; registry 401 | LOG_LEVEL=debug fly deploy, then fly deploy --depot=false or fly deploy --local-only to isolate the builder | https://fly.io/docs/getting-started/troubleshooting/ |
| Health checks failing | Grace period too short, non-200 on the check path, app not accepting connections, OOM | fly checks list, fly status, fly logs | https://fly.io/docs/reference/health-checks/ |
| 502, 503, “no route”, PR01 | App listening on 127.0.0.1 instead of 0.0.0.0, wrong internal_port, all Machines stopped or unhealthy, concurrency limits | fly status, fly checks list, fly logs; match the code to https://fly.io/docs/monitoring/error-codes/ | https://fly.io/docs/getting-started/troubleshooting/ |
| Machine will not start or keeps restarting | Process exits immediately (no CMD), crash loop, Machine stuck in starting or replacing | fly machine status <id>, then fly machine restart <id>; last resort fly machine destroy --force <id> | https://fly.io/docs/getting-started/troubleshooting/ |
| Out of memory | Machine too small; OOM looks like a crash to the proxy | fly machine status <id> (look for OOM kill events), then fly scale memory 512 as the docs example | https://fly.io/docs/getting-started/troubleshooting/ |
| Volume will not mount, or “I have one volume” | A volume attaches to one Machine and lives on one host; host down means volume unreachable | fly volumes list, fly volumes snapshots list <vol> | https://fly.io/docs/volumes/overview/ and https://fly.io/docs/apps/trouble-host-unavailable/ |
| DNS or certificate stuck | Mixed CNAME with A/AAAA records, Cloudflare proxy in front, Let’s Encrypt limits | fly certs show <host> | https://fly.io/docs/networking/custom-domain/ and https://fly.io/docs/networking/understanding-cloudflare/ |
| Region or capacity error on create | Region out of capacity; a multi-region scale fails as a whole; volume’s host full | fly platform regions, retry with a fallback list such as fly machine clone -r "iad,dfw" | https://fly.io/docs/machines/guides-examples/machine-placement/ |
| Rate limited | Machines API: 1 request per second per action, burst up to 3; Let’s Encrypt: 5 failed validations per hostname per hour; image pulls from non-Docker-Hub registries | Check the HTTP 429 or “too many requests” text | https://fly.io/docs/machines/api/working-with-machines-api/ |
| Billing surprise | Volumes bill even when unattached; stopped Machines bill rootfs at $0.15 per GB per month | fly volumes list, fly machine list, dashboard Billing section | https://fly.io/docs/about/billing/ |
| Postgres connection problems | Managed Postgres (.flympg.net) is private-network only; unmanaged Postgres is out of support scope; Redis clients need IPv6 | fly mpg connect, fly mpg proxy, fly mpg status | https://fly.io/docs/getting-started/troubleshooting/ |
| WireGuard or 6PN issues | Peer not created, local WireGuard tunnel down, service not bound to fly-local-6pn | fly doctor, fly wireguard list | https://fly.io/docs/blueprints/connect-private-network-wireguard/ and https://fly.io/docs/networking/private-networking/ |
Facts behind the rows, each from the docs:
- Apps must listen on “0.0.0.0” at the
internal_port; frameworks that default to localhost (Rails, Django, Next.js are named) need the host set explicitly (https://fly.io/docs/getting-started/troubleshooting/). - A failing health check stops routing to the Machine but does not restart or stop it: “your Machines won’t automatically restart or stop due to failing their health checks” (https://fly.io/docs/reference/health-checks/).
- PR01 “No healthy machines” has four named causes: restart retries exhausted by boot errors, failing deployments with volumes, the
immediatedeploy strategy, and concurrency limits reached (https://fly.io/docs/monitoring/error-codes/). - When all Machines are scaled to zero, the size resets to shared-cpu-1x with 256MB, so re-size when scaling back up (https://fly.io/docs/apps/trouble-host-unavailable/).
- Placement can fail, and “it’s on you to retry requests” when using the Machines API or flyctl at that level of control (https://fly.io/docs/machines/overview/).
- The Machines API limit is “1 request, per second, per action” with a burst up to 3 req/s (https://fly.io/docs/machines/api/working-with-machines-api/).
- Raw TCP over shared IPv4 does not work; allocate a dedicated IPv4 with
fly ips allocate-v4or use.internaladdresses (https://fly.io/docs/getting-started/troubleshooting/). - Volume corruption (
unable to read superblock) is recoverable only from a snapshot; the docs say to always enable snapshots (https://fly.io/docs/getting-started/troubleshooting/).
Plans and what each includes
Support has four doors. Verified on https://fly.io/support on 2026-11-04.
| Door | Cost | What you get |
|---|---|---|
| Community forum | Free | Open to everyone; “Questions / Help” topics are seen by Fly.io staff, who respond more often than before (https://community.fly.io/t/fly-io-support-community-vs-email-2026-edition-read-this-first/27768) |
| Standard | $29/mo | 36-hour first response, technical architecture support (https://fly.io/support) |
| Premium | $199/mo | 24-hour first response, 1-hour for urgent issues, dedicated Slack channel, quarterly Solutions Architecture sessions (https://fly.io/support) |
| Enterprise | $2,500+/mo | 4-hour 24x7 first response, 15-minute emergency response, dedicated Slack channel, quarterly Solutions Architecture sessions, 99.9% uptime SLA (https://fly.io/support) |
- Paid plans give an organization-specific address, typically
<org-name>@support.fly.io, plus the Support Portal in the dashboard; Managed Postgres customers also get Portal access for MPG issues (https://fly.io/docs/about/support/). - Billing and account questions go to billing@fly.io (https://fly.io/docs/about/support/).
- Published results, 30-day email metrics: “100%” of response-time promises kept, median ticket answered in “1h 12m”, “97.0%” of surveyed customers positive (https://fly.io/support). These move; re-read the page before quoting them.
- Scope: supported products include Networking, Machines, Managed Postgres, Apps, Launch/Deploy, Volumes, Security, Accounts and Billing, Extensions and Monitoring. Not supported: LiteFS and Unmanaged Postgres. Support also cannot debug the customer’s own code or framework (https://fly.io/docs/about/support/).
Escalation path
- Self-serve: troubleshooting page and error-codes page (links above).
- Community forum post, with the five answers above. Staff reply there too (example: a host-down thread answered “It was purely a host problem in this case”, https://community.fly.io/t/machine-stuck-in-stopping-on-sin-host-start-restart-kill-return-408-vm-cpu-starved-no-incident-posted/28962).
- Paid email or Support Portal ticket for anything account-specific, sensitive or urgent; Fly staff say support plan tickets “are given priority over other channels” (https://community.fly.io/t/fly-io-support-community-vs-email-2026-edition-read-this-first/27768).
- Premium urgent (1 hour) or Enterprise emergency (15 minutes, 24x7) when production is down (https://fly.io/support).
- Inside Fly, how a ticket reaches engineering is not documented publicly
[verify].
Customer reply template
Use plain text, name the evidence, cite the page, give one next step.
Hi NAME,
Thanks for the detail. From the
fly statusoutput, Machine MACHINE_ID in REGION shows STATE, and your logs at TIMESTAMP_UTC show ERROR_OR_CODE.That error means CAUSE (https://fly.io/docs/monitoring/error-codes/). The usual fix is FIX, described at DOCS_URL.
Please try:
COMMAND. If it does not clear, reply with the output offly status,fly logsaround the failure (UTC) andfly checks list, and we will look at the host side.One more thing: this app runs on a single Machine, so a host problem takes it down. The docs recommend at least two (https://fly.io/docs/blueprints/resilient-apps-multiple-machines/).
Say: “I can see X in your output” before “you should do Y”. Do not promise a root cause until the host has been checked; host issues are not on the public status page (https://fly.io/docs/apps/trouble-host-unavailable/).