← All playbooks
Hosting migration

Heroku → Vercel

Move Heroku web dynos, config vars, Postgres, workers, schedulers, release commands, add-ons, domains, and traffic into Vercel Functions without treating a git deploy as a complete cutover.

Typical timeline8–18 business days38–70 hours active work
Statusneeds review
Source profileHeroku documentation reviewed 2026-10-23
Destination profileVercel documentation reviewed 2026-10-23
Documentation date
Review window
Evidence3 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

Heroku

Reasons to stay
  • Git-based deploys, buildpacks, and add-ons offer an exceptionally approachable platform
  • Managed deployments reduce infrastructure and release-management work
Reasons to leave
  • Pricing and infrastructure control become limiting as applications grow
  • Runtime assumptions, platform services, and pricing models shape the architecture
New platform

Vercel

What gets better
  • Exceptional frontend previews and framework integration make releases fast and polished
  • Managed deployments reduce infrastructure and release-management work
What gets worse
  • Costs and proprietary platform features can grow rapidly with traffic and complexity
  • Runtime assumptions, platform services, and pricing models shape the architecture
Best of the move

Vercel: Exceptional frontend previews and framework integration make releases fast and polished. This removes a major source-side concern: Pricing and infrastructure control become limiting as applications grow.

Worst of the move

What you lose: Git-based deploys, buildpacks, and add-ons offer an exceptionally approachable platform. What you inherit: Costs and proprietary platform features can grow rapidly with traffic and complexity.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 1, Partial transfer: 5, Manual rebuild: 5, Not transferred: 1.
Clean1
Partial5
Manual5
Lost1
Mapping route9 of 9 fields have a destination path

This timeline assumes

  • Up to 10 apps, 10 process types, and 100 GB of Postgres data
  • Web traffic can run on Vercel Functions, while long-running workers and persistent connections have an approved replacement.
  • A production-shaped Vercel Preview runs before traffic changes.
  • The Heroku app stays intact and billable through the rollback window.
  • The migration team records evidence for every blocking verification check.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Procfile web process and dynospartialcriticalVercel does not read a Procfile. The web process becomes Functions, and Vercel documents duration and 4.5 MB body limits that Heroku dynos do not share.Map every route to a function, pin the runtime, and test timeouts, streaming, and payload size against the documented limits.
Worker dynos and long-running processesmanualcriticalVercel’s Heroku guide maps Celery-style workers to Queues. A process that must stay running does not transfer with the web deploy.Inventory every worker and choose a queue, cron route, or separate host before cutover.
Release commands and Heroku SchedulermanualcriticalHeroku runs release commands before a release goes live and can block a bad deploy. Vercel does not read those Procfile entries. Scheduler jobs become Cron Jobs.Move migrations into CI before promotion and recreate every schedule as a cron route with a freeze plan.
Config vars and secretsmanualcriticalEnvironment values must be recreated per Vercel environment. Preview and production do not share them automatically.Recreate least-privilege values, scope them by environment, and rotate secrets after verification.
Heroku Postgres and key-value datapartialcriticalData moves through an explicit backup, restore, or replication. Serverless functions also handle connections differently than persistent dynos.Restore into a destination database, rehearse connection pooling, and verify counts before switching writers.
Buildpacks, Aptfile packages, and local diskpartialhighExtra buildpacks and system packages need a matching Vercel runtime or a container image. Ephemeral function filesystems do not replace attached disks.List every system dependency and move uploads or caches to an external store.
Add-ons, pipelines, logs, and operational historymanualhighThird-party add-ons may remain external. Heroku pipelines and log history do not become Vercel observability.Choose replacements and rebuild alerts, log drains, Preview promotion, and baselines.
Source code and static assetscleancriticalRepository-owned application code can redeploy when the destination runtime supports the framework.Pin versions and compare reproducible build output.
Sessions, uploads, and in-process statelostcriticalVercel’s guide asks whether sessions and uploads can live outside the application process. In-memory dyno state does not survive a function invocation.Move session and upload state to an external store and test login, payment, and file paths.
WebSockets and persistent connectionspartialhighVercel documents Python WebSocket support as beta and subject to function duration limits, so clients need reconnection.Prove reconnection and idle behavior, or keep the socket path on a host that supports long connections.
Domains, DNS, and TLSmanualcriticalCustom domains and certificate ownership require destination validation and DNS changes.Lower TTL, prevalidate domains, and retain exact rollback records.
Redirects, rewrites, headers, and routingpartialcriticalRule syntax, Preview routing, and incremental rewrites to the legacy host differ from Heroku routers.Create a routing registry and test every rule, status code, and fallback to Heroku.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Heroku app or Procfile web processVercel project or FunctiontransformDrop the Procfile web entry and pin the runtime.
Worker dyno or Celery processVercel Queue, cron route, or separate hostmanualDo not leave a source worker writing after web cutover.
Release commandCI release pipelinemanualFail the promotion if migrations fail.
Heroku Scheduler jobVercel Cron JobtransformTest cadence and disable the source schedule first.
Config var or secretVercel environment variablemanualRecreate by Preview and Production, then rotate.
Heroku Postgres or key-value storeDestination data servicetransformMigrate and verify separately from the app deploy.
Domain and certificateVercel domain and certificatemanualPrevalidate before DNS changes.
Redirect, rewrite, or headerVercel routing ruletransformTest precedence, Preview behavior, and status.
Log, metric, or add-on streamVercel observability or replacement servicemanualReset history after exporting baselines.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Preserve Heroku data, configuration, and operating evidence before any destination write.

  1. Export Heroku build settings, Procfile processes, config vars, domains, add-ons, release commands, schedulers, and recent releases.
  2. Create application, Postgres, key-value, DNS, certificate, and observability inventories.
  3. Record traffic, error, latency, build, job, and capacity baselines.
  4. Take a native Heroku Postgres backup and hash all exports.

Proof to capture: A signed manifest reconciles every scoped record class, runtime dependency, export file, count, and hash.

Transformation · Process inventory and Vercel project settings

Runtime and process map

Translate web processes, workers, schedules, and release gates onto Functions and CI.

  1. List every Procfile entry, scheduler, and add-on.
  2. Assign a Function, Queue, cron, CI job, or exclusion.
  3. Reject any critical process without a destination owner.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Heroku backups, destination restore, and checksums

State and configuration migration

Move Postgres, objects, secrets, and observability without relying on the app deploy.

  1. Restore a rehearsal database and compare counts.
  2. Recreate environment values by Preview and Production.
  3. Reconcile accepted, rejected, and transformed records.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Preview

The app builds but function limits change behavior

criticalpossible likelihood

Routes render while timeouts, body size, connection pooling, or retries differ from dynos.

Consequence
Users lose data or critical actions fail after a few seconds.
Mitigation
Test complete business paths against documented duration and payload limits.

Stop if: Any critical path lacks durable evidence under production-shaped load.

Cutover

A Heroku worker keeps writing after web traffic moves

criticalpossible likelihood

Scheduler jobs or worker dynos still mutate the shared database.

Consequence
State diverges or actions duplicate.
Mitigation
Freeze source writers and transfer one owner at a time.

Stop if: An unapproved source writer remains active.

Domain

DNS rollback is unavailable

criticalpossible likelihood

Certificates, proxy settings, or DNS records cannot return traffic quickly.

Consequence
An outage outlives the application fix.
Mitigation
Prevalidate both directions and preserve exact prior records.

Stop if: Rollback cannot be completed within the approved objective.

06Precise timeline

Do the work in this order.

Estimate forUp to 10 apps, 10 process types, and 100 GB of Postgres data
Total elapsed8–18 business days
Active work38–70 hours
BufferAdd time for worker rewrites, WebSockets, Aptfile buildpacks, multi-terabyte databases, or a framework rewrite such as Rails to Next.js.
01
Days 1–3Inventory and decisions2–3 days
02
Days 3–5Backup and reconcile1–3 days
03
Days 5–12Map and pilot3–8 days
04
Days 10–20Final delta and switch1–5 days
05
Days 12–40Observe and close3–10 days
  1. Days 1–3 · inventory

    Inventory and decisions

    6–12 hours active2–3 days elapsedOwner review waiting
    • Inventory Heroku processes, add-ons, data, users, domains, and integrations.
    • Approve which work stays on Vercel and which needs another host.

    Depends on: Heroku and Vercel administrator access

    Stop / go checkpoint

    Export?

    Go when: Every critical item has an owner and disposition.

    Stop when: Consent, billing, access, or system ownership is unclear.

  2. Days 3–5 · backup

    Backup and reconcile

    5–10 hours active1–3 days elapsedExport processing waiting
    • Create immutable exports, Postgres backups, and configuration evidence.
    • Reconcile counts, totals, and hashes.

    Depends on: Approved inventory

    Stop / go checkpoint

    Transform?

    Go when: Source totals and export manifests agree.

    Stop when: Any critical dataset or configuration is absent.

  3. Days 5–12 · pilot

    Map and pilot

    10–35 hours active3–8 days elapsedDestination processing and review waiting
    • Configure the Vercel project and restore representative data.
    • Run a Preview containing normal traffic and every critical edge case.

    Depends on: Verified backup

    Stop / go checkpoint

    Scale?

    Go when: Pilot mappings, behavior, access, and evidence pass.

    Stop when: Any critical check fails or produces unexplained variance.

  4. Days 10–20 · cutover

    Final delta and switch

    5–25 hours active1–5 days elapsedDNS, import, or sync propagation waiting
    • Freeze production writes and schedulers in Heroku.
    • Apply the final delta, switch ownership, and run blocking checks.

    Depends on: Passed pilot and approved rollback

    Stop / go checkpoint

    Open production?

    Go when: Counts reconcile and one destination system owns production.

    Stop when: A source writer remains active or a blocking check fails.

  5. Days 12–40 · observe

    Observe and close

    3–18 hours active3–10 days elapsedOperating-cycle evidence waiting
    • Monitor one complete operating cycle.
    • Sign the verification report and close rollback only after stability.

    Depends on: Verified cutover

    Stop / go checkpoint

    Close rollback?

    Go when: No trigger occurs during the agreed observation period.

    Stop when: Data, access, delivery, routing, or business results regress.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Vercel the only production system without losing the final Heroku delta.

Recommended window: A low-volume weekday morning with platform, data, DNS, and business owners available.

  1. Freeze production writes, workers, and scheduled actions in Heroku.
  2. Export, restore, and reconcile the final data delta.
  3. Promote the approved Vercel Production deployment.
  4. Switch domains, callbacks, integrations, or incremental rewrites as applicable.
  5. Run every blocking verification check and keep Heroku intact.

Proof to capture: Vercel owns production, totals reconcile, and every blocking check has durable evidence.

Return to safety

Rollback

Return production ownership to Heroku without losing destination-era changes.

Deadline: Within seven days and before source data, plans, credentials, domains, or billing are changed.

  1. Stop new writes and scheduled actions in Vercel.
  2. Restore the prior Heroku routing, workers, integrations, and DNS records.
  3. Export the Vercel post-cutover delta.
  4. Review and apply safe destination-era changes to Heroku.
  5. Run the same blocking checks against the restored source.

Proof to capture: Heroku again owns production with current data and no duplicate destination action.

Rollback immediately when
  • Unexplained critical count or value variance
  • Missing or exposed critical data
  • Duplicate production action
  • Failed access, routing, delivery, or integration check
  • A critical feature has no safe destination replacement
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingReproducible releaseBuild a pinned source revision from a clean environment.Output and dependency versions match acceptance.Build log and artifact hash.
V-02BlockingHTTP behaviorCrawl routes, redirects, rewrites, headers, errors, and assets.Approved status, body, and header parity.Route diff.
V-03BlockingFunctions, jobs, and limitsRun every endpoint, queue path, schedule, retry, timeout, and oversized payload.One correct durable result within documented limits.Runtime log.
V-04BlockingData and storage reconciliationCompare counts, checksums, invariants, and backup restore.Every scoped item is accounted for and recoverable.State report.
V-05BlockingSecrets and accessTest representative users, services, Previews, and production actions.Least privilege with no secret exposure.Access evidence.
V-06BlockingDNS, TLS, and rollbackResolve from multiple networks and exercise rollback records.Valid TLS and routing within approved objectives.DNS and certificate report.
V-07BlockingLogs, metrics, traces, and alertsGenerate known failures and load.Signals arrive with correct context and thresholds.Observability evidence.
V-08BlockingSingle production platformInspect traffic, writers, jobs, webhooks, and deployment triggers.Vercel alone owns production.Ownership checklist.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One complete operating cycle, at least seven stable days, and owner sign-off on every blocking check.

  1. Create final Heroku exports and archive verification evidence.
  2. Revoke temporary credentials, API keys, webhooks, and elevated roles.
  3. Remove obsolete embeds, forms, jobs, integrations, and DNS records.
  4. Keep the source intact through the approved retention window.
  5. Cancel paid plans only after billing, legal, and recovery review.
  6. Schedule the next Vercel backup, access, and migration-playbook review.
10Experiences from the field

When the plan met reality.

First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.

After Heroku announced the end of its free plan in August 2022, morishin rewrote a five-year-old Rails and Heroku Postgres app as Next.js on Vercel with Prisma, tRPC, and PlanetScale. Cross-region SQL made TTFB slow until both app and database sat in Tokyo, and full SSR stayed expensive, so the main pages moved to on-demand ISR. The rewrite gained typed APIs and hybrid rendering, and lost Rails-style background jobs such as perform_later.

What they recommend
  • Treat a Heroku-to-Vercel move as a process and data-store redesign, not only a git remote change, especially when the app uses Postgres, Redis, or async jobs.
  • Measure TTFB with the database in the same region, and decide which routes need SSR before you cut public traffic.
Worth noticing
  • Keeping Rails on a free-tier host was the first search, and the Vercel path only appeared after that option closed.
  • Vercel image optimization hit the free quota quickly, so image handling needed a separate plan from the app deploy.
First-person accountAndrew VanDyke · Andrew VanDyke

Moving personal demos from Heroku to Vercel2026

Andrew VanDyke moved a set of portfolio demos off Heroku after the free tier ended. Hosting fell from more than eighty dollars a month to about fifteen. A written inventory of URLs, repos, secrets, databases, and the first visitor action showed that some apps belonged on Vercel and others needed a long-running or scheduled host. Build success was not enough. Clicking each live demo caught missing settings and stale OAuth callback URLs.

What they recommend
  • List every app’s URL, secrets, datastore, and first visitor action before you move code, then decide which work does not belong on Functions.
  • After deploy, click the public path a stranger would use, including login and payment return URLs, instead of trusting a green build.
Worth noticing
  • Scheduled collectors and long-running work stayed off Vercel, while the public pages moved.
  • The cost drop mattered, but broken demo links would have hurt the portfolio more than the Heroku bill.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. Vercel: migrate a Python API from HerokuAccessed 2026-10-23
  2. Heroku: create a Postgres backupAccessed 2026-10-23
  3. Vercel: incremental migrationAccessed 2026-10-23