One screen for every customer domain on your Fly.io apps
See every customer domain across all your Fly.io apps, spot the ones stuck waiting on the customer, and fix them without the command line.
Build me an internal app called the customer domain desk. We onboard customers onto white-label custom domains on Fly.io, and today the only way to check whether a customer's domain is live is to run flyctl against each app, which means nobody in support can answer the question without pulling in an engineer. The people using this app are customer support and onboarding staff, not engineers, so the interface should read in plain language and avoid DNS jargon wherever it reasonably can.
The main view is a single table of every customer hostname we have across all of our Fly.io apps. Build it by calling List Apps for the organization and then List certificates for app for each app, then flattening the results into one list. Each row shows the customer hostname, which Fly app serves it, whether the certificate has been issued or is still waiting on the customer to finish their DNS setup, and how long it has been waiting, calculated from when the certificate was first requested. Sort so everything still waiting is pinned to the top, longest wait first, because those are the customers who are stuck right now. Issued and healthy domains sit below in a quieter section. Walking every app to build this list is a lot of calls and Fly rate limits per action at roughly one request per second, so load the list into app state once with a visible Refresh button and a last-updated timestamp rather than re-walking every app on each render.
Clicking any hostname opens a detail panel for that domain, fed by Get certificate details. The panel translates the certificate's validation state into a short plain-English answer to the question "what is this customer waiting on", and then shows exactly which DNS records the customer still needs to create, presented as a labelled record type, name and value with a copy button on each value so support can read them out or paste them into an email. Include a "Check DNS now" button wired to Check DNS and re-validate certificate so support can re-run validation live while on the phone with the customer, showing the result inline. Throttle that button: certificate authorities rate limit validation attempts, so allow at most one check per hostname per minute, disable the button with a short countdown after each attempt, and never let it be spammed.
Add an "Add a domain" form that takes the customer hostname and the Fly app that should serve it and calls Request ACME certificate. Add a Remove action on each row and in the detail panel that calls Remove certificate, for churned customers. Both sit behind a confirmation dialog that names the hostname being changed, and because removal is destructive the confirmation should make the user re-state the hostname before it proceeds. Fly bills roughly ten cents per hostname per month, so surface the waste angle too: show a count of certificates that have been sitting unissued for a long time, so the team has a concrete reason to clean up domains for customers who are long gone.
Add a "Draft customer instructions" button on the detail panel that kicks off a background agent for that hostname. The agent reads the certificate details and validation state for the domain, works out what is actually blocking issuance (the customer has not added the records at all, added them under the wrong name, pointed them at something else, or the records look correct and simply have not propagated yet), and writes plain-English setup steps aimed at that customer's DNS provider, using that provider's own wording where it can, for example Cloudflare, GoDaddy, Namecheap or Route 53. The output should be a short email-ready message the customer can follow without knowing what a certificate is. The agent writes its draft back into the app, stored against that hostname with a timestamp, and the panel shows the latest draft, whether the agent is currently running, and the previous draft while a new one is being written.
Support can edit the draft in the panel and then send it straight from the app using the Gmail Send a Message action, to a recipient address they type or one stored on the domain record. After sending, record who sent it and when against that hostname, and show that on the row in the main list so the next person can see the customer has already been told.
Keep the copy human throughout. Statuses should read like "Live" and "Waiting on customer" rather than raw certificate states, the stuck duration should read like "waiting 6 days", and any error coming back from Fly should be shown as a short explanation of what went wrong and what to try next, not a raw API error.
What does this prompt do?
- Lists every customer domain across all of your Fly.io apps in one place, showing which app serves it and whether its certificate is live or still waiting, with the stuck ones pinned to the top
- Opens a panel for any domain that spells out in plain language what the customer still needs to set up, plus a button to re-check and finish setup while you are on the phone with them
- Lets you add a new customer domain or remove one for a churned customer, both behind a confirmation step so nothing gets changed by accident
- Has a Draft customer instructions button that hands the job to a background assistant, which works out what is blocking the domain and writes setup steps you can send straight from the app
What do I need to use this?
- A Fly.io account, connected with an access token that covers your whole organization so the app can see every app you run (an app-only token will only ever show one app)
- A Google account connected so the team can email customers directly from the app
- The customer domains you want to track, or you can add them from inside the app once it is running
How can I customize it?
- Narrow the list to specific Fly.io apps or organizations if only some of your products are white-labelled
- Change how long a domain can sit unfinished before the app flags it as stuck, and how prominently stuck domains are highlighted
- Adjust the tone and signature of the drafted customer email, or send it from a shared support address instead of a personal one
FAQs
Do I need to use the command line to check whether a customer's domain is live?
Can someone on the support team use this without asking an engineer?
Will re-checking a domain over and over cause problems?
Does this help me find domains I am still paying for after a customer has left?
Can I email the setup instructions to the customer from the app?
Related templates
A calibration board that lines up every candidate's answer to the same question, hides names until your panel has scored, and writes the agreed rating back.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
Open one board every morning to see every outstanding quote by age and value, decide on each one, and send follow-ups only after you approve them.
See every HoneyBook project's booked revenue next to what actually landed in your bank, chase what is late, and bill the next payment in one click.
Paste a customer email or license key and see every purchase, license, and membership in one place, then refund or reset a key right from the row.
See every contractor's paperwork, bank details and year to date pay in one table, then run and fund this cycle's payment batch from the same screen.
Stop opening a terminal to answer "is my domain live yet?"
Give your support and onboarding team one screen for every customer domain, so nobody has to wait on an engineer to unblock a customer.