Skip to Content
Source platformsShopify (as source)

Shopify (as source)

Use this when the source store is itself a Shopify store. Common cases:

  • Consolidations — merging two Shopify stores into one.
  • Sandbox → production — moving a finished sandbox into the live store.
  • Plus migrations — moving a non-Plus store onto a Plus organization with shared payments and customers.

Credentials

FieldExampleNotes
Source shop domainsource-store.myshopify.comHostname only — no protocol, no trailing slash. Always the .myshopify.com form, not the custom domain.
Admin API access tokenshpat_…From a custom app installed on the source store.

Required Admin API scopes

Install a custom app on the source store and grant read scopes for each resource you plan to migrate:

ResourceScope
Products, collectionsread_products
Customersread_customers
Ordersread_orders, read_all_orders
Discount codesread_discounts, read_price_rules
Blogs, articlesread_content
Redirectsread_online_store_pages

read_all_orders is not optional if you’re migrating orders. Without it, Shopify only shows an app the last 60 days of orders — and it doesn’t report that as an error, it just stops. Graftport checks the scope before it starts reading orders and refuses the run if it’s missing, so you find out up front rather than from a short order count. It’s a checkbox on the custom app’s Admin API scopes; tick it, reinstall the app, and update the token if it changed.

You only need scopes for what’s enabled on the migration. Adding more later means re-issuing the token.

Or use a connected store instead

Instead of creating a custom app and managing scopes by hand, connect the source store once on the Stores page using the Graftport app, then pick it from the store dropdown in the wizard’s source step (or on the migration’s Settings tab). The token is created and applied automatically — including read_all_orders, so order extracts are never capped to the last 60 days.

Quirks Graftport handles

  • Pagination — Graftport pages through the source’s catalog automatically; no manual chunking needed.
  • Rate limits — Graftport backs off and retries when Shopify throttles. You don’t need to babysit long extracts.
  • Metafields come along automatically for every resource that supports them, keeping the namespace, key and type they had on the source store. Fork the mapping if the merchant wants them renamed or filtered. Metafields owned by Shopify itself or by an installed app are left behind — the destination store rejects writes to those, and the apps recreate their own.
  • Locales — primary locale only by default. Multi-locale stores need a fork that emits one Shopify Translation per non-primary locale.

What comes across

Products (with type, category, options in the merchant’s own order, cost-per-item, tracking settings and metafields in their original namespaces), collections — including automated ones, which stay rule-driven rather than becoming a frozen list — customers with all of their saved addresses, orders with tax, payment gateways, refunds, fulfillment tracking and real discount codes, blog articles, discount codes and redirects.

Orders are attached to the customer who placed them, so the customer’s order history follows them to the new store.

What doesn’t come across

Plan around these before you promise a merchant a like-for-like store:

  • Gift cards. Shopify shows a gift card’s code once, when it’s created, and masks it everywhere after — so there is no way to read existing codes out of the source store. A migrated card would be one no customer could spend. Issue replacement cards from the destination store instead.
  • Cancelled orders arrive as ordinary orders in whatever payment state they were cancelled in. Shopify can’t create an order that is already cancelled; cancelling is a separate action after the fact.
  • Stock is consolidated to one location by the default mapping, because a source store’s locations don’t exist on the destination. Fork the mapping and map your locations if the merchant runs several.
  • Only the first code on a discount comes across. Most discounts have exactly one, but a campaign that generated a batch of unique codes arrives as a single code. Regenerate the batch on the destination if the merchant still needs them.
  • Pages and markets. No migration path today.

Re-running a migration never recovers these — the data either isn’t readable from the source or isn’t writable at the destination. Where a gap matters, the usual answer is to keep the source store on a paused plan for reference.

Last updated on