All posts
herokumigrationrailsdjangocomparison

Migrating from Heroku Review Apps to PreviewDrop

PreviewDrop Team·May 20, 2026·7 min read

Heroku Review Apps were the original "every PR gets a URL" workflow. For years, Rails and Django teams relied on app.json + Heroku Pipelines to spin up ephemeral environments per pull request. But Salesforce's pricing hikes, declining investment in the Heroku platform, and increasingly slow cold starts have pushed teams to look for alternatives.

If you're one of those teams — you have an app.json in your repo, your pipeline is still working, but you know the clock is ticking — here's what migrating to PreviewDrop looks like.

What Heroku Review Apps got right

Before we talk about migrating, let's acknowledge what made Review Apps work:

  • Automatic deploys on PR open. Push a branch, open a PR, get a URL. No manual steps.
  • app.json as a contract. One file described your add-ons, buildpacks, and environment. Predictable and reviewable.
  • Ephemeral by default. Review apps destroyed on PR close. No orphan infrastructure.
  • GitHub status checks. Green checkmark on the PR when the review app was ready.

These patterns were so good that they became the industry standard. The problem isn't the pattern — it's that Heroku stopped investing in it, and the rest of the platform's pricing made the whole package unsustainable for teams that aren't on enterprise contracts.

What PreviewDrop does differently

PreviewDrop keeps the good parts of the Review Apps workflow and drops the parts that aged poorly:

| Feature | Heroku Review Apps | PreviewDrop | |---|---|---| | Automatic PR deploys | Yes (app.json) | Yes (GitHub App, zero config) | | Framework support | Buildpack-based | Automatic detection (any detectable stack) | | Pricing | Per-dyno, per-hour (~$25/dyno-month) | Flat workspace: $19/mo Starter | | Cold deploy speed | 3–8 minutes | 90s–4 min | | Warm redeploy speed | 2–5 minutes | 39–60 seconds | | PR comments | Yes | Yes | | Password protection | Via add-on | Built-in, per-preview | | Auto-expiry | PR close only | Configurable TTL (1h–7d) | | Live build logs | Limited (heroku logs) | WebSocket stream, real-time |

The pricing difference is the headline. A team running 3 review apps with 1 web dyno each on Heroku pays roughly $75/month just for preview environments — before production costs. PreviewDrop's Starter plan is $19/month flat for up to 5 concurrent previews and 3 team seats.

Migration walkthrough for a Rails app

Let's walk through migrating a typical Rails + Postgres app from Heroku Review Apps.

Your current app.json probably looks like this:

{
  "name": "my-rails-app",
  "stack": "heroku-22",
  "addons": ["heroku-postgresql:mini"],
  "buildpacks": [{ "url": "heroku/ruby" }],
  "env": {
    "RAILS_ENV": "review",
    "DATABASE_URL": { "required": true }
  }
}

Step 1 — Remove the Heroku dependency. Your PreviewDrop deploy doesn't need app.json for app configuration. You can delete it or keep it around as documentation. Framework detection is automatic — PreviewDrop sees your Gemfile and builds the right Dockerfile.

Step 2 — Connect your repo to PreviewDrop. Install the GitHub App from the PreviewDrop dashboard. It takes about 60 seconds and requires no repository configuration changes.

Step 3 — Set your environment variables. Heroku used app.json to declare env vars. PreviewDrop has a project-level env var panel in the dashboard. Copy your review environment variables there — RAILS_ENV, DATABASE_URL, and any feature flags you use in review.

Step 4 — Push a branch. Open a PR. PreviewDrop picks up the push event, detects Rails from your Gemfile, builds the container, runs migrations, and posts the preview URL as a PR comment. The first build takes 2–4 minutes for a typical Rails app; warm redeploys are under 60 seconds.

What happens to your app.json

You don't need it for PreviewDrop. If other tools in your pipeline (Heroku, CI scripts) still reference it, you can keep the file — it won't interfere. If you're fully migrating away from Heroku, you can delete it.

The configuration that lived in app.json maps to PreviewDrop as follows:

  • addons → External services (Postgres, Redis) connect via environment variables, not add-ons. Point DATABASE_URL at your dev database or use a branching service like Neon.
  • buildpacks → Not needed. Framework detection handles this automatically.
  • env → Set in the PreviewDrop project dashboard under Environment Variables.
  • scripts.postdeploy → Add a CMD or ENTRYPOINT in your Dockerfile that runs migrations before starting the server.

Migrating a Django or Node.js app

The pattern is identical. Django: PreviewDrop detects requirements.txt and manage.py, builds the right container, runs python manage.py migrate if you include it in your startup command. Node.js: detects package.json, builds with the right Node version, starts whatever your npm start or Procfile-equivalent specifies.

If your app has a Dockerfile already, PreviewDrop uses it directly. If not, it generates one from your project structure. Either way, no YAML configuration is needed.

Pricing comparison

Heroku Review App pricing has gotten complicated since the free tier shutdown. A basic 1 web + 1 worker dyno review app on Eco dynos runs about $10–15/month per active PR. Three engineers with two open PRs each means 6 active review apps — roughly $60–90/month, just for previews.

PreviewDrop Starter is $19/month for 5 concurrent previews across your entire workspace. Six previews would be the $79/month Pro plan, which covers 15 concurrent previews and 10 team members — still less than 6 Heroku review apps at the cheapest dyno tier.

Common questions

Do I need a Dockerfile? No. PreviewDrop generates one if you don't have one. If you have one, it uses yours.

What about the database? Point DATABASE_URL at a dev Postgres instance. For per-branch isolation, Neon's database branching creates a fresh Postgres branch in under a second — zero config, included on their free tier.

Does it work with GitHub, GitLab, and Bitbucket? Yes. The GitHub App handles webhooks and PR comments automatically. GitLab and Bitbucket integrations are available on Starter and above.

What's the migration path if I decide to leave? PreviewDrop doesn't touch your application code. Disconnect the GitHub App, and your repo is exactly as you left it. No lock-in.

Start the migration — free tier, no credit card →

Ready to give every branch a live URL?

Free tier — 2 concurrent previews, no credit card required.

Start free