I imported 200 products and none of them have images. Is there a way to bulk-attach photos instead of uploading them one at a time?

Shopify's CSV importer can attach dozens of images in one pass, but only if you map image URLs to product handles yourself first. Here's the native workflow that replaces manual, one-by-one uploads.

importimagescsvproductsbulk-editing

What's going on

After importing a batch of products into Shopify, it's common to end up with dozens of products that have no images, or only a placeholder, because the import file and the image files came from different sources, such as a supplier spreadsheet, a photographer's folder, or a previous platform's export, that were never linked together. The product data imported fine, but the images have to be attached separately, and the only obvious path in the admin is opening each product and uploading its photos one at a time, which does not scale past a handful of products.

This is a matching problem, not a missing-feature problem. Shopify's product CSV format already supports attaching any number of images to any number of products in a single file, but it does so by exact text matching on the product's Handle, not by anything visual or automatic. If you don't already have a list that says this image file goes with this product handle, the importer has nothing to work with, and the instinct to just do it manually in the admin takes over. For a store with dozens of new products and image folders named by supplier SKU, color, or a numbering scheme that doesn't match Shopify's handles, building that mapping list is the actual work. The CSV upload itself takes seconds once the mapping exists.

Merchants who've gone through a migration or a large supplier import often hit this repeatedly, since every new product batch arrives with images and product data as two disconnected sources rather than one clean feed.

Why it happens

Shopify's product importer treats the product row and its image rows as separate lines in the same CSV, linked only by the Handle column: the main product row carries the title, price, and other details, and each additional image gets its own row with the same Handle and nothing else filled in except the Image Src column, and optionally Image Position. There is no fuzzy matching, no image recognition, and no way to drag a folder of photos onto a batch of products in the admin UI. The connection has to be spelled out as text, row by row.

When products and images come from different original sources, such as a supplier catalog versus a photo folder, or an old platform export versus a freshly shot batch, that handle-to-image mapping usually doesn't exist yet, so it has to be built by hand or with a spreadsheet formula before the CSV importer can do anything with it. That extra step is invisible to merchants expecting the import itself to somehow already know which photo belongs to which product, which is why the manual, one-row-at-a-time workaround feels like the only option even though it doesn't scale.

4 ways to fix it

1

Do the matching in a spreadsheet before you touch the admin, not row by row in the browser

Export your products (or reuse your original import file) and open it alongside a list of your image files. Add one column with the exact file name or URL for each row, then use a lookup formula (VLOOKUP or XLOOKUP in Excel or Sheets, or a join in a text editor) to match image files to product handles or SKUs by a shared key such as SKU, barcode, or a supplier code embedded in the file name. Once matched, paste the results into the Image Src column of a CSV formatted for Shopify's product importer, adding one extra row per image that repeats the same Handle as the product's main row and leaves every other column blank. This turns a manual, click-through task into a single re-import, because Shopify's product CSV format matches images to products by the Handle column, not by anything visual.

2

Upload everything to your Shopify Files first, then pull the generated URLs into your CSV

If your images aren't hosted anywhere public yet, go to the Files section of your Shopify admin and bulk-upload the whole batch. Shopify accepts large multi-file uploads there and generates a permanent, public URL on Shopify's CDN for each image. Name your source image files something predictable before uploading, matching SKU or handle, so you can find each generated URL quickly, then feed those URLs into the Image Src column of your import CSV as in the fix above. This avoids the most common reason bulk image imports silently fail: share links from Dropbox, Google Drive, or OneDrive usually point to an HTML preview page rather than the image file itself, so Shopify can't fetch them. Direct, public HTTPS links to the actual image files are what work reliably.

3

Re-import as a targeted update instead of redoing the whole product import

You don't need to touch every column again. Build a CSV that contains only Handle and Image Src (plus Image Position if ordering matters), choose the option to overwrite existing products with matching handles when you import, and Shopify will treat it as an update: rows with a Handle matching an existing product get new images added, and any field you leave out of the file stays untouched. This is the fastest native path once your URL-to-handle mapping exists, and it matches how the CSV import is meant to be used for dozens of rows at once, rather than the admin's one-product-at-a-time image uploader.

4

For very large or recurring catalogs, use a bulk import or export app built for this

If you're regularly importing from a supplier feed, or the matching logic is more complex than a simple handle or SKU join, such as multiple images per variant color pulled from a folder structure, a dedicated product import app from the Shopify App Store can automate the URL-to-handle matching, validate image URLs before import, and rerun the same mapping on future batches without you rebuilding the spreadsheet logic each time. This is worth the setup cost mainly if you'll repeat the process regularly. For a one-off cleanup of an existing import, the spreadsheet-and-CSV approach above is usually faster and doesn't require a new app.

Bottom line

There's no button in Shopify's admin that automatically matches a folder of images to the right products. The fix is always some form of mapping image URLs to product handles or SKUs in a spreadsheet, then feeding that mapping through the CSV importer, or an import app, as a single batch. Do the matching once, re-import with only Handle and Image Src populated, and dozens of rows becomes one operation instead of dozens of manual uploads. If this is a recurring supplier-feed workflow rather than a one-time cleanup, a general product-import or data-management app is a better long-term fit than any single-purpose tool built for a narrower job.

Still Stuck?

Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.