CompareHeroku
Heroku bills it while it sleeps.BataDB doesn't.
Every Heroku Postgres add-on bills as long as it exists, and review apps start on an empty database. BataDB costs $0 while idle, and every branch comes with your data.
Side by side
What's in the box.
Every plan gets branching and point-in-time restore, Free included. Your agents get the same CLI and MCP server you do.
| Feature | BataDB | Heroku |
|---|---|---|
| Scale to zero | Yes: After 5 idle minutes | No: Bills while it exists |
| Branches with your data | Yes: Copy-on-write, one command | Partly: Forks from Standard up |
| No branch fees | Yes: None | No: Full plan price |
| Point-in-time restore | Yes: Up to 30 days, included | Partly: Rollback from Standard up |
| Connection pooling | Yes: Built in | Partly: Standard and up |
| CLI with JSON output | Yes: --json on every API command | Partly: Some commands |
| MCP server | Yes: 128 tools | Partly: Early development |
| One-command import | Yes: bata import | Partly: Dump and restore |
The bill
Watch the idle hours add up.
We priced the same workload on BataDB and on Heroku, then let the month run.
One small database, busy two hours a day and idle the rest.
- BataDBPay as you go$0.58 a month
- HerokuEssential-1$9.00 a month
Saved against Heroku, every month
$8.4294% less
The bigger workloads run on our Team plan: $69 a month with 5,000 compute-hours included.
Talk to usMove
Moving over takes one command.
bata import copies your database from Heroku into a new BataDB project, then checks row counts and sequences on both sides.
From Heroku
npm install -g @batadata/clibata loginbata import --source "$HEROKU_DATABASE_URL" --name my-app- Use DATABASE_URL on port 5432, not DATABASE_CONNECTION_POOL_URL.
- Add sslmode=require. Credentials can rotate, so copy them right before the run.