Find the Fly.io resources quietly billing you every month

Every Monday we scan your Fly.io org for detached volumes, idle IP addresses, and forgotten preview apps, then post a ranked cleanup list to Slack.

Agentic Task
Fly.ioGitHubSlack BotEngineeringOperationsResearch & MonitoringAI Reports
PromptCreate

Every Monday at 9am, audit my Fly.io organization for resources that keep billing me when nothing is actually running, and post the findings to Slack as one message. This is an audit of idle and orphaned resources, not a scheduler that stops running Machines. Do not stop, scale, create, or delete anything at any point.

Start with Fly.io List Apps to get every app in the organization. Then, for each app, call List Machines, List Volumes, and List IP assignments for app. This needs an account-level Fly token that can see every app, because a token scoped to a single app cannot list apps or read organization-wide data. Fly rate limits are roughly one request per second per action, so page politely across the apps instead of firing every request at once. Where a list is cursor-paginated, such as the organization-wide List All Volumes, keep asking for the next page until no cursor comes back: a short page is not proof that you reached the end.

Look for three specific leaks. First, volumes attached to no Machine at all. Fly bills persistent volumes hourly whether or not a Machine is running, so a detached volume is pure waste. Second, apps where every Machine is stopped or destroyed but a volume or a dedicated IPv4 address is still assigned. These look dormant in the dashboard while still appearing on the invoice. Third, leftover pull request preview apps, which Fly's standard review-apps setup names in the pattern pr-123-myrepo.

For each app matching that preview naming pattern, pull the pull request number and the repository name out of the app name, then cross-check with GitHub List Pull Requests across all states rather than open ones only. Use Get a Pull Request when you need the precise merge or close date for a specific number. If the pull request is already merged or closed, say so in the report along with how long ago it happened, so the finding reads as "PR 412 was merged six weeks ago and this app was never torn down" rather than as a bare app name. If a preview app has no matching pull request, flag it as unmatched instead of guessing.

Estimate a monthly cost for every item using Fly's published rates: persistent volume storage is billed per GB per month against the volume's provisioned size, and a dedicated IPv4 address is $2 per month. Label these clearly as estimates and note that published rates can change. Rank every finding by how much money is at stake, largest first, so the top of the message is the most expensive thing to fix.

Post one Slack message with Send a Message, not one message per finding. Open with the total estimated monthly spend at stake across everything found, then group the findings by app, listing each item underneath its app with its estimated monthly cost and a one-line reason it was flagged. If the audit turns up nothing, still post a short all-clear so the silence is never ambiguous.

Only ever recommend, never delete. A detached volume can still hold real data, and an IP address that looks unused may still be referenced by DNS. Close the message with the exact fly commands to clean up each item so a human can copy them after checking: fly volumes destroy <volume-id> for a detached volume, fly ips release <address> --app <app-name> for a dedicated IPv4, and fly apps destroy <app-name> for a dead preview app. Put a one-line warning above the commands that destroying a volume permanently deletes its data.

Finish the message with a short standing reminder that Fly's managed add-ons, including Managed Postgres, Upstash Redis, and Tigris object storage, are billed separately and are not removed when an app is deleted, so they are worth a manual look during cleanup.

What does this prompt do?

  • Checks every app in your Fly.io organization once a week and finds what is still costing money when nothing is actually running.
  • Catches the three usual culprits: storage volumes no longer attached to anything, apps that are fully stopped but still holding a paid IP address, and preview apps nobody ever tore down.
  • Cross-checks leftover preview apps against GitHub, so the report can tell you the pull request was merged or closed weeks ago and the app was never cleaned up.
  • Posts a single Slack message grouped by app, with an estimated monthly cost per item, the biggest savings first, and the exact cleanup command for each one. It never deletes anything.

What do I need to use this?

  • A Fly.io account, plus an account-level access token that can see every app in your organization rather than just one app.
  • A connected GitHub account, so leftover preview apps can be matched back to the pull request that created them.
  • A Slack workspace and a channel where the weekly report should land.
  • Optional: the naming pattern your preview apps use, if it is not the standard pr-123-yourrepo.

How can I customize it?

  • Change the timing. Monday at 9am is a sensible default, but monthly works well if your infrastructure does not move much.
  • Send it somewhere else, such as a private channel or a direct message, if cost details are sensitive.
  • Set a minimum monthly cost so small items stay out of the report, and adjust the naming pattern it treats as a preview app.

FAQs

Will this delete anything from my Fly.io account?
No. It only ever recommends. That is deliberate: a volume that is no longer attached to anything can still hold real data, and an IP address that looks unused might be pointed at by DNS somewhere. You get a list and the exact commands, and you decide what actually goes.
Why am I being charged when all my apps are stopped?
Stopping the machine does not stop every charge. Storage volumes are billed by the hour whether or not anything is running on them, and a dedicated IPv4 address carries its own monthly fee. So an app that looks completely dormant in your dashboard can still show up on the invoice, month after month.
How accurate are the cost estimates?
They are estimates based on Fly's published rates, and they are meant for ranking rather than accounting. They are good enough to tell you which item is worth dealing with first. For exact figures, check your actual Fly invoice.
What if our preview apps are not named pr-123-myrepo?
That pattern is what Fly's standard preview app setup produces, so it is the default. If your team names them differently, tell the workflow your pattern and it will match on that instead. Anything it cannot match to a pull request gets flagged as unmatched rather than guessed at.
Does a regular Fly login work, or do I need something special?
You need an access token that can see every app in your organization. A token created for deploying one single app cannot list the rest of your apps, so the audit would only ever see a sliver of your account.
Is this the same as automatically stopping idle machines overnight?
No, and the difference matters. Stopping machines on a schedule saves money on things that are running. This finds the things that keep billing you when nothing is running at all, which is the spend that tends to go unnoticed for months.

Related templates

Share of voice dashboard for your brand and competitors

See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.

GDELT
Notion
Slack Bot
App
Approval war room for every social post awaiting sign-off

One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.

Hootsuite
Slack Bot
App
Turn champion job changes into new pipeline in Attio

Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.

Boomerang
Attio
Slack Bot
Agentic Task
Collect social post requests and schedule them in Hootsuite

Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.

Hootsuite
Slack Bot
General Input Database
App
Voice agent QA review board for your Hume EVI calls

Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.

Hume
Linear
Slack Bot
App
Clear your Guru verification backlog in one weekly app

A personal queue of every overdue Guru card, sorted by how late it is, with one-click verify, reassign, comment, and an agent that drafts the refresh for you.

Guru
Slack Bot
App

Stop paying for infrastructure nobody is using.

Get a ranked cleanup list in Slack every Monday, with the exact commands to run and nothing deleted behind your back.