← All guides9 min read

Running Shopify migrations as an agency: the multi-client playbook

How agencies and multi-brand teams structure Graftport for multi-client Shopify migration work: account hierarchy, shared billing, mapping reuse, parallel go-lives, and handoff.

Agencies and multi-brand teams have a different relationship with migration tooling than a merchant running a one-time move. You are running migrations repeatedly, for different clients, on different source platforms, with different timelines — often in parallel. This guide covers how Graftport's account model fits that workflow: how to structure your account, reuse mapping work across clients, run parallel migrations safely, and hand off a completed migration to a client's own Shopify admin.

The account model

Graftport organises work into three layers:

Tenant (your agency)
└── Migration (one per source → destination pair)
    ├── Mapping (one per resource type, versionable)
    └── Run history

One tenant, many migrations. Your agency has one Graftport account (the tenant). Every client migration lives inside that tenant as a separate migration object. The billing and record allowance roll up to the tenant level; individual migrations don't have their own billing thresholds.

Migrations are isolated. Source credentials for Client A are never readable by Client B. A mapping change on one migration cannot affect another. Row-level security at the database layer enforces this — there is no configuration option that relaxes it.

All users see all migrations. Every user on your tenant can see every migration. If you need to keep Client A's data invisible to a contractor who works only on Client B, the current model does not support that. Per-migration access control is on the roadmap; today, the trust boundary is the tenant, not the individual migration.

Naming conventions

Migrations appear in a list. Names that actually help: NorthwindHome (Magento 2.4 → Shopify Plus) or PetStore UK (WooCommerce → Shopify). Names that don't help: Client, Migration 1, Test.

Include the source platform in the name. It removes ambiguity when you have three WooCommerce migrations open at once. Include a status qualifier if useful: PetStore UK — staging for the staging run and PetStore UK — production once the production migration is live.

Reusing mapping templates

The biggest productivity gain for agency teams is mapping reuse. Most Magento stores share a common product attribute structure; most WooCommerce stores use variations the same way. A mapping you built carefully for Client A is a starting point for Client B.

Fork, don't start from scratch. When you open the mapping editor on a new migration, you can fork an existing template from any migration on your tenant. The forked mapping starts as a versioned copy — edit it freely without touching the source.

Versioning protects you. Every save creates a new mapping version. If a fork of Client A's mapping breaks on Client B's product data, you can revert to the last working version in two clicks. The migration's run history always records which mapping version each run used — essential for post-go-live auditing.

Custom attribute mapping. If multiple clients use similar Magento custom attribute structures, the metafield mapping approach is the same across clients. Build it once on the first client, document the expression pattern, and fork it for subsequent clients. The guide on mapping Magento custom attributes to Shopify metafields covers the pattern in detail.

Parallel migrations

Multiple migrations can run simultaneously on the same tenant. There is no global lock — each migration runs its own extract, transform, and load against its own source and destination without interfering with any other.

What to watch when running parallel migrations:

Shared allowance. The tenant's included monthly records are shared across all migrations that fire during the billing month. If two large migrations load in the same month, they consume from the same pool. Plan your go-live schedule with this in mind; staggering large loads across billing months can reduce overage. Use the pricing calculator at graftport.com/pricing to model each migration's projected first-load count.

Shared team. All users on the tenant can start runs on any migration. Agree on a convention for who owns the "run" button for a given migration — the last thing you want is two engineers both kicking off a load on go-live night.

The go-live sequence for agency teams

The sequence for each client migration should be reproducible, regardless of source platform:

  1. Set up the migration — source credentials, destination token, enabled resources, mapping forks as needed. Two to four hours for a standard migration; more for complex attribute mappings.

  2. Staging run — full (extract + transform + load) against a development or partner Shopify store. Walk the destination with the client to sign off.

  3. Delta before go-live — on go-live day, extract again against the live source to pick up changes since the staging run. Transform and dry-run to confirm the delta counts.

  4. Go-live load — load with dry-run off. Graftport skips everything already on staging (at zero cost) and loads only the new and changed records. See Re-running a migration on go-live night for the timing sequence.

  5. DNS flip — once the load reports succeeded, flip DNS to the destination.

  6. 24-hour delta — the next day, run one more extract + load to catch orders placed during the DNS propagation window.

The pre-go-live checklist has the full verification drill your team should run on staging before any go-live.

One-off Magento merchant?

The above workflow is optimised for agencies doing repeated replatforms. If you're looking at a single Magento store that needs a one-off done-for-you move rather than a self-serve migration, our sister product Move to Shopify is designed for that scenario — a flat fee, no tooling to learn.

Client handoff

When the migration is complete and the destination store is live, you'll want to hand the destination store over to the client while archiving or removing access from your Graftport tenant.

On the Shopify side: transfer the destination store to the client's Shopify Partners account or to their own Shopify admin. This is a Shopify admin operation, not a Graftport one.

On the Graftport side: the migration record stays on your tenant. The source and destination credentials remain encrypted in the migration object — useful if you need to run a final delta extract weeks after go-live. When you're fully done, you can clear the credentials from the Edit migration page to remove Graftport's access to both stores.


Ready to run your first multi-client migration?

Set up a free account, connect a source, and run a dry-run to see exactly what lands in Shopify before committing.

Start at app.graftport.com · See the pricing model


Related reading:

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