The Complete Guide to Shopify Bulk Product Upload (And Why It Keeps Breaking)

Shopify's CSV import is powerful. It's also the most counterintuitive thing you'll do as a store owner.
I've formatted and uploaded hundreds of thousands of products across Shopify stores. The errors are almost always the same. This guide covers every one of them so you don't have to learn the hard way.
The three ways to upload products
- Manual (one at a time in Shopify admin). Fine for 1-5 products. Not viable at scale.
- Shopify API. Powerful but requires a developer.
- CSV import. The practical middle ground for most sellers.
This guide covers the CSV import method. It's the fastest way to upload 10-500 products without writing code.
What the CSV actually needs
Shopify will reject your import without these fields. The "Common Mistake" column is where most people get stuck.
| Field | What It Is | Common Mistake |
|---|---|---|
| Handle | Unique URL slug (lowercase, hyphens, no spaces) | Using product names with spaces |
| Title | Product name | Leaving blank for variant rows |
| Body (HTML) | Product description | Pasting from Word with invisible characters |
| Vendor | Brand name | Leaving blank (Shopify defaults to store name) |
| Published | TRUE or FALSE | Using lowercase "true" (case-sensitive) |
| Variant Price | Price without currency symbol | Including "$" or "£" in the cell |
| Variant Inventory Qty | Stock quantity | Leaving blank (Shopify treats as 0) |
| Variant Grams | Weight in grams only | Entering pounds or kilograms |
Each variant is its own row. The Handle field ties variant rows to the parent product. If the Handle is blank on a variant row, Shopify treats it as a new product.
The Image Src field must be a public URL. Shopify fetches images from the internet during import. Local file paths like C:\Users\Me\photo.jpg will not work. Upload images to Google Drive or Dropbox first and use a shareable link.
The 5 import errors that break every upload
Error 1: Encoding (the invisible killer)
If you built your CSV in Excel on Windows, it's likely encoded as Windows-1252, not UTF-8. Shopify requires UTF-8. The symptom: garbled characters in descriptions, or the import fails entirely.
Fix: Save As > CSV UTF-8 (Comma delimited). In Google Sheets, File > Download > CSV always outputs UTF-8.
Error 2: Smart quotes and hidden characters
Pasting text from Word or Google Docs brings in "smart quotes" (curly quotes instead of straight ones) and hidden Unicode characters. These look fine in your spreadsheet but break the import.
Fix: Paste into a plain text editor first (Notepad on Windows, TextEdit in plain text mode on Mac), then paste into the spreadsheet. This strips invisible formatting.
Error 3: The variant row problem
Every variant needs its own row. The Handle connects all variants to the parent product. Title, Body, and other product-level fields only need to appear on the first row.
The error: leaving the Handle blank on variant rows. Shopify treats each blank-Handle row as a new product.
Fix: Every variant row must have the same Handle as the parent product's first row. Identical, lowercase, hyphens only.
Error 4: Local image paths
Shopify's import does not read images from your computer. The Image Src field must be a public URL.
Fix: Host images somewhere public before importing. Google Drive with a direct share link, Dropbox, or any cloud hosting.
Error 5: Weight in the wrong unit
Variant Grams is always in grams, regardless of your store's display settings. If you enter 0.5 thinking that's 0.5 lbs, Shopify lists the product as half a gram.
Fix: Convert to grams before importing. 1 lb = 454 grams. 1 kg = 1000 grams.
The Excel gotchas
These are formatting issues in Excel, not Shopify issues.
Excel auto-formats dates. A SKU like "3/4" becomes a date. Format these columns as Text before pasting values (right-click column > Format Cells > Text).
Excel drops leading zeros. Barcodes starting with 0 get stripped. "012345678901" becomes "12345678901." Same fix: format as Text first.
Commas inside cells. A product title like "Small, Medium, Large" can break the CSV column structure. Google Sheets handles this correctly by default. If using Excel, save as CSV UTF-8 and verify the output.
That's not a reflection of the instructions. It's how CSV formatting goes. You'll fix an error, reimport, fix another. Most stores get it right on the second or third try.
The template below has all required fields pre-formatted with notes on every column. It won't eliminate the trial and error, but it gets you past the blank-spreadsheet problem.
Need just the template? I put together a complete Shopify CSV import template with example products, variant rows, and column-by-column notes — free download.
Not sure if you should DIY or outsource? I wrote a real cost comparison of hiring a VA vs. outsourcing that breaks down the math.
If you have more than 50 products and you'd rather not spend the weekend on this, you can email me what you need at flash@tryflash.ai. I format the CSV, handle the upload, and verify every product. First 3 jobs are free.
Frequently asked questions
What columns are required in a Shopify CSV upload? The only truly required columns are Handle and Title. But in practice you also need Variant Price, Variant SKU, Variant Inventory Qty, and Variant Inventory Tracker (set to "shopify") for the import to behave correctly. Missing Variant Inventory Tracker causes inventory quantities to be silently ignored — your stock shows as 0 even after a successful import.
Why is my Shopify CSV import showing errors? The most common causes are: (1) Variant Inventory Tracker not set to "shopify" exactly, (2) images using relative paths instead of full URLs (https://...), (3) leading zeros stripped by Excel on barcodes and GTINs, (4) commas inside product titles or descriptions breaking the column structure. Try Google Sheets instead of Excel — it handles CSV encoding more reliably.
How many products can you import at once in Shopify? Shopify recommends keeping CSV files under 15MB. In practice that's roughly 1,000-2,000 products per file depending on how much text is in each row. For larger catalogs, split the file and import in batches. Each batch needs consistent Handle values so Shopify can link parent products to their variants.
Can you bulk upload products with images to Shopify via CSV? Yes, but the images must be publicly accessible URLs — not local file paths or Google Drive links. If your images are on Dropbox, Cloudinary, or any CDN with a public URL, paste those directly into the Image Src column. If they're not hosted anywhere yet, upload them to Shopify first via the Files section, then use the generated URLs in your CSV.
What is the difference between the Handle and SKU in a Shopify CSV? The Handle is a URL-safe identifier Shopify uses to group variant rows into the same product (e.g., "blue-running-shoes"). Every row for the same product must have the same Handle. The SKU (Variant SKU) is your internal product code for inventory tracking — it lives at the variant level and should be unique per size/color/etc. Confusing the two is a common first-time error.
Does Shopify replace existing products or create duplicates when you import a CSV? If a row's Handle matches an existing product, Shopify updates it. If not, it creates a new product. This means you can use CSV import for bulk edits — just export your current catalog, modify the relevant columns, and re-import. Be careful: if any Handle is accidentally changed, the import creates a duplicate instead of updating the original.
Stop doing it yourself.
Send me the tedious stuff. Product uploads, data cleanup, catalog migrations. First 3 jobs are free.
Try Flash free
