Check staging against production before your next Heroku deploy

Open one screen, pick two Heroku apps, and see every setting, dyno, and add-on that differs, then fix the drift before you ship.

App
HerokuSlackEngineeringOperationsData SyncAI Reports
PromptCreate

Build me an app I open right before a release, in the moment where staging is working fine and I need to know why production might not. It is a side by side parity console for two of my Heroku apps, and its whole reason to exist is that I can fix what I find without leaving the screen.

At the top, two dropdowns pick the left app and the right app, typically staging on the left and production on the right. Populate both pickers from Heroku List Apps and List Team Apps so personally owned and team owned apps both appear, sorted by name with the owning team shown next to team apps. Remember the last pair I compared so reopening the app puts me straight back where I was.

The main view is a three column config comparison. Call Get Config Vars on each of the two apps and split the keys into: settings only in the left app, settings only in the right app, and settings present in both but with different values. Each column has a count in its header. Keys that are identical in both apps collapse behind a single "in sync" count that I can expand if I want, because they are not what I came here for. Sort each column alphabetically and let me filter by key name.

Mask values by default. Anything whose key or value looks like a credential (names containing KEY, SECRET, TOKEN, PASSWORD, CREDENTIAL, DSN, connection strings with embedded credentials, or long high entropy values) renders masked, with a per row reveal control that unmasks only that row. Re-mask everything when I switch apps. For rows where values differ, once revealed, show the two values aligned so the actual difference is readable rather than making me eyeball two long strings.

Let me mark any key as "expected to differ". Those rows move into a collapsed section with a count and an undo, so per environment database links, add-on managed values, and anything else that is legitimately different per environment stop showing up as noise on every visit. This list persists for the workspace, not just for me, so a teammate opening the console before their own release gets the same cleaned up view. Seed it with nothing and let it build up through use.

Below the config comparison, compare the process formation. Call List Formation on each app and render one row per process type (web, worker, release, and so on) with the dyno size and quantity for each side. Highlight rows where the size or the quantity differs, and rows where a process type exists on one side only. This is the section that makes it obvious when staging runs one small web dyno and production runs four standard ones.

Under that, compare attached add-ons. Call List App Add-ons on each app, match them up by add-on service, and show the plan on each side. Flag add-ons attached to only one of the two apps and add-ons where the plan tier differs, so a missing Redis or a Postgres on a smaller plan in one environment is immediately visible.

The write controls are the point of the app. On any config key that differs or is missing on one side, give me a copy control that writes that value into the other app using Update Config Vars. Send only that one key. The Heroku config update merges keys rather than replacing the whole set, so this must never send a full config object, and setting a key to null is how a key gets deleted. The confirmation dialog names the target app and the key, shows the value being written (masked, with a reveal), and states plainly that saving this restarts the target app. After it succeeds, refresh that app's config and move the row into the in sync group.

Give the formation rows the same treatment: on any process type where the size or quantity differs, a control that matches one environment to the other using Scale Formation on the target app. The confirmation should read like "web on production goes from 2 Standard-1X to 4 Standard-2X" and note that this changes what the app costs to run. Never write anything without a confirmation, and surface Heroku's error message plainly if a write is rejected.

Add an "Explain this diff" button that kicks off a background agent. The agent reads both apps' config vars (Get Config Vars), process formations (List Formation), attached add-ons (List App Add-ons), and their recent deploy history (List Releases, the last twenty or so on each side), then writes a risk note. The note classifies each difference as either intentional per environment configuration or a probable mistake, ranks what should be fixed before shipping (blocking, worth a look, fine as is), and uses the release history to call out differences that appeared recently. It should pay particular attention to settings that change how the app actually runs rather than just what it points at, since something like a memory allocator enabled in production but not staging produces behaviour differences that look inexplicable from the outside. Keys I have marked expected to differ get acknowledged in one line rather than analysed.

The note lands back in the app in a panel below the comparison, timestamped, with the previous notes for the same pair kept as history so I can see whether we are getting better or worse at this. The agent also posts the same note to a Slack channel I choose using the Slack Send a Message action, formatted with Slack's own markup, opening with the two app names and the count of blocking items so the channel gets the headline without expanding. Remember the chosen channel for the workspace and let me turn the posting off if I just want the note in the app.

The agent must refer to config keys by name only. It should never write a secret value into the note or into Slack, even for keys I have revealed on screen.

Write the interface in the voice of someone about to ship, not the voice of configuration management. When the two apps line up, the empty state should say so with confidence rather than showing an empty table. Reading is always safe and instant; writing always asks first.

What does this prompt do?

  • Pick any two of your Heroku apps and get a three column view of what differs: settings only in the left app, settings only in the right app, and settings both apps have but holding different values. Anything that looks like a secret stays masked until you reveal that one row.
  • Compare dyno setup and add-ons side by side, so one small web dyno in staging against four larger ones in production, or a Redis that exists on only one side, is obvious in seconds.
  • Fix the drift in place: copy a value into the other app, or match a process type's size and count across environments, each behind a confirmation that spells out exactly what will change.
  • Hit Explain this diff and an assistant reads both apps plus their recent deploy history, then writes a ranked note on what is intentional and what looks like a mistake, and posts it to Slack so the team sees the pre-release check.

What do I need to use this?

  • A Heroku account with access to the apps you want to compare. Personal apps and team apps both show up in the picker.
  • A Slack workspace, if you want the risk note posted to a channel. You can also just read it inside the app.
  • Nothing else to configure. Your list of keys that are expected to differ is saved for the whole workspace, so the view stays clean for everyone.

How can I customize it?

  • Choose which app sits on the left and which on the right. The copy and match controls always write into the side you point them at, so the direction is never a guess.
  • Build up your expected to differ list over time. Per environment database links and add-on managed values stop showing as noise on every visit.
  • Pick the Slack channel the pre-release note goes to, or turn the posting off and keep the note inside the app.

FAQs

Does copying a setting restart my app?
Yes, and the confirmation says so before you commit. Changing a setting on Heroku restarts the app it belongs to. Only the single key you picked gets written, so the rest of that app's settings are left exactly as they were.
Will my secrets be visible on screen?
Not by default. Anything that looks like a key, token, password, or connection string is masked, and you reveal one row at a time when you actually need to read it. The written risk note and the Slack post refer to keys by name and never include the values.
Can I compare more than two apps at once?
The view compares two at a time, which is what a pre-release check usually needs. Switch either side from the dropdown to line up a different pair, like production against a review app instead of staging.
What about settings that are supposed to be different?
Mark them as expected to differ and they move into a collapsed section that stays quiet on future visits. The list is saved for your workspace, so a teammate opening the app before their release sees the same cleaned up view.
Do I need a Heroku team account?
No. The picker lists both the apps on your personal account and any team apps you have access to, so it works whether you ship solo or with a team.
Can I change dyno sizes from here too?
Yes. Any process type where the size or the number of dynos differs gets a control that matches one environment to the other, with a confirmation showing the before and after so you know what you are about to pay for.

Related templates

Partner tier review board for quarterly promotion calls

Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.

Introw
HubSpot
Slack
App
Reconcile partner commissions between HubSpot and Introw

Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.

Introw
HubSpot
Slack
App
One control room for every Instantly sending mailbox

See warmup status, daily send volume, and bounce risk for every sending account in one grid, with the riskiest mailboxes floating to the top.

Instantly
Slack
App
Partner payout approval queue with Xero bill handoff

Review Introw partner payouts line by line, approve them from one board, raise the matching bill in Xero, and post every approval to Slack.

Introw
Xero
Slack
App
One inbox for every Jira Service Management approval waiting on you

See every access, purchase and leave request waiting on your decision in one screen, approve or decline in place, and send the reason back to the requester.

Jira Service Management
Confluence
Slack
App
Browse and shortlist creators without burning audit credits

Search creators for free, shortlist the best with your team, and spend an audit credit only when you decide someone is worth a closer look.

HypeAuditor
Airtable
Slack
App

Ship without wondering what is different in production.

Open the parity check, clear the drift that matters, and deploy knowing both environments line up where it counts.