How to Find Duplicate Image URLs in a Shopify Product CSV
When you export products from Shopify, the same image URL can turn up on many rows — across the variants of one product, across separate products, and across every listing still pointing at a placeholder. ImageDup groups those repeated references so you can see which ones are intentional and which are catalog mistakes.
ImageDup compares the text in the Image Src column. It does
not download images, compare pixels, or detect visually similar photos.
Two different URLs that resolve to the same picture are not matched
unless your export also has an image-hash column.
Your CSV is parsed in your browser. It is not uploaded to a server.
What a Shopify product CSV looks like
A Shopify product export is a CSV where the Handle column
is the product’s unique identifier — the slug from its
storefront URL. One product is often several rows: the first
row carries the product details and its first variant, and the
Handle is then repeated on additional rows for extra
variants and extra images.
The Image Src column holds each image’s URL, and
Image Position is the order that image appears in the
product gallery. An “extra image” row repeats the
Handle, sets Image Src and
Image Position, and leaves the other columns blank.
| Handle | Title | Option1 Value | Variant SKU | Image Src | Image Position |
|---|---|---|---|---|---|
| aurora-hoodie | Aurora Hoodie | Small | AURORA-HOODIE-S | …/aurora-hoodie-slate.jpg?v=1699887654 | 1 |
| aurora-hoodie | Aurora Hoodie | Medium | AURORA-HOODIE-M | …/aurora-hoodie-slate.jpg?v=1699887654 | 1 |
| aurora-hoodie | Aurora Hoodie | Large | AURORA-HOODIE-L | …/aurora-hoodie-slate.jpg?v=1699887654 | 1 |
| cedar-desk-lamp | Cedar Desk Lamp | Default Title | CEDAR-DESK-LAMP | …/cedar-desk-lamp.jpg?v=1700430221 | 1 |
| oak-desk-lamp | Oak Desk Lamp | Default Title | OAK-DESK-LAMP | …/cedar-desk-lamp.jpg?v=1700430221 | 1 |
Example Shopify-shaped rows, not a real store export. A full export has roughly 50 columns; these are the ones this check needs.
The first three rows are the three sizes of one hoodie, all pointing at
one photo — the same Image Src repeated within a
single Handle. The last two rows are two different
products, cedar-desk-lamp and oak-desk-lamp,
pointing at the same lamp photo — the same
Image Src across two handles. ImageDup treats those two
situations differently, and the section on
DUPLICATE and REVIEW explains how.
Why the same image URL shows up more than once
Most repeats are a by-product of how the catalog was built and exported, not a deliberate choice:
- Variant rows. Sizes and colors of one product are
separate rows. If the variants were never given their own photos,
every row points at the same
Image Src. - Duplicated products. A new product is created by copying an existing one and the image URL is never changed, so a different product keeps the original’s photo.
- Placeholder images. A “coming soon” or generic category image is assigned to every product without a real photo yet. Dozens of unrelated handles can share one placeholder.
- Gallery rows. Extra-image rows for one product are
normal and expected — they repeat the
Handle, not usually the URL, but a bad export can duplicate a gallery entry. - Migrations and re-exports. Moving between platforms, or exporting from a tool that appends rather than replaces, can put the same product and image on several rows.
A repeated URL is a signal to review, not automatically an error.
How to find them
-
Export your products
In the Shopify admin, go to Products, choose Export, and export as a CSV file.
-
Open ImageDup
Use the tool on this page. Nothing is installed and nothing is sent anywhere.
-
Upload the CSV
Drop in the exported
.csvfile — the CSV itself, not image files. -
Map the columns
Set Product identifier to
Handleand Image URL toImage Src. ImageDup guessesImage Srcand marks the guess so you can confirm it. MapTitletoo, to keep the results readable. -
Review the groups
Each repeated image URL is one row in the results, with the clearest problems — one image on several different handles — listed first.
-
Decide per group
For each group, decide whether the reuse is intentional or a mistake, then fix it in your source data or in the admin.
Checking a CSV before you import it? ImageDup works the same way: map
the Handle column as the product identifier and
Image Src as the image URL, then review repeated image
addresses before uploading the file to Shopify.
Check your Shopify CSV
Upload a product CSV export with at least a Handle and an
Image Src per row. Everything runs in your browser.
A CSV export of your products with at least a product identifier and an image URL per row.
Drop a product CSV here, or choose a file
.csv, up to ~20 MB, first row treated as headers
ImageDup compares image URL text, not image pixels. For the same image served from different URLs, you need an existing image-hash column.
A 12-row Shopify-shaped export with deliberate repeats: one hoodie in three sizes sharing a photo, two different lamp products pointing at the same photo, and a placeholder image used by three unrelated products. Map Handle, Image Src, and Title.
Reading file…
Map your columns
Point each field at a column from your file. The preview shows the first rows so you can see what each column holds.
Scroll to see all columns →
No export handy? Download the example Shopify CSV and drop it into the tool above, or use the sample-data button inside it.
What is in the example CSV
The example Shopify-shaped CSV is built so each result type appears at least once:
- Intentional reuse.
aurora-hoodieis listed on three rows, one per size, all pointing at one photo. Same handle, so ImageDup marks it REVIEW. - A catalog mistake.
cedar-desk-lampandoak-desk-lampare separate products pointing at the same lamp photo — a copy-paste error. Two handles, so it is a DUPLICATE. - A shared placeholder.
coming-soon.pngis used bybrass-hook-set,linen-napkin-set, andceramic-planter. Three handles, so it is a DUPLICATE. - Unique images.
walnut-cutting-boardhas a two-row gallery with two different photos, andmerino-scarfhas a distinct photo per color. Neither is flagged.
DUPLICATE and REVIEW in a Shopify export
ImageDup sorts every repeated Image Src into one of two
groups, based on how many distinct Handle values share it:
- DUPLICATE — the URL is attached to two or more different, non-blank handles. Separate products are showing one picture, which is the case most likely to need a fix.
- REVIEW — the URL repeats, but the rows do not establish two or more different handles: one handle on several variant rows, a duplicated gallery row, or rows with a blank handle. Often a normal variant export; occasionally a data problem, so it is listed rather than ignored.
A row with a blank Handle never produces a DUPLICATE on
its own, because ImageDup cannot tell whether it belongs to one product
or several. This mirrors the tool’s behavior everywhere else; the
matching rules on the homepage describe it
in full.
Deciding what to fix
Work through the flagged groups with three outcomes in mind:
- Keep. Variants of one product that genuinely look identical in the photo, or a bundle that reuses a component’s image on purpose. Nothing to change.
- Replace. A product pointing at another
product’s image — the cedar-and-oak case. Give it its own
Image Src. - Review. Variant or gallery rows where you are not sure. Open the affected products in the Shopify admin before you change the export.
Do not bulk-delete rows from the CSV to “remove duplicates”. A row in a Shopify import is a variant or an image, not just a URL — deleting it can drop a size or a gallery photo. Correct the image reference and re-import, or make the change in the admin.
What URL-text matching will and will not catch
ImageDup normalizes an image URL conservatively before comparing:
it trims surrounding whitespace, lowercases the scheme and host, and
drops the #fragment. Everything else is kept exactly,
because changing it could merge images that are actually different. So
it will not group:
- Different
?v=values or size suffixes. Shopify’s CDN typically appends a?v=version parameter and serves sizes like_grandeor_1024x1024. The full query string is kept, sophoto.jpg?v=1andphoto.jpg?v=2stay separate, andphoto_grande.jpgdiffers fromphoto_1024x1024.jpg. - The same file on two hosts. A
cdn.shopify.comURL and the same image on a custom domain or an origin server are different strings. - Scheme,
www, and trailing-slash differences.httpversushttps,www.versus the bare domain, and a trailing/are all treated as distinct. - Path case.
/Products/A.JPGand/products/a.jpgare not merged.
To catch the same picture served from different URLs, add a column of image hashes to your export and map it — see below.
Using an existing image-hash column
ImageDup does not generate hashes, download images, or calculate
anything from a picture. If your export already includes a column of
hashes — an MD5 of each file, or a perceptual hash such as pHash
or dHash, in hex — map it as Image hash.
Matching then uses the hash for any row that has one and falls back to
the Image Src URL for rows that do not. The hash values
are trusted as given.
Questions
Can two Shopify products use the same image URL?
Yes. Shopify allows it, and it is sometimes intentional — variants that look identical in the photo, or a bundle that reuses a component image. ImageDup shows you the reuse and how many distinct handles are involved; deciding whether it is intended is up to you.
Does ImageDup detect duplicate image files or visually similar photos?
No. It compares the text of the Image Src column. The same picture at two different URLs is not matched unless you supply a shared hash value for those rows.
What is the Image Src column?
The column in a Shopify product export that holds each image’s URL. One product can have several Image Src rows, ordered by the Image Position column.
Does ImageDup upload my CSV to a server?
No. The file is read and analyzed by JavaScript in your browser. The sample-data button loads a small example file bundled with the site.
The same image has two URLs in my export — will ImageDup group them?
Not by URL text. A ?v= parameter or a different size suffix is enough to make two URLs distinct. Add an image-hash column and map it to match the same picture across different URLs.
More on how ImageDup works
The main tool works with a product CSV from any platform, not just Shopify. The homepage also covers what counts as a duplicate and a longer guide to duplicate image URLs in product data.