Monthly
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.
- Runs
- Monthly
- Apps
- Heroku
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: on the 1st of each month email me all add-ons across my Heroku apps with plan name and monthly price, the total, and which add-ons are new since last month.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Heroku add-ons are the line items nobody remembers buying. A Postgres plan upgraded during a traffic spike and never downgraded, a Redis instance for a prototype that was shelved, a logging add-on attached to an app that now has no users. Across a dozen apps these add up to a few hundred dollars a month, and the invoice arrives as one number with no breakdown a founder or engineering lead can easily act on.
On the first of each month, every Heroku app is listed, the add-ons on each are read with their plan and billed price, and the prices are totalled. The result is compared with last month's stored list, so the email shows what is new, what was removed and what changed in cost.
It is meant for engineering leads, CTOs and finance partners who want to keep infrastructure spend from creeping upward unnoticed.
What you get out of it
Forgotten add-ons stop costing money
An idle Redis or a staging database attached to a dead app is easy to cancel once you can see it. One cancelled add-on pays for months of attention to the report.
Cost changes are explained, not just shown
Comparing with last month turns a bigger invoice into a short list of reasons, such as a plan upgrade on one app. Finance gets an answer without asking engineering. The email then answers the finance question about why the bill grew, which saves an engineer from digging.
Budgets are easier to forecast
A line-by-line view of add-on spend lets you project next quarter's costs with fewer surprises, which matters when infrastructure is a meaningful share of the budget. That reduces the risk of overspending a quarter's infrastructure budget without anyone noticing.
Plan upgrades made in a hurry get revisited
The database plan raised during an incident rarely goes back down on its own. A monthly mention is the reminder to reconsider it when traffic has settled. Reviewing it monthly keeps those emergency decisions from becoming permanent costs nobody chose on purpose.
Ownership conversations start
Seeing which app carries which add-on makes it natural to ask the owning team whether it is still needed, and to retire projects cleanly. Retiring unused add-ons also reduces the number of things your team has to patch, monitor and secure.
How it works
What happens, step by step
On the 1st of each month ClickRuntime goes through all your Heroku apps.
It lists every add-on with its plan and monthly price, and adds up the total.
It compares the list with last month's and marks any add-on that is new.
The report arrives in your inbox.
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, state
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):
previous = set(state.get("addon_ids") or [])
lines, total, ids = [], 0, []
for app in heroku("/apps"):
for a in heroku(f"/apps/{app['id']}/addons"):
cents = (a.get("billed_price") or {}).get("cents", 0)
total += cents
ids.append(a["id"])
new = " (new)" if previous and a["id"] not in previous else ""
lines.append(f"{app['name']}: {a['plan']['name']} ${cents / 100:,.2f}/mo{new}")
notify.email_me(f"Heroku add-ons: ${total / 100:,.2f}/month", "\n".join(lines))
state.set("addon_ids", ids)
return {"addons": len(ids), "total": total / 100}FAQ
Common questions
Does it include dyno costs?
How accurate are the prices?
What if I have apps in several Heroku teams?
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 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.
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 monthly report of Heroku add-on costs” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.