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
| Field | Example | Notes |
|---|---|---|
| Source shop domain | source-store.myshopify.com | Hostname only — no protocol, no trailing slash. Always the .myshopify.com form, not the custom domain. |
| Admin API access token | shpat_… | 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:
| Resource | Scope |
|---|---|
| Products, collections | read_products |
| Customers | read_customers |
| Orders | read_orders, read_all_orders |
| Discount codes | read_discounts, read_price_rules |
| Blogs, articles | read_content |
| Redirects | read_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.