← All guides7 min read

Migrating multiple brands on one Graftport account

How agencies and multi-brand parents structure Graftport for parallel migrations: one tenant per agency, one migration per (source, destination) pair, shared monthly allowance, separate mappings, audit-isolated runs.

Graftport is built for teams running migrations as a recurring operation, not a one-shot project. This guide is how agencies and multi-brand parents typically structure their account, what Graftport gives you that a per-project tool does not, and the billing implications of running parallel migrations.

The mental model

In Graftport the unit of access is a tenant: one billable account, one set of users, one shared monthly allowance. Inside the tenant you have migrations: one per (source, destination) pair. Inside each migration you have mappings (one per resource type) and runs (every extract/transform/load attempt).

For an agency, the typical pattern is:

  • One tenant per agency. All your migration work, on one account.
  • One migration per client × source × destination. A client with one Magento store going to one Shopify store is one migration. A client with two Magento installs going to two Shopify stores is two migrations.
  • Mappings are local to a migration. Two clients can pick the same template seed and customise differently without affecting each other.

For a multi-brand parent, the same structure works:

  • One tenant for the parent. Internal brands all on the same account.
  • One migration per brand replatform. Acme EU and Acme US, each migrating from BigCommerce to a separate Shopify store, are two migrations.

Strict isolation between migrations

Graftport is multi-tenant at the database level, but the same isolation principle applies between migrations inside a single tenant. No migration can read another migration's source data, mappings, or runs. The pipeline runner refuses to cross migration boundaries even if you ask it to via raw SQL — the row-level security policies do not allow it.

What this means in practice:

  • A bug in one migration's mapping cannot affect another. Two Magento → Shopify migrations can have completely different product handle conventions, completely different metafield namespaces, no overlap.
  • Different team members can own different migrations. User permissions are per-tenant, not per-migration, but the per-migration audit trail records who ran what.
  • Re-syncing one client never touches another. Run identifiers are scoped to the migration. The pipeline never reaches across.

Parallel runs

You can run extract, transform, and load on multiple migrations simultaneously. The runner queue inside Graftport supports concurrency at the migration level. Two migrations can be in the load phase at the same time without contending — they write to different destination Shopify stores, so the only shared resource is your tenant's pipeline runner pool.

For agencies in launch crunch, this matters: you can ship five clients on the same week, each on their own destination, without serialising the work.

The shared monthly allowance

Pricing on Graftport is one platform fee per tenant plus per-record usage. The monthly included records allowance is shared across every migration on your account that month. Records that go beyond the allowance are charged at the tier rates. Re-syncs are charged at the (cheaper) sync rate.

Practically:

  • A small client's migration can ride for free if a larger client's migration covered the platform fee for the month.
  • The included allowance does not split per migration. It pools at the tenant level. A 100k-record allowance fully consumed by one client leaves the next migration that month charging at tier 1 from record one.
  • Re-syncs get the cheaper rate everywhere. Re-running a migration on launch night after the original load gets the sync rate, not first-load tier rate. This is the same on a single-migration tenant as on a fifty-migration tenant.

The pricing page's calculator estimates the bill for a single migration in isolation; for a multi-migration month, sum the projected first-load and sync record counts across migrations and run the projection once at the tenant level.

Templates as agency standards

Mapping templates are global to the platform — every tenant sees the same defaults. But your tenant can fork any template and edit freely; the upstream template is unchanged.

Agencies typically end up with a working set of forked templates that encode their house style: their preferred metafield namespace, their convention for how to handle bundle products, their policy on customer group → tag mapping. These live as template versions inside your tenant.

When a new client comes in, the wizard's Step 3 picks the upstream template by default. To use your house version, edit the mapping after creation and pick your forked version. Or, if you want it as the default for all future migrations on your tenant, contact us about provisioning a tenant-default template — we ship that as a setting on app.tenant.

Customer-data ownership and access

A common agency question: "If I lose access to a client at the end of an engagement, what happens to their migration data in Graftport?"

  • The migration row stays on your tenant. It is your record of work performed.
  • The source credentials are encrypted at rest. Once the client revokes the source-side admin user, the credentials are useless even on our side.
  • The destination Shopify store is the client's. The destination Admin API token they gave you can be revoked from Shopify Admin → Settings → Apps and sales channels by them, at any time.
  • Run history and mappings are auditable. They live on your tenant. If you and the client want to hand over the migration, contact us — we can move a single migration row across tenants.

Internal team patterns we see work

  • One member owns the source extract pipeline. They handle source-side authentication, credential rotation, and any source-platform-specific gotchas (Magento module quirks, Woo plugin compatibility).
  • One member owns mappings. They become the agency's resident expert on Shopify's metafield model and the standard transforms.
  • The launch engineer owns runs. They schedule the rehearsals, watch the dry-runs, hit the button on launch night.

This is overkill for one or two migrations a year, just right for ten plus.

When to escalate to a per-tenant arrangement

If you are running more than 20 brand replatforms a year, the included allowance and the standard tier rates are not the optimal shape for your usage. Email hello@graftport.com about an enterprise plan: bigger allowance, lower per-record rate above the included tier, dedicated runner pool for your tenant so other tenants' loads do not contend with yours.

Related reading

Running fifty migrations a year through Graftport is the same operation as running one. That is the point.

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