Shopify “the image is an unsupported file type” error fix (2026)

Media could not be created because the image is an unsupported file type. Shopify admin throws that up after you drag a photo straight off an iPhone into a product, and then it accepts the next twelve files from the same folder without a word of complaint. Same phone. Same shoot. One file rejected, no explanation of which one of its properties Shopify objected to.
Now go and read Shopify’s own documentation. HEIC sits on the supported list for product media, right next to JPEG, PNG, WEBP and GIF. So the help pages say the format is fine and the uploader says it is not. Both of those messages come from Shopify. Only one of them is true about your file.
We build CS Smart Bulk Image Upload, an app that pushes large folders of product photos into Shopify and matches each file to a product by SKU, barcode, title or metafield, so we spend a lot of time staring at what is actually inside files that merchants are certain are JPEGs. One thing up front, because it changes how you should read the rest of this: the app resizes oversized images on the way in, but it will not turn a HEIC into a JPEG for you. Format conversion belongs on your machine, before anything reaches Shopify. We would rather say that plainly than sell you a fix we do not ship.
The upside is that this error has a short list of real causes, and four of them cover nearly every case. You can work out which one you hit in about thirty seconds, with software you already have. Start there, not with an app.
In this post
- Why does Shopify say the image is an unsupported file type?
- The exact error strings, and the API codes behind them
- Shopify reads the file, not the name
- HEIC is documented as supported and still gets rejected
- How to fix it in about two minutes
- Switch the iPhone to Most Compatible
- Files that pass the extension check and still fail
- What Shopify actually accepts, per surface
- Doing this for a whole catalog
- Getting the converted images onto the right variant
- Frequently asked questions
- Related reading
Why does Shopify say the image is an unsupported file type?
Short answer: Shopify checks what is inside the file, not what the extension claims, so a renamed PNG or an HDR HEIC gets refused even though HEIC is documented as supported. Re-export the photo as JPEG. For a whole catalog, CS Smart Bulk Image Upload sends a converted folder to Shopify and matches every file to its product by SKU.
That is the whole mechanism in one line, and almost nobody explains it that way. The extension on a file is a label a human typed. The format of a file is a property of its bytes. Shopify trusts the bytes. When the two disagree, the upload dies, and the message you get back names the symptom instead of the cause.
The exact error strings, and the API codes behind them
Shopify words this rejection differently depending on which surface you uploaded through, which is exactly why pasting one variant into Google turns up nothing useful. These are the four you will see. The first three are one rejection wearing three different sentences. The fourth only looks like the others, and mistaking it for them costs you an hour:
Media could not be created because the image is an unsupported file type.File could not be created because the image is an unsupported file type.Image: File extension doesn't match the format of the fileValidation failed: .jpg is not a valid image file type
If you are hitting this through the Admin GraphQL API, the first two come back on an enum value named UNSUPPORTED_IMAGE_FILE_TYPE. It appears twice in Shopify’s schema: once on MediaErrorCode, which is what product media returns, and once on FileErrorCode, which is what Content > Files returns. Two enums, one code name, and the only difference in the rendered sentence is the word Media or the word File. Developers search the code name and merchants search the sentence, so both are worth having on one page.
The third string turns up in the product editor when you attach an image whose contents do not match its extension. Same underlying rejection, better wording.
The fourth is the impostor of the group, and it belongs to CSV imports, where Shopify quotes back whatever you put in the Image Src column. Merchants have posted the identical message naming /index.php and naming Dropbox share links, which is the tell: in a CSV the usual cause is not a byte mismatch at all. It is that the URL handed Shopify a web page instead of image bytes. A Dropbox or Drive share link returns HTML, and HTML really is not a valid image file type. So if this one arrived from a spreadsheet, check what the URL actually serves before you start inspecting your files, and read our notes on media that fails to process for the download-side failures.
Which brings me to the part that genuinely annoys me. Shopify already knows what the file really is at the moment it rejects it. The validator had to read the header to decide. So why does the message not just say “this says .jpg but it is a PNG”? One extra clause in one error string would end thousands of support threads. It has not been added. This is the kind of tiny fix that never makes a roadmap, and it is the sort of thing that quietly costs merchants more hours than any feature gap does.
Shopify reads the file, not the name
Every image format starts with a signature in its first few bytes. A PNG opens with the byte sequence 89 50 4E 47. A JPEG opens with FF D8 FF. A HEIC file carries an ftyp box naming its exact brand, such as heic or heix or hevx. Shopify’s uploader reads those bytes, decides what the file is, and compares that against the extension you handed it.
Renaming does nothing to the bytes. Nothing. Changing screenshot.png to screenshot.jpg in Finder produces a file that is still a PNG and now also a liar (the operating system will usually warn you about this, and everybody clicks through the warning), and that combination is the single most common cause of this error.
Where do renamed files come from? Four places, mostly:
- Somebody used Save As, picked PNG in the format dropdown by accident, then typed
.jpgin the filename box. - A screenshot got renamed to
.jpgbecause the person assumed product photos have to be JPEGs. - Images pulled out of a chat app, which frequently re-encodes to WEBP while keeping whatever name the sender used.
- An export script or a photographer’s batch job that writes
.jpgonto every output file regardless of the encoder that produced it.
The third string in the list above, the one about the extension not matching the format, is honestly the best error Shopify has here. It tells you precisely what went wrong. The unsupported-file-type wording does not, and it fires on the same underlying condition.
HEIC is documented as supported and still gets rejected
So which is it? Both, and the reason is that HEIC is not one format. It is more of a container, sort of a wrapper, and what your iPhone puts inside it depends on the phone, the iOS version and the capture mode. A plain 8-bit HEIC still image and a 16-bit HDR HEIC with a gain map are not the same object, even though both end in .heic and both look identical in Photos.
Three HEIC-specific traps, in rough order of how often they bite:
- Depth, HDR and 16-bit variants. A HEIC carrying a gain map, a depth map from Portrait mode, or 16-bit colour is a different beast from a plain still. Support for the container does not guarantee support for every profile inside it.
- Live Photos. A Live Photo is not one file. It is a HEIC still plus a paired MOV, and depending on how you copied it off the phone you may be handing Shopify one, the other, or a half-assembled pair. The MOV half is a video, so it lands under the video rules instead: 0.25 seconds to 10 minutes, 100 px to 4096 px, up to 120 fps, MOV or MP4 or WEBM only.
- The 48 MP collision. Newer iPhones shoot far beyond Shopify’s product image ceiling of 5000 x 5000 pixels, which is 25 megapixels. That produces a different error about resolution, not file type, and we wrote up that one separately in the Shopify 25 MP image limit fix. Worth checking, because merchants often assume the two errors are the same problem.
My honest opinion after years of this: do not upload HEIC to a store at all, even when it works. It works often enough to lull you, and fails often enough to cost you an afternoon. JPEG is boring and boring is what you want in a catalog pipeline.
How to fix it in about two minutes
Free, no app, works today. Do these in order and do not skip the first step, because guessing the cause is what turns a two-minute fix into an afternoon.
Step 1: find out what the file actually is.
- macOS: select the file, press Cmd and I for Get Info, and read the Kind line. Or open it in Preview and choose Tools > Show Inspector, which reports the real format and pixel dimensions together.
- Windows: right-click the file, choose Properties, open the Details tab. Look at the item type and the dimensions.
- Any machine with a terminal: run
file photo.jpg. It ignores the extension entirely and prints what the bytes say, for examplePNG image data, 3024 x 4032. This is the fastest check there is and it is the one we reach for every time.
If the reported format does not match the extension, you have found your cause and you are done diagnosing.
Step 2: re-export. Do not rename. This is the part people get wrong. Renaming edits the label; re-exporting rewrites the bytes, which is what Shopify inspects.
- macOS Preview: open the file, then File > Export, set Format to JPEG, quality around 85, save. Preview also handles HEIC input without any extra software.
- Windows Photos: open the file, choose Save as copy, pick JPG.
- Browser, nothing installed: Squoosh from the Chrome team converts locally without uploading anything, and shows you the size tradeoff live. Our own Image Compressor does the same job with separate controls for dimensions and compression.
Step 3: force the colour space to sRGB while you are there. A CMYK file, which is what print-oriented workflows produce by default, can clear the extension check and then fail during processing, or upload and render with the colours visibly off. Preview’s export dialog and Photoshop’s Save for Web both let you set sRGB. If your photos are coming back muddy rather than rejected, read our notes on blurry and washed-out Shopify product images.
Step 4: upload one file first. Not the folder. One. If that single file goes in, the format was the problem and the rest of the batch will follow. If it still fails, you are looking at a different error wearing the same coat, usually resolution or file size.
That is the fix. If you would rather this never happen again on a catalog upload, the useful move is to convert the folder once on your desktop and then hand the whole converted folder to something that does the routing, which is where CS Smart Bulk Image Upload matches every filename to a SKU and tells you exactly which files failed instead of stopping quietly halfway. It is free to install, the free plan covers 25 images, and it sits at 5.0 stars across 97 reviews on the Shopify App Store.
Switch the iPhone to Most Compatible
If the photos are coming off a phone, one setting removes this entire class of problem at the source. On iOS, open Settings > Camera > Formats. You get two options:
- High Efficiency captures HEIC and HEVC. Smaller files, and the source of everything described above.
- Most Compatible captures JPEG and H.264. Bigger files, zero format arguments with Shopify.
For a store, pick Most Compatible and stop thinking about it. You are trading a few megabytes of local storage for a workflow that does not break. (If you shoot on a real camera and only use the phone for quick reshoots, do it anyway, because the quick reshoots are exactly the files that get uploaded at speed with nobody checking them.)
Files that pass the extension check and still fail
Extension mismatch and HEIC cover most of it. The long tail is where the confusing cases live, and a few of these have nothing to do with the format at all.
Layered or uncompressed TIFF. Shopify accepts TIFF as product media, so the type check passes. A 900 MB layered master still will not make it, because the 20 MB file size ceiling applies regardless of type. Flatten and export to JPEG.
SVG. Shopify converts SVG on upload. An SVG that depends on anything external, a linked font, a referenced raster image, a stylesheet living somewhere else, loses those references in conversion and either fails or renders wrong. Inline everything or ship a PNG.
Aspect ratio. The ratio has to sit between 100:1 and 1:100. That sounds absurdly generous until somebody uploads a stitched panorama or a one-pixel-tall spacer graphic, and then it does not.
Filenames. This one catches agencies constantly. A Shopify image filename cannot end with any of these words, because the CDN reads them as resize instructions: pico, icon, thumb, testing, small, compact, medium, large, grande. So hoodie_blue_large.jpg is trouble and hoodie-blue-navy.jpg is not. Filenames also cannot begin with a period, and you want to avoid an underscore sitting directly before dimensions, so shirt-5x4.jpg rather than shirt_5x4.jpg. One exception, because our own advice would otherwise trip you up: an underscore before a plain sequence number, as in SKU_1.jpg and SKU_2.jpg, is fine, and that is exactly how our uploader orders the images within one product. It is underscores before dimensions that bite, not underscores as such. If a whole delivery came in with the wrong convention, our Bulk Image Renamer rewrites the set in one pass, and the Shopify image filename guide covers what to name them instead.
Storage. If you are near your plan’s file ceiling the upload fails for a reason that has nothing to do with the file. Starter, Pause and Build, Retail and Basic get 100 GB, Grow 300 GB, Advanced 500 GB, Plus 1 TB, Enterprise 10 TB, with video counted against a separate quota. The trap is that Shopify can take up to 24 hours to recalculate storage after you delete files, so deleting 30 GB and immediately retrying will look like the delete did nothing. It did. Wait. More detail in our post on Shopify file storage limits.
What Shopify actually accepts, per surface
The ceilings differ by where you upload, and Shopify does not publish them in one table anywhere. So here is one.
| Surface | Accepted types | Ceiling |
|---|---|---|
| Product and collection images | JPEG, PNG, WEBP, HEIC, GIF | 20 MB, up to 5000 x 5000 px (25 megapixels) |
| Product media, extra types | PSD, TIFF, BMP, SVG | 20 MB, converted on upload |
| Content > Files, theme assets, blog images | JPEG, PNG, WEBP, HEIC, GIF | 20 MB, 20 megapixels |
| Video | MOV, MP4, WEBM | 1 GB, 0.25 s to 10 min, 100 to 4096 px, max 120 fps |
| 3D models | GLB, USDZ | 500 MB, files over 15 MB are auto-optimized |
| Every image surface | aspect ratio between 100:1 and 1:100 | applies on top of the above |
Notice the 25 versus 20 megapixel split between product images and the Files area. A 4500 x 4500 photo is 20.25 megapixels, so it goes onto a product and gets refused by Files. Same image, same store, two answers. If you also work with video or 3D, our guide to variant videos and 3D models goes deeper on those rows.
Doing this for a whole catalog
Everything above scales badly. Converting one file is two minutes; converting a folder of 900 is a different job, and doing it by hand in the product editor is not a job at all, it is a punishment.
Split it into two problems, because they have different answers.
Conversion happens on your machine. Preview will export a multi-file selection in one go on macOS. Windows Photos handles batches. Lightroom and Photoshop’s Image Processor script are built for it. Set a preset once: JPEG, sRGB, long edge 2048, quality 85, and every future export is Shopify-ready before it ever reaches the uploader. If the same files also need resizing, our walkthrough on bulk resizing Shopify images covers the preset settings.
Routing happens in Shopify. Once you have 900 clean JPEGs, the remaining question is which product each one belongs to, and that is the part we built for. Drag the whole folder in, and SKU-based matching reads the filename and routes each image to the matching product. A Google Drive folder import means a photographer can drop the day’s shoot into a shared folder without touching your admin. Progress tracking and error recovery are the parts that matter on a batch this size: when one file out of 900 is still a bad HEIC, you want a line item naming it, not a spinner that stops.
That is the honest division of labour. We do not convert your files, and any app that claims a format problem is really a routing problem is selling you something. If you want the deeper version of the routing workflow, we wrote it up in matching images to products by SKU and in the Google Drive upload guide. Running your existing catalog through the Product Image Audit first will tell you how many products are missing images before you start, which is usually more than merchants expect.
Getting the converted images onto the right variant
Fixing the format gets the pixels into Shopify. It does not decide which variant shows them, and that is where the next round of confusion usually starts: all 40 photos land on one product, and a shopper who picks Navy scrolls past every other colour on the way to the one they wanted.
Two different problems there, with two different answers. If the colours are variants of one product, you want to filter the gallery down to the images for the selected colour so the rest stay hidden until they are relevant. If each colour is its own product, because you needed separate URLs or you ran out of variant room, you instead want to group separate colour products into one listing with swatches. Getting that choice wrong is the most expensive mistake in this whole pipeline, and it is much harder to undo than a file conversion.
If the images are arriving through a spreadsheet rather than a folder, the failure text is different again and the CSV import guide lists what each import error means line by line.
Frequently asked questions
Why does Shopify say the image is an unsupported file type when it is a JPEG?
Because it probably is not one. Shopify validates the file’s contents rather than its extension, so a PNG, WEBP or HEIC file that was renamed to .jpg reads as a mismatch and gets refused. Run file yourphoto.jpg in a terminal, or check Get Info on macOS and Properties > Details on Windows, to see the real format. Then re-export as JPEG rather than renaming.
Does Shopify support HEIC images or not?
Officially yes. HEIC is on Shopify’s supported list for product media alongside JPEG, PNG, WEBP and GIF. In practice HEIC is a container with several profiles inside it, and 16-bit, HDR, depth-map and Live Photo variants are not the same file as a plain HEIC still. Those are the ones that get rejected. Converting to JPEG removes the ambiguity entirely.
What does Image: File extension doesn’t match the format of the file mean?
It means Shopify read the bytes at the start of your file, worked out the real format, and found that it disagrees with the extension in the filename. A PNG named .jpg is the classic case. It is the same underlying rejection as the unsupported-file-type message, just worded more helpfully. Re-export the file in the format you actually want and the message goes away.
Which app should I use to upload hundreds of converted product images to Shopify?
CS Smart Bulk Image Upload, built by Craftshift, is the one we make for this: drag hundreds of images in at once or import a Google Drive folder, and filename matching on SKU, barcode, title or metafield routes each file to the right product, with progress tracking and error recovery so a single bad file does not take the batch down silently. Free to install, free plan up to 25 images, 5.0 stars across 97 reviews. Convert the folder to JPEG on your desktop first, because the app resizes oversized images but does not change file formats.
Will converting HEIC to JPEG lose image quality?
A little, and not enough to see on a product page. Export at quality 85 or higher and the difference is invisible at the sizes a storefront renders, generally 2048 pixels or less. What you will notice is the file size going up, because HEIC compresses harder than JPEG at the same visible quality. That is the trade you are making, and for a catalog it is worth it.
Why does the same photo upload to one place in Shopify and fail in another?
Different surfaces enforce different ceilings. Product and collection images allow up to 25 megapixels, while Content > Files, theme assets and blog images stop at 20. A 4500 x 4500 image is 20.25 megapixels, so it is accepted as a product image and refused by the Files uploader. File type support is the same across both, but the resolution ceiling is not.
Can I fix this by renaming the file extension?
No, and renaming is what caused most of these errors in the first place. The extension is metadata; the format lives in the bytes. Changing the name creates a file whose label lies about its contents, which is precisely the condition Shopify’s validator is checking for. Open the file in an editor and export it in the target format instead.
Related reading
- Shopify 25 MP image limit: fixing the resolution error, the sibling problem to this one
- Shopify image filename guide, including the CDN words a filename cannot end with
- Matching product images to products by SKU
- How many images you can attach per variant
- Swapping product images when a shopper clicks a swatch
One last thing, and it is the thing that actually stops this recurring: write the deliverable spec down and send it to whoever hands you photos. “JPEG, sRGB, long edge 2048, quality 85, hyphens in filenames, no HEIC” is one line. That line is worth more than any troubleshooting post, including this one.