Copying products from a website built on Shopify comes up in two situations that look different and use the same tools. Dropshippers copy products from a supplier’s store into their own. Store owners move their own catalog, to a new store, a new domain, or a backup file that isn’t hosted by Shopify. Both cases end at the same place, a CSV file that Shopify’s admin can import, and this guide covers every route to that file. Shopify’s built-in export, the public /products.json endpoint, migration apps, and a no-code scraper each produce one that works on stores you don’t own.
Four Ways to Move Shopify Products
Each transfer method covers a different combination of access and effort. The table sums up what each one moves and where it stops:
| Method | Works on | What you get | Where it stops |
|---|---|---|---|
| Built-in CSV export | your own store | full product CSV, import-ready | product images travel as URLs, variant metafields stay behind |
/products.json | any store that hasn’t closed it | raw JSON, 250 products per page | no inventory counts, no metafields, needs conversion before import |
| No-code Shopify scraper | any store | CSV, JSON, XLSX, or an import-ready Shopify CSV | products only, 1 credit per row |
| Matrixify or Duplify | your own store | bulk import, export, migration, and for Duplify themes and pages too | both install into an admin, so neither reads a store you don’t control |
Both of those are what Google’s AI Overview suggests when you ask it how to copy a Shopify store, and both hit the same wall. They install into an admin, so the store has to be yours. Duplify covers themes, pages and metafields as well as products, which the public endpoint below never sees.
The built-in export is in the admin under Products. Shopify’s own export documentation names three tasks for it, creating a backup, moving products to a new store, and editing them in bulk in a spreadsheet. Two of its behaviors surprise people mid-migration. Exporting the current page or a selected set downloads the CSV in the browser, unless one of those products has more than 100 variants, in which case it arrives by email. Every other option, including All products, is emailed either way, and images are referenced by URL rather than embedded, so they only survive the import while the old store keeps serving them.
What the Public Products Endpoint Gives You
Every Shopify website publishes its catalog as JSON. Adding /products.json to the store’s address returns products with titles, descriptions, images, tags, and variants with prices and SKUs. It shows a store’s raw catalog without any tooling, and it stops well short of a transfer. On a run against a live store today, the endpoint returned at most 250 products per request. Asking for more with limit=400 still returned 250, and deeper pages come from a page parameter instead.
The variant records carry an available flag and nothing about stock levels, metafields don’t appear at all, and the output is plain JSON rather than a CSV the Shopify admin can import, so everything still needs mapping into import columns by hand. Some stores close the endpoint entirely. One large store answered it with a 403 during the same check. Treat /products.json as a way to inspect a catalog, and use one of the other routes when the goal is products landing in your own store.
Exporting Data from Another Shopify Store
The Shopify no-code scraper reads any store’s public catalog and hands back a file ready for import, which makes it the route for catalogs you don’t own. Sign up or log in to HasData. A new account starts with 1,000 free credits, and the scraper bills 1 credit per product row, so the free balance covers a catalog of up to a thousand products.
In the dashboard, open No-Code Scrapers and pick Shopify under E-Commerce.

The scraper takes two inputs, the store URL and a three-letter currency code for the prices. Click Run Scraper and the job appears in the History pane while the results table fills on the right. The results pane shows every extracted row with the product id, name, handle, description, and the rest of the 16 columns before anything gets downloaded.
For scale, the run behind the screenshot below read a 70-product store, took 8 seconds, and cost 70 credits.
To take the data out, use the download button above the results table and pick a format. CSV, JSON, and XLSX suit review and editing. The SHOPIFY option is the one built for this guide’s job:

The SHOPIFY download is Shopify’s own product import schema, with Handle, Title, Body (HTML), Vendor, variant columns, image URLs, and Status. On that run, 70 products became 315 CSV rows, because Shopify’s format gives each variant and each extra image its own row. That’s normal, and the admin reassembles them into products on import.
Importing the CSV into Your Own Store
The file from the previous step imports into any Shopify store, new or existing. If the store doesn’t exist yet, shopify.com walks you through a short questionnaire (business type, sales channel, country) and generates the admin in a few minutes. A new store starts hidden from the public until you open access and connect a domain, which leaves room to import and tidy the catalog first.
In the admin, open the Products section and click Import:

Drag in the downloaded CSV and click “Upload and preview”:

Shopify parses the file and shows a preview with the product count, images, and names, so a mapping problem surfaces here rather than in the catalog:

Confirm the preview and the upload continues in the background, so the window can be closed while products land:

Imported products appear on the Products page, sometimes gradually when the upload runs in the background:

One import option matters for repeat runs. The import dialog offers “Overwrite products with matching handles”, which updates existing products instead of duplicating them, and that’s what makes a repeat run a sync rather than a second pile of products.
Migrating Your Own Store
The same CSV pipeline covers the migration questions store owners actually search for, and the admin export already holds the fields the scraper has to rebuild.
The admin’s export produces the full product CSV, and product metafields are included once they’re defined, per Shopify’s import/export documentation. Variant metafields don’t travel in the CSV, and the file stores image URLs rather than the images themselves, so a CSV alone doesn’t preserve pictures once the store that hosts them goes down. For a backup that survives the store’s closure, save the image files separately.
Moving to a new domain is usually a settings change, since a domain connects to the existing store in the admin’s domain settings. Data moves when the destination is a genuinely new store. Export from the old admin, import into the new one, and point the domain at the new store once the catalog checks out.
Shopify Partners build in client transfer stores, which take only free and partner-friendly apps while they stay in the partner organization, and don’t process real transactions until they’re handed over to the client. The catalog reaches one of those through the same CSV import as any other store.
Exporting Data from Amazon to Your Shopify Store
Stocking a Shopify store from Amazon instead of another Shopify shop uses two scrapers from the same dashboard.
The Amazon Search scraper collects products from search results. It takes keywords or Amazon URLs plus a results-per-keyword count, and returns whatever the search surfaces, which suits filling a category from scratch:

For known products, the Amazon Product scraper takes ASINs or product URLs directly and returns the full listing details for each:

Both hand back CSV, JSON or XLSX, so an Amazon result set still needs mapping into Shopify’s import columns before the admin will take it, and the selection stays as narrow or wide as the keyword list you feed in.
Conclusion and Takeaways
The route depends on whose store holds the products. Your own store exports from the admin, and the only traps are image URLs that stop resolving once the old store closes and variant metafields that never enter the CSV. Someone else’s store offers /products.json for a look and the no-code scraper for a transfer, at 1 credit per product row with an import-ready file at the end. Either way the last mile is identical, one CSV through the admin’s import dialog, with overwrite-by-handle keeping repeat imports in place.


