This question comes up regularly and the short answers (“try Matrixify” or “it’s complicated”) are both true but underspecified. Disclosure upfront: I develop Product Save & Sync, one of the apps in this space. I’ve tried to write this so it’s useful whether or not you install it. PSS is named alongside the other tools, not positioned as the answer.
The short version
Shopify has no native way to copy products from one store to another. Tools in the space split into three approaches:
- CSV or Excel as an intermediate file (e.g. Matrixify). Export from source to file, import file to target. Human-editable and inspectable in the middle, good for bulk edits. Flat tabular format loses fidelity on anything nested.
- Direct cross-store copy without a user-facing file (e.g. Duplify). Install on both stores, configure what to copy, run the export. No intermediate file to inspect or edit before the data lands on the target.
- Structured-format export with optional transfer (e.g. PSS). JSON snapshots can be downloaded for inspection or archive, or transferred directly between installations. Nested format preserves references and relationships that flatten out in CSV.
A fourth option exists but isn’t really a tool choice: manual rebuild. Fine for ten products, painful for anything more.
A handful of specific things cause most of the cross-store copy failures I’ve come across, and knowing which one you’re hitting saves time bouncing between apps.
What copies cleanly with most tools
Standard product fields, variants with their SKUs and prices, basic product images, and simple metafield values (text, numbers, dates) come across reliably with just about any tool in this space. If your catalogue is straightforward, almost anything works and the choice comes down to price and workflow preference.
It’s when your catalogue has any of the following that tool choice starts to matter.
The five things that quietly break
1. Metafield references to metaobjects
Symptom: you import products, the metafield values appear to be gone, or show as null when you query them from a theme.
What’s happening: a metafield of type reference points at a metaobject. On the source store that metaobject exists with a specific handle. When the product imports to the target store, the reference expects the metaobject to already be there with the same handle. If it isn’t, the reference saves as null and nothing warns you.
How to check: import one product that uses a metaobject reference. Open it in the target store admin. If the metafield shows the reference, you’re fine. If it’s empty, your tool didn’t bring the metaobject across with the product.
What to do: pre-create metaobjects on the target manually before importing, script the creation via the GraphQL Admin API first, or use a tool that carries metaobject definitions and instances alongside products.
2. Metafield definitions travelling with their values
Symptom: metafields appear correctly in the target store admin, but don’t show up in your theme, Storefront API queries, or Liquid.
What’s happening: in Shopify, a metafield has both a value and a definition (the schema - type, validation, access settings). Values can import without their matching definition existing on the target. But themes read metafields through their definition. Without it, the value is there but invisible to the storefront.
How to check: after import, go to Settings > Custom Data on the target store and check whether the metafield definitions match the source.
3. Variant option structure
Symptom: products that had multiple variants on the source store end up as single-variant products on the target, or variants get dropped.
What’s happening: CSV represents each variant as a row. The product-level fields repeat on each row; the variant-level fields are separate columns. When a column is missing or mislabelled, the import silently collapses the structure.
How to check: for one multi-variant product, compare the variant count on source vs target after import.
4. Image URLs vs image files
Symptom: products import, image placeholders appear, but the actual images don’t load.
What’s happening: CSV-based imports reference images by URL. At import time, the target store fetches each URL. If the URLs point to CDN paths that have rotated, the product was deleted, or the source site is unreachable, the import creates blank image records with no error surfaced.
How to check: before a large import, pick one image URL from your export file and open it in a browser. If it 404s or redirects to a placeholder, you have a problem.
What to do: if URLs are stale, tools that carry actual image files (rather than URL references) avoid this class of failure entirely.
5. Collection memberships vs full collection details
Symptom: products end up in the right collections on the target store, but the collections themselves are empty of detail - no title styling, no description, no image, no smart-collection rules.
What’s happening: some tools copy which products are in which collections, but not the collection’s own properties. You’re left rebuilding the collection pages manually on each target store.
How to check: after import, open a collection on the target store admin and compare its fields to the source.
The three things that genuinely don’t transfer
These are Shopify platform limits rather than tool limits, so they apply regardless of what you use:
- GIDs. Every resource on a Shopify store (products, variants, collections, metaobjects, customers, orders) has a Global ID that Shopify assigns on creation. When anything is recreated on a target store, it gets a new GID. SKUs and handles can be preserved; the underlying IDs cannot. Worth knowing if external systems (reviews apps, ad pixels, analytics, custom integrations) reference products or variants by their Shopify ID rather than by SKU or handle - those references will break after a cross-store copy.
- Customer passwords. Encrypted at the platform level and not exportable by design. Migrated customers have to go through password reset on the target store.
- App installations and their internal state. Each app install is a separate OAuth relationship with the store. You can reinstall the same apps on the target store, but their internal data (configuration, cached records, subscription details) is per-install and starts fresh.
How the pricing models compare (structurally, not in numbers)
Pricing is where the apps diverge the most, and the structural shape matters more than any specific number.
- CSV/Excel tools typically price by tiers of volume processed per file. Suits very small use (free demo tier) or very large (enterprise); the middle tiers are a judgement call on whether the volume cap matches your workflow.
- Direct-copy apps with per-job caps price by how much you move per run. Per-job caps mean larger catalogues need higher tiers.
- Flat-monthly tools price the same regardless of volume. Predictable, and the case for flat vs tiered pricing gets stronger the more you’re moving.
A practical footnote on development stores: when a dev store subscribes to an app plan through Shopify’s managed billing, Shopify creates a test subscription rather than charging it. Apps using managed billing therefore can’t charge a dev store, which makes a production-to-staging pairing effectively one paid install. Apps that handle billing themselves (outside Shopify’s managed system) can still charge a dev store, though some offer a free “additional store” or “sponsor store” policy as a workaround. Worth checking the specific app’s billing model if dev-store cost matters to you.
Which tool fits which situation
Three apps I’d shortlist, described by what they are rather than in comparison:
- Matrixify - CSV and Excel based. Mature, broad scope (products, orders, customers, metafields, and more). If you want a spreadsheet in the middle of your workflow for inspection or bulk editing, this is the category leader.
- Duplify - Direct cross-store cloning, broader scope than just products (pages, blogs, customers, orders, themes). Per-job tiered pricing that scales with catalogue size.
- Product Save & Sync - What I build. Product-scope copy (no customers or orders) via JSON snapshots that can be downloaded or transferred to a second installation. Carries metafield values alongside their definitions, metaobject definitions alongside their instances, and actual image files rather than URL references. Flat monthly pricing.
The actual advice
Most cross-store copy failures come down to one of the five things above. If your catalogue has no metafields, no metaobjects, standard variant structure, and you don’t care about collection details, almost any tool works and you can pick on price and interface alone.
If you have any of: metaobjects referenced from metafields, custom metafield definitions your theme depends on, more than a handful of variants per product, or collections with custom details - the tool choice becomes load-bearing. Test with one product first. Check the five things above on the target store before running a full migration.