Skip to Content
TroubleshootingCommon errors

Common errors

What follows is a triage table for the errors that actually come up in production. If you see something not listed, contact the Graftport team with the run item link and the error text — we’ll add it here.

Source connectivity

Error / symptomLikely causeWhat to do
401 Unauthorized on extractWrong credentials, or admin password rotated.Update the credential in the migration’s settings. Re-run extract.
403 Forbidden on a specific resourceThe admin user is missing read scope for that resource.Grant the scope on the source platform; no need to re-issue the credential.
429 Too Many Requests repeatedlySource platform’s rate limit hit.Graftport backs off automatically. If it persists for hours, ask the source platform to raise your limit.
Extract hangs at 0 rowsSource API reachable but returning empty pages, often a misconfigured store domain.Verify the domain in credentials matches what you can browse to. No protocol, no slash.

Mapping / transform

Error / symptomLikely causeWhat to do
JSONata error: instance member of …Mapping references a field that doesn’t exist on this row.Use field ? field : default in the mapping, or filter out rows where the field is missing.
JSONata error: cannot evaluate functionCalling a non-existent function (typo, missing $ prefix).Fix the function name; save creates a new version.
Output is null for some rows but the source row looks fineThe mapping returns nothing when an early condition fails.Use the editor’s sample input with that source row to step through.
Transform produces unexpected payload but JSONata “looks right”Pinned mapping version is older than what’s in the editor.Check the migration’s mapping → version pin. Re-pin and re-transform.

Destination / Shopify load

Error / symptomLikely causeWhat to do
Access denied for write_…Token’s scopes are missing the resource.Reissue token with the correct scopes; update destination credential.
SHOPIFY_BUNDLES_NOT_ENABLEDThe destination store doesn’t have the Shopify Bundles app installed; bundle records can’t load without it.Install the Shopify Bundles app  on the destination store and re-run.
MISSING_REFERENCE on a bundleA bundle product loaded before the products it bundles together; those component products weren’t on the destination yet.Re-run the load — components load first, so a second pass resolves the bundle. If it persists, the component products are out of scope; include them in the run.
handle has already been takenSlug collision with an existing Shopify product.Edit the mapping’s handle rule (e.g. add a SKU suffix), re-transform, re-load.
Inventory not appearing on the right locationDefault mapping assigns to first active location.Resync locations from the migration page; fork the products mapping if you need per-location split.
Records load but are Draft instead of ActiveSource product status doesn’t map to ACTIVE.Check the mapping’s status field; default expects enabled.
Some orders fail with transactions cannot be created on archived orderThe destination order already exists from a prior cut-over and got archived.Switch conflict strategy to skip, or re-create on a fresh destination store.
Staff inboxes flooded with “New order” emails during an order migrationShopify emails staff a notification for every order Graftport loads.Disable Settings → Notifications → Staff notifications before the load, re-enable after. See Before migrating orders.

Run lifecycle

Error / symptomLikely causeWhat to do
Run stays in pending for minutesWorker is busy or down.Check the platform status page. Don’t queue more runs for the same migration — you’ll just deepen the backlog.
Run is running but counts don’t moveRun got stuck.It auto-recovers in most cases; if it doesn’t after several minutes, cancel the run and start a new one — re-running is safe.
Run is failed but no item shows an errorA startup-time validation failed (e.g. credentials missing).Look at the run’s top-level error, not the items. Fix the cause; new runs unblock.
Load shows succeeded but 0 loaded right after you stopped a purgeStopping a purge partway leaves the records past the stop point still loaded and unchanged, so a normal load has nothing new to push.Graftport now says so on the run — “Nothing to load: N records already loaded and unchanged” — instead of a bare green success. Use Resume purge on the migration to finish clearing those records, or run a Load to re-create the ones the purge already deleted.
After stopping a purge, the summary shows records still loadedA stopped purge is partial by design — records it already deleted are reloadable, records it hadn’t reached yet are untouched.The purge summary reports how many records remain loaded and offers Resume purge to finish. Resuming picks up exactly where it stopped.
The “Purge complete” summary banner stays on the migration after it finishedThe banner keeps the last purge’s outcome visible until you’ve seen it.Click the on the right of the banner to dismiss it. It stays dismissed across reloads; the next purge shows its own summary.
Last updated on