Skip to content

Stacksync × Supabase Miami: AI-Native OperationsOct 13Reserve your spot

Zero-Downtime Heroku Migration: Run Both Syncs in Parallel

Run Heroku Connect and Stacksync side by side to validate Salesforce data before cutover, so your Heroku migration does not interrupt the app or its users.

Author
Stacksync · App tips writer
Published
Read time
5 min read
Zero-Downtime Heroku Migration: Run Both Syncs in Parallel
APP TIPS

How do you migrate off Heroku without downtime for Salesforce data?

Run Heroku Connect and Stacksync in parallel. Keep Heroku Connect serving production on the existing Heroku Postgres database, point Stacksync at the new database, and compare the two until the new sync matches. Then move app traffic and retire Heroku Connect.

This turns the riskiest part of a Heroku exit, the Salesforce sync, into something you can test before users depend on it.

Why run the two syncs in parallel?

A one-shot cutover asks you to stop Heroku Connect, start a new sync and hope the data matches. If it does not, you find out from users. A parallel run lets you find out from a comparison query.

It also separates the problems. If the app has issues after the move, you know the sync was already validated. If the sync has issues, you find them while the old system still serves production.

Rule for the parallel period
Only one system writes to Salesforce at a time. Heroku Connect stays the writer until cutover; the new sync reads from Salesforce and writes to the new database only.
Salesforce to Postgres topology with Heroku Connect and with Stacksync
Salesforce to Postgres topology with Heroku Connect and with Stacksync

What does the parallel setup look like?

The setup uses two databases and two syncs, each with a single job.

ComponentBefore cutoverAfter cutover
ApplicationRuns on Heroku, reads Heroku PostgresRuns on the new platform via Build.io
Heroku PostgresProduction database, synced by Heroku ConnectRetired
New PostgresReceives Salesforce data from StacksyncProduction database
Heroku ConnectProduction sync, writes to SalesforceTurned off
StacksyncReads from Salesforce, writes to new PostgresTwo-way sync between Salesforce and Postgres

Because Stacksync can keep the same table and column names the app reads today, the app does not need a separate code path for the new database.

What are the steps for a parallel run?

  1. 01
    Freeze the Heroku Connect mapping list
    Avoid adding objects or fields during the migration. Record the current mappings as the reference.
  2. 02
    Stand up the new database
    Work with <a href="https://www.build.io">Build.io</a> to provision the target platform and Postgres database.
  3. 03
    Configure Stacksync against Salesforce and the new database
    Use the <a href="/connectors/salesforce">Salesforce connector</a>. Mirror the Heroku Connect objects and fields, with writes to Salesforce held back for now.
  4. 04
    Backfill and catch up
    Let Stacksync load existing Salesforce records and then follow live changes.
  5. 05
    Compare both databases
    Run count and field comparisons between the Heroku Connect tables and the Stacksync tables. Investigate every difference.
  6. 06
    Test writes on a sandbox or test records
    Confirm the new sync writes to Salesforce correctly without touching production records.
  7. 07
    Cut over
    Turn off Heroku Connect writes, enable Stacksync writes to Salesforce, and move app traffic to the new platform.
  8. 08
    Watch, then decommission
    Monitor sync activity and app errors. Remove Heroku Connect after the new setup is stable.
Heroku Connect polling sync cycle
Heroku Connect polling sync cycle

What should you compare between the two databases?

Row counts by object

The simplest signal. Differences often come from soft-deleted records, filtered mappings or objects that were never included.

Recently changed records

Pick records edited in the last hour on the Salesforce side and confirm both databases show the same values. This tests that live changes, not only the backfill, are flowing.

Data types and formats

Check dates, time zones, currency fields, picklists and long text. These are where two sync tools most often differ in how they represent the same value.

Relationships

Confirm that lookup and master-detail IDs line up so app joins still return the same results.

What can go wrong, and how do you avoid it?

  • Two writers to Salesforce. Keep only one sync writing back at any moment.
  • API usage. Two syncs reading the same org use more API calls. Check your allowance before starting.
  • Schema drift. A field added in Salesforce mid-migration may land in one database and not the other. Freeze changes or apply them to both.
  • Long parallel windows. The longer both run, the more you pay for both. Set an end date tied to the validation checklist.
Book a Stacksync demo

Who owns what during the parallel run?

Name an owner for each side before the parallel run starts. The platform owner tracks the new environment and the database move. The data owner tracks sync health, runs the comparison queries and signs off on the validation checklist. A short daily check-in during the parallel period keeps both sides aligned on the cutover date.

Write the rollback plan down as well. If a problem appears after cutover, the team should know in advance whether to switch traffic back to Heroku and how Salesforce writes would be handled.

Where do Build.io and Stacksync fit in this plan?

Build.io owns the platform side: moving the app, dynos, Postgres, add-ons and pipelines off Heroku. Stacksync owns the sync side: replacing Heroku Connect and running in parallel until cutover. The two companies have co-sold Heroku exits since July 2026, and the parallel-run pattern is how the work fits together.

Read more on our Heroku Connect alternative page, or book a demo to plan a parallel run against your own Salesforce mappings.

Start syncing with Stacksync

FAQ

Frequently asked questions

Can Heroku Connect and Stacksync run at the same time?
Yes, as long as they write to different databases or different tables. The usual pattern keeps Heroku Connect on the existing Heroku Postgres database and points Stacksync at the new one.
Will running two syncs use more Salesforce API calls?
Yes. Both tools read from Salesforce during the parallel period, so check your org's API allowance and keep the parallel window as short as validation allows.
How long should the parallel period last?
Long enough to cover your normal business cycle of record changes and to complete the validation checklist. There is no fixed number; it depends on data volume and how often records change.
What if both syncs write to Salesforce?
Avoid that. During the parallel run, only one system should write back to Salesforce. Keep the new sync read-only toward Salesforce, or limit writes to test records, until cutover.
Is zero downtime guaranteed?
No migration plan can promise that. Running the syncs in parallel removes the sync as a source of downtime. The app and database cutover still need their own plan with Build.io.
Coworkers laughing in front of a laptop in a casual office setting

You just read how it should work.
See it run on your own data.