Add a Database — Heroku Postgres
Heroku-specific quirks: tier matters, no SPL access, allowlist is different.
Heroku Postgres is reachable and onboardable, but tier matters more than on most managed providers. Hobby and Essential tiers lack the extension allowlist and heroku pg:settings access, so monitoring is significantly limited. Standard or higher gets you the full picture.
Prerequisites
Heroku Postgres add-on on Standard or higher. Output of heroku pg:credentials:url for your DB. That's it — there's no firewall to configure (Heroku has its own connection model with rate-limiting and proxy-layer protection, no security groups or authorized networks). The credentials in DATABASE_URL work from anywhere.
Get the connection string
heroku pg:credentials:url --app your-app
# postgres://user:[email protected]:5432/dbname?sslmode=require
Onboard
- app.monpg.app → Setup → Heroku.
- Hosted — Auto-setup.
- Fill in the connection from the URL: host, user, password, database, sslmode=require.
- Test connection → pick databases → Provision.
Extension support by tier
| Extension | Hobby/Essential | Standard+ |
|---|---|---|
| pg_stat_statements | preloaded | preloaded |
| pgstattuple | not allowed | allowed |
| pg_buffercache | not allowed | allowed |
| hypopg | — | — |
| pgaudit / auto_explain / pg_wait_sampling | not allowed (no SPL access) | not allowed |
| pgvector / postgis / pg_partman | varies | allowed |
The big absence is anything that requires shared_preload_libraries editing — Heroku doesn't expose SPL on any tier. That means no auto_explain, no pgaudit, no pg_wait_sampling. pg_stat_statements is preloaded on all tiers because Heroku enables it for everyone by default.
GUC tuning via heroku pg:settings
Standard+ exposes a small set of tunable GUCs:
heroku pg:settings --app your-app
heroku pg:settings:set log_min_duration_statement=1000 --app your-app
MonPG's recommended GUC values apply to whatever knobs are exposed; the rest are platform-managed and you can't change them.
Logs
For Cedar runtime (most apps), set up a Logplex syslog drain pointing at MonPG's log ingest. For Fir runtime (newer, OTLP-native), use OTLP telemetry. Settings → Servers → Logs gives you the exact drain URL for your account.
Verify
The server reports online within 30 seconds. The slow-query catalog populates as queries run, since pg_stat_statements only sees activity from the moment it was enabled (which on Heroku is "always" since it's preloaded by default).