← All guides10 min read

Setting up your first Graftport migration: a walkthrough

A step-by-step walkthrough of creating your first migration in Graftport: signing up, choosing a source platform, connecting the destination Shopify store, picking resource templates, and running the first dry-run.

This is the walkthrough we run new accounts through on their first call. It maps every screen in the New migration wizard at app.graftport.com to what is happening server-side and what you need to decide. If you prefer reading to clicking, this is the article for you.

Prerequisites

Before you start, you need:

  1. A Graftport account. Sign up at app.graftport.com/signup. Free to set up; the platform fee starts billing the month you ship your first migration.
  2. A source store you have access to. One of the live source platforms (see below).
  3. A fresh Shopify store to migrate into. Either a new dev store under your Shopify Partner account, or an existing destination store you control. Graftport never writes to a store unless you provide its credentials, by design.

Live source platforms

As of this writing, the New migration wizard supports three live source platforms:

SourceStatusAuth
MagentoLive (2.3, 2.4)Admin user with read permissions
ShopifyLive (source)Admin API access token
WooCommerceLiveREST API consumer key + secret
BigCommerceComing soon

If your source is not in the list, reach out — we add platforms in the order our pipeline can model their data cleanly.

Step 1 — Basics

Once you click New migration, the wizard's first step is Basics. Three areas:

  • Migration name. Use the merchant's brand name. This is what you will see in the migration list and in any internal references. Examples: Northwind Home Goods, Acme EU, Helmer Shop.
  • Slug. Auto-derived from the name (northwind-home-goods). Used in URLs and internal references. You can override it. The validator allows lowercase letters, digits, and hyphens.
  • Source platform. Click one of the available tiles. The credential fields below the picker reshape to match the source schema.
  • Source credentials. What gets asked for depends on the source you picked:

For Magento:

  • Magento store URL — your live admin URL
  • Admin username — a user with read permissions
  • Admin password

For Shopify (source):

  • Shop domain — <store>.myshopify.com
  • Admin API access token — from a custom app on the source store

For WooCommerce:

  • WordPress site URL — full URL including https://, no trailing slash
  • Consumer key — generate in WooCommerce → Settings → Advanced → REST API. Read permission is enough.
  • Consumer secret

The credential schema is loaded live from the database (app.platform_credential_schema), so adding a new source platform is a server-side schema update — no app deploy.

Step 2 — Connect destination

Step 2 collects the Shopify store you are migrating into. Two fields:

  • Shopify shop domain. The .myshopify.com host. Paste it exactly: northwind-home-goods.myshopify.com. Graftport will sync your destination store's locations automatically the moment the migration is created — that data feeds inventory mapping.
  • Destination credentials. A Shopify admin API access token with the scopes the platform needs (read/write Products, Customers, Orders, Inventory, Online Store, plus Files for product images). The exact scope list is shown next to the field.

A common pattern: create a dedicated custom app in the destination Shopify store called Graftport Migration. Paste the Admin API access token into Graftport. The custom app is your audit log; you can revoke it the moment migration is done.

Step 3 — Choose resources

Step 3 lists the resource types Graftport ships templates for, for the source platform you picked. You decide which ones to seed.

For Magento, the default seed includes: products, collections, customers, orders, redirects, blogs, pages. You can deselect any of them — every deselected resource simply does not get a mapping seeded, and you can add it back later from the migration's resources tab.

The templates are versioned. The wizard shows you the current default template for each resource. Once your migration is created the templates become mappings under your migration — copies you can edit without touching the upstream template. Re-running a migration after the upstream template updates does not retroactively change your mappings; you decide when to bump.

After the wizard: what gets created

When you click Create migration on Step 3, three things happen at once:

  1. A row in app.migration is created, owned by your tenant, status = 'draft'.
  2. For each resource type you selected, a app.mapping row is forked from the chosen template version. The mapping is editable from this moment.
  3. A background job hits the Shopify destination's locations endpoint and stores the location mappings on the migration. This is what enables inventory-by-location to land correctly later.

The wizard redirects you to /migrations/<id> — your migration's home screen.

The migration home screen

The migration page has three tabs:

  • Resources. Each resource you seeded shows up here as a row. Click a row to open the mapping editor.
  • Runs. Empty until you ship your first run. Each run records what happened, what loaded, what failed, with click-through detail per record.
  • Data. A read-only browser of source vs. destination records for any run. Useful for spot-checking after a dry-run.

Above the tabs you have the migration name, status, and the Start a run button.

First dry-run

Before pushing anything to Shopify, do a dry-run on the extract phase. From the migration home screen:

  1. Click Start a run.
  2. In the run modal, choose Mode: Extract only. This pulls from the source and stops before transforming or loading.
  3. Toggle Dry-run on. Dry-run keeps the run on the read side only — no destination writes.
  4. Click Start. The run page opens with a live progress view.

Once the extract finishes, open the Data tab and pick the run. You will see the raw records pulled from the source, normalised into Graftport's intermediate shape. Skim through products and customers; confirm the field shape matches what you expected. If something is missing, the issue is on the source side or in the source-side mapping — fix the mapping and re-run extract.

First load run

When you are happy with the extract:

  1. Click Start a run again.
  2. Choose Mode: Full (extract → transform → load).
  3. Leave Dry-run on for the first try. A dry-run with full mode does extract, transform, and validates the load shape, but does not actually push to Shopify. Useful to catch validation errors before you commit.
  4. Once dry-run is green, repeat with Dry-run off. This actually loads to Shopify.

Records are tracked by their source identity, so anything already loaded is skipped on subsequent runs. Re-running the same migration on go-live night picks up only what changed since the last run.

Where to go from here

  • Edit a mapping. Click any resource in the Resources tab. The editor is split: source schema on the left, destination Shopify fields on the right, with the per-field mapping in the middle. Changes are versioned.
  • See costs. The pricing dashboard shows per-run usage against your monthly included allowance and projects the bill.
  • Add a new resource type. Use the Add resource button on the Resources tab. Pick a resource type, pick a template (or start blank).

Common questions

Do I need a Shopify Partner account to create a destination store? Yes for development stores. For production stores, the destination just needs to be a Shopify store you have admin access to.

What happens if I run the same migration twice? Records already loaded are skipped. New records are loaded. Updated records are re-synced (charged at the cheaper sync rate). Deleted records are not touched on the destination — Graftport never deletes destination records you did not ask it to.

Can I migrate one source store into multiple Shopify stores? Create one Graftport migration per (source, destination) pair. Your mappings can differ between them — for instance, splitting a Magento multi-store into separate Shopify stores per region.

My source is not on the list. BigCommerce is in active development. PrestaShop and Salesforce Commerce Cloud are on the roadmap. Email us if you have a specific need; we prioritise based on signal.

One Magento store, want it handled end-to-end? Move to Shopify is our sister product: fixed-price service, €129 charged only when you accept the result. Same pipeline, run for you.

Related reading

Ready to set yours up? Sign up at app.graftport.com and start your first migration.

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