← All guides8 min read

Consolidating Shopify stores with Graftport: a practical guide

How to use Graftport's Shopify-to-Shopify migration to consolidate multiple brand stores into one: source credentials, what moves, handle-collision mapping, and the idempotent cut-over.

Multi-brand groups that started each brand on a separate Shopify store often reach the same point: the maintenance overhead — separate themes, separate apps, separate catalogues, separate customer databases — starts to outweigh the brand-separation benefit. Consolidating into one store, with Shopify Markets or metafield-based brand flags handling the storefront split, is one of the most common projects Graftport runs. This guide walks through the source setup, the mapping decisions that actually need your attention, the staging verification, and the cut-over sequence.

Before you start: what shape do you want on the other side?

Consolidations land in one of three shapes:

  • One unified store. Every brand's products, collections, and customers land in a single shared catalogue. Use collections or a brand metafield to tag each product's origin brand. A single homepage, a single checkout, a single customer account system.
  • One store with Markets. Each brand or region maps to a Shopify Market with its own domain, currency, and optional storefront customisation. The product catalogue is shared; the storefronts differ. Shopify Plus only.
  • A clean-slate rebuild. The existing store has accumulated years of legacy settings and app-generated data that you want to leave behind. Data migrates; the store configuration is rebuilt from scratch on the fresh destination.

Graftport handles all three. The choice determines how you configure the mapping — specifically how you handle handle collisions and customer deduplication — but the migration pipeline is the same in each case.

Setting up the source connection

The source is any Shopify store you have admin access to. You connect it via a custom Shopify app on the source store — not a personal admin login. Creating a dedicated app gives you a revocable, scoped token and a clean audit log.

  1. In the source store's Shopify Admin, go to Settings → Apps and sales channels → Develop apps.
  2. Click Create an app and name it something recognisable — Graftport read access works.
  3. Under Configuration → Admin API access scopes, grant read access to: Products, Product listings, Collections, Customers, Orders, Discounts, Gift cards, Online Store (pages, blogs, URL redirects).
  4. Click Save, then Install app, and copy the Admin API access token shown once.

Paste this token into Graftport's source credentials field. Read-only access is all Graftport needs from the source; it never writes to the source store.

For the destination store, you need a separate token from a custom app on the destination, with read and write access to every resource you plan to load.

What migrates from Shopify to Shopify

The Shopify-to-Shopify mapping template covers every record a standard Shopify store can hold:

ResourceNotes
Products & variantsTitle, body, options, images, SEO fields, every metafield
CollectionsManual and rule-based, with parent/child nesting preserved
CustomersProfile, addresses, marketing consent, customer notes
OrdersLine items, taxes, shipping, fulfillments, refunds, full history
Discounts & gift cardsCodes, automatic discounts, outstanding gift card balances
301 redirectsEvery existing URL Redirect on the source preserved on the destination
Blogs & pagesEvery post and page intact, with their authors and publish dates
MarketsMulti-currency and multi-language storefronts where supported

What does not migrate: installed apps and theme code. Apps are owned by Shopify and must be reinstalled on the destination store after the migration. Theme code — Liquid files, JSON templates, assets — is rebuilt or re-imported separately. Graftport moves the data; the store configuration is your team's workstream.

The mapping decisions that need your attention

For a straightforward like-for-like consolidation, the default Shopify-to-Shopify template handles most fields automatically. Three areas come up in almost every consolidation:

1. Product handle collisions

If two source stores have products with the same handle — /products/black-tote-bag exists on both — they will collide on the destination. The products mapping ships a configurable handle rule. The standard fix is to prefix the handle with a brand slug:

  • Source A: /products/brand-a-black-tote-bag
  • Source B: /products/brand-b-black-tote-bag

Set this per-migration in the products mapping's handle field, using a string prefix transform. The corresponding 301 redirects (from /products/black-tote-bag on each source domain) are written automatically to the destination.

2. Customer deduplication

A customer who shopped from two source stores has an account on each. Graftport identifies duplicates by email address. When the same email already exists on the destination (from an earlier migration run for another brand), Graftport merges the new order history onto the existing customer record rather than creating a duplicate. The customer ends up with a single account and orders from every brand they shopped with.

3. Collection handle collisions

The same pattern applies to collections: two stores both having a New Arrivals collection will produce a handle collision. Apply the same brand-prefix rule to collection handles, then create a parent New Arrivals smart collection on the destination that pulls from all brand-prefixed sources. The structure resolves after your first full load.

Running the staging pass

Run the consolidation on a staging destination — a Shopify development store under your Shopify Partner account works well — before touching production. The verification checklist:

  1. Check record counts. The run page shows extracted vs. loaded counts per resource. A gap means errors; open the run item and read the per-row error list.
  2. Check product handles. Browse a sample of products on the staging store. Confirm handles are unique and follow the brand-prefix convention you configured.
  3. Check customer deduplication. If you have test email addresses that exist on more than one source store, confirm they land as a single customer record on the destination with both stores' order history attached.
  4. Check 301 redirects. Pick 20 old product and collection URLs from each source store. Hit them on the staging destination. Each should 301 to the correct destination product or collection.
  5. Check collections. Confirm the hierarchy is preserved — nested collections under their parent smart collections.
  6. Spot-check orders. Open five orders from each source store in the staging Shopify Admin and confirm totals, line items, and shipping addresses are intact.

If anything looks wrong, edit the mapping (it is versioned — revert if needed), re-run transform only + dry-run, inspect the output in the Data tab, and re-load when the shape is right.

The cut-over sequence

Graftport's idempotency model means re-running is safe: any record already loaded is skipped. The consolidation cut-over follows the same sequence as any Graftport migration:

T −2 hours. Run extract only against each source store. This locks in the final state of each source store's catalogue and order stream at a known timestamp.

T −1 hour. Run transform only + dry-run. Confirm record counts match expectations. No destination writes.

T 0. Run load only (no dry-run). Most records are already on the destination from the staging rehearsal — they are skipped at zero cost. New orders placed since the rehearsal are first-loaded. The delta typically takes a few minutes.

T +5 min. Open the run page. Confirm all resources show succeeded or completed with errors. For any errors, check whether the failing records are business-critical before flipping DNS.

T +10 min. Flip DNS to the destination store. The 301 redirects loaded during staging are already in place — customers arriving from bookmarked source-store URLs land on the right destination page.

T +1 hour. Submit the destination sitemap to Search Console. Watch Coverage → Not found for the next two weeks for any missed redirects.

Customer passwords after consolidation

Shopify does not share customer passwords across stores. Every customer who had an account on a source store needs to complete a password reset on the destination. This is a Shopify constraint, not a Graftport one — the customer account, address book, order history, and marketing consent all migrate cleanly; the password rotation is the one thing Shopify controls cross-store.

The standard approach: send a post-launch email announcing the new store and prompting customers to set a new password. Most email platforms can target the segment of migrated customers who have not yet logged in, so you can re-send to non-openers after a week.

Related reading

Ready to run your first consolidation? Sign up at app.graftport.com — connect a source store, run a dry-run against a staging destination, and see the full record output before a single live write happens.

Ready to migrate?

Connect a source store, dry-run a migration, see the exact Shopify result before a single record lands. The same platform your team will use on go-live night.

Get started See the calculator
Related guides
Using the Graftport CLI with Claude Code: install to first publish
Set up the Graftport CLI and migration-engineer skill in Claude Code, then drive a real Shopify migration through the validate and publish l
Human approval gates for AI Shopify migrations: the Graftport contract
Why an AI coding agent should never push to Shopify on its own, and how Graftport's two-tier CLI contract enforces a human gate on every cos
Automating JSONata Shopify mapping with an AI coding agent
How the Graftport CLI lets an AI agent investigate source rows, fix JSONata mapping errors against structured validation codes, and publish