How Agencies and Developers Export Shopify Product Images at Scale

an agency desk with multiple screens showing product image exports

Exporting Shopify product images at scale is one of those tasks that sounds simple until you’re staring at 14,000 images across 3 client stores with no consistent naming convention. Agencies hit this wall constantly: client migration, catalog backup, marketplace syndication, or just handing off assets to a photographer who needs the current state of every product shot. Shopify’s native export gives you a CSV with image URLs. It does not give you the actual files.

That gap between “here are your URLs” and “here are your files organized by collection” is where agencies waste hours. I’ve seen teams manually right-clicking and saving images one by one. For 200 images. Don’t do that. There are faster ways, and some of them are free.

Run your images through our Image Audit tool before exporting to catch missing alt text and broken URLs. Cleaning up before export saves time on the other end.

On this page

CSV export + URL download

The free path. Every Shopify store can export products as CSV, and every row includes an “Image Src” column with the CDN URL. The trick is turning those URLs into actual files on your machine.

  1. Go to Products > Export. Select “All products” and “Plain CSV.”
  2. Open the CSV. The “Image Src” column has URLs like cdn.shopify.com/s/files/1/xxxx/products/filename.jpg
  3. Extract the Image Src column into a text file, one URL per line.
  4. Use wget or curl in a terminal to batch-download: wget -i urls.txt -P ./exported-images/

That’s it for the basic version. The problem? Filenames are whatever Shopify assigned them, which is often a hash like “7d4f8c2a-b3e1.jpg” with no connection to the product name. For an agency handing files to a client, that’s useless.

You can improve this with a script that reads the CSV, maps each URL to the product handle and variant, and renames during download. Python, Node, Ruby, whatever your team uses. The logic is straightforward: for each row, download the image, rename it to {handle}_{position}.jpg, drop it in a folder named after the collection or vendor.

Validate your CSV before scripting against it. Our CSV Validator catches encoding issues and malformed rows that would break a download script.

Shopify Admin API method

For agencies with developer resources, the Admin API gives you the most control. You can query products with their images, filter by collection or date, and download with full metadata attached.

The GraphQL Admin API is the right choice here (REST works but hits rate limits faster on large catalogs). A basic query:

  1. Authenticate with a custom app or private app credentials.
  2. Query products with the images connection: id, src, altText, width, height.
  3. Paginate through results (Shopify returns max 250 products per page via REST, or use cursor-based pagination in GraphQL).
  4. Download each image URL, rename it based on product data, organize into folders.

The API approach shines when you need to filter. Want only images from products in the “Summer 2026” collection? Or only images updated in the last 30 days? Or only the first image per product (for a lookbook)? The API handles all of that. CSV export can’t filter at that granularity.

Rate limits matter at scale. Shopify gives you a bucket of API calls that refills over time. For a store with 10,000 products, your script needs to respect throttling or you’ll get 429 errors. Build in retry logic with exponential backoff.

App-based export

Not every agency has a developer on call to write API scripts. Apps bridge that gap.

AppWhat it doesBest for
CS Export Product ImagesExport as ZIP, filter by collection/vendor/tag, rename during export, CSV with metadataAgencies who need organized deliverables without coding
MatrixifyExport products with all media URLs in structured spreadsheetTeams already using Matrixify for import/export workflows

The CS Export Product Images app was actually built for this exact agency use case. You pick a collection, hit export, and get a ZIP file with images renamed to something a human can understand. It also exports a CSV with the filename, product title, SKU, alt text, and position, which is useful for asset management spreadsheets.

For agencies managing multiple client stores, the app approach is faster than writing a custom script for each store. Install, export, uninstall. Move to the next client. The app stack audit guide explains how to add and remove apps cleanly without leaving residual code in the theme.

File naming and folder structure

This is the part agencies get wrong more than anything else. You export 8,000 images into a flat folder and now nobody can find anything. A good folder structure for client handoffs:

Three approaches that work:

  1. By product handle: /exported/blue-cotton-tee/blue-cotton-tee_1.jpg, blue-cotton-tee_2.jpg
  2. By collection: /exported/summer-2026/blue-cotton-tee_1.jpg
  3. By vendor: /exported/nike/blue-cotton-tee_1.jpg

Option 1 is the safest for re-import. If filenames match product handles, SKU-based matching during upload becomes trivial. Our Bulk Image Renamer can help you standardize filenames before or after export.

Whatever you pick, document it. A README in the export folder explaining the naming convention takes 30 seconds to write and saves hours of confusion when the client’s new developer opens the folder six months later.

Preserving image metadata

When you download an image from Shopify’s CDN, you get the pixel data. You don’t get the alt text, the position in the gallery, or the variant assignment. That metadata lives in Shopify’s database, not in the image file itself.

For a complete export, you need two things: the image files and a metadata CSV that maps each filename to its product, alt text, position, and variant. Without the metadata CSV, re-importing those images means reassigning alt text and positions from scratch.

This matters especially for stores using per-variant image assignments. If a product has 6 images assigned to “Red” and 6 to “Blue,” your export needs to capture that mapping, not just dump 12 files into a folder. When you re-import to a new store, you’ll need that mapping to reconstruct the assignments.

If the destination store uses a variant image app like Rubik Variant Images, the app can reassign images via its bulk assign feature once images are uploaded in the correct gallery order. But you need to know the correct order, which means exporting it properly in the first place.

Handling large catalogs (5,000+ products)

At scale, every approach has bottlenecks. CSV exports can time out for stores with 50,000+ products. API pagination gets slow. ZIP files become multi-gigabyte monsters.

What works for large catalogs:

  • Export in batches. By collection, by vendor, or by date range. Don’t try to grab everything in one pass.
  • Use parallel downloads. A script that downloads one image at a time will take hours for 10,000 images. Five concurrent downloads cuts that to a fraction.
  • Store on cloud first, not local. Download to an S3 bucket or Google Cloud Storage, then move to local when needed. Cloud-to-cloud transfers from Shopify’s CDN are faster than cloud-to-local.
  • Compress after export if needed. Shopify serves images at their original upload resolution. For web use you probably don’t need 4000px originals. Our Image Compressor handles batch compression.

One more thing. If you’re exporting for migration to another platform (WooCommerce, BigCommerce, whatever), keep the Shopify CDN URLs in your mapping file. Most platforms can import from URL, meaning you might not need to download the files at all. Just point the new platform at the CDN URLs during import. Shopify doesn’t delete CDN files immediately after store closure, so you usually have a window.

But don’t rely on that. Back up the actual files. CDN URLs are not permanent storage.

FAQ

Can I export Shopify product images as actual files, not just URLs?

Not natively. Shopify’s product export gives you a CSV with CDN URLs. To get the actual image files, you need to download those URLs using a script (wget, curl), an app like CS Export Product Images, or the Admin API with a download step.

How do I export images for a specific collection only?

Shopify’s native CSV export doesn’t filter by collection. Use the Admin API to query products by collection ID and export their images, or use an app that supports collection-based filtering.

Will exported images include alt text and metadata?

The image files themselves don’t contain Shopify metadata. You need to export a separate CSV mapping filenames to alt text, product handles, variant assignments, and gallery positions. The Admin API and some export apps include this metadata.

What’s the fastest way to export 10,000+ product images?

Use the Admin API with parallel downloads (5-10 concurrent connections) and download directly to cloud storage. Export in batches by collection or vendor to avoid timeouts.

Do Shopify CDN image URLs expire after store closure?

Shopify doesn’t immediately delete CDN files, but they are not permanent. Always download and back up the actual files rather than relying on CDN URLs for long-term storage.

How should I name exported image files?

Use the product handle plus position number: product-handle_1.jpg, product-handle_2.jpg. This makes re-importing with SKU-based matching straightforward and keeps files organized by product.

Co-Founder at Craftshift