Weekly
Get a weekly list of your Heroku apps and dynos
Each Monday you see every app with its dyno types and counts, which makes forgotten apps easy to spot.
- Runs
- Weekly
- Apps
- Heroku
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Monday at 8am email me all my Heroku apps with their dyno formation: process type, size and quantity.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Heroku makes it easy to start apps and just as easy to forget them. A contractor spins up a demo, a feature branch gets its own review app, a staging environment is scaled to Performance dynos for a load test and left there. Each one quietly bills by the hour. Engineering managers usually find out in the monthly invoice, when a $250 app that nobody uses has been running since June.
Each week, the apps in your Heroku account are listed and the formation for each is read, which shows the process types, dyno sizes and quantities. An email lists every app with what it is running, so oversized and orphaned apps stand out.
It is useful for engineering leads and agencies that host many client apps and want a regular, readable inventory.
What you get out of it
Oversized dynos are noticed
A Performance-L left running on a staging app is obvious when the whole list is in one email. Scaling it down is a one-minute fix with a clear saving. That adds up quickly when the oversized process is billed every hour.
Orphaned apps are found
Demos and abandoned prototypes show up with their dynos still running. You can delete or scale them to zero before they cost another month. Catching them weekly means they cost one week of billing, not six months of it.
New apps are seen as they appear
A weekly view shows apps created since last time, so a stray review app or a contractor's test environment does not stay hidden. Each is a small, early chance to ask who made it and whether it should still exist.
Handovers and audits are simpler
When a team member leaves or a client asks what is running, you have a dated list showing apps, process types and sizes without logging in to each. Auditors and clients get a straight answer without anyone clicking through every app.
A habit of right-sizing
Reading the list weekly makes dyno size a conscious choice, and teams drift less toward the biggest option when in doubt. Over a quarter that habit lowers the bill without any dramatic cost-cutting project.
How it works
What happens, step by step
Every Monday ClickRuntime lists all your Heroku apps.
For each app it gets the dyno types, how many of each and their sizes.
The list arrives in your inbox, making forgotten apps easy to spot.
Before it runs live
- Connect Heroku
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Heroku steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, notify
HEROKU = "https://api.heroku.com"
def heroku(path, **headers):
resp = http.get(f"{HEROKU}{path}", headers={"Accept": "application/vnd.heroku+json; version=3",
"Authorization": f"Bearer {credentials.secret('HEROKU_API_KEY')}", **headers})
resp.raise_for_status()
return resp.json()
@on_trigger
def run(event):
lines = []
for app in heroku("/apps"):
formation = heroku(f"/apps/{app['id']}/formation")
dynos = ", ".join(f"{f['type']} {f['quantity']}x {f['size']}" for f in formation) or "no dynos"
lines.append(f"{app['name']}: {dynos}")
notify.email_me(f"Heroku inventory: {len(lines)} apps", "\n".join(lines))
return {"apps": len(lines)}FAQ
Common questions
What does the formation show?
Will it change or scale anything?
Can it flag only dynos above a certain size?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get a monthly report of Heroku add-on costs
On the 1st you receive every add-on across your apps with its plan and monthly price, with new ones highlighted.
See how it worksGet alerted when a Heroku dyno crashes
When any dyno of your app enters a crashed state, you get one email about it.
See how it worksTell the team in Slack when a Heroku release fails
A failed release is posted to your team channel, so it isn't only the person who pushed who knows.
See how it worksKeep exploring
Set up “Get a weekly list of your Heroku apps and dynos” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.