How to Convert a Supplier CSV to a Shopify Import File
Map a supplier price list to Shopify’s product CSV format: required columns, handles, variants, pricing rules and the mistakes that make imports fail.
Your supplier sends a spreadsheet with their column names, their SKU format and their idea of what a product is. Shopify wants its own column layout, one row per variant and a handle that never changes. This guide shows how to convert a supplier CSV to a Shopify import file by hand, so you know exactly what a script would have to do.
It is written for store owners who work in Excel or Google Sheets, not for developers. Every step can be done with formulas and a text editor.
Step 1: Download Shopify’s current template
Do not build the target file from memory. In your Shopify admin, open Products, choose Import, and download the sample CSV. Shopify changes the template from time to time, and an import only matches columns by their exact header text.
Keep that file open next to the supplier file. The sample is your target: every column you fill must use its header spelling, including capitals and spaces. Header names can differ slightly between template versions (the stock column is the usual one), so copy yours rather than the names used in this guide.
Step 2: Map supplier columns to Shopify columns
Write the mapping down before touching any data. A typical supplier export maps like this:
| Supplier column | Shopify column | Rule |
|---|---|---|
| Item Name | Title | Copy as-is; fix ALL CAPS and trailing codes |
| Item Name | Handle | Lowercase, hyphens for spaces, no symbols |
| Part No | Variant SKU | Keep exactly; never strip leading zeros |
| Wholesale | Variant Price | Apply your markup; plain number, no currency symbol |
| RRP | Variant Compare At Price | Only if higher than the price |
| Stock | Variant Inventory Qty | Whole number if you track inventory; use 0 for out of stock |
| Weight (kg) | Variant Grams | Multiply by 1000 |
| Brand | Vendor | Copy as-is |
| Photo URL | Image Src | Must be a public https link |
Inventory columns work for stores with a single location. If you use several locations, Shopify has a separate inventory CSV for stock quantities, and the product file should not carry them.
Here is a small supplier export. Notice the shouted titles, the comma decimal, the weight in kilograms and one row per size:
| Item Name | Part No | Wholesale | Stock | Weight (kg) | Brand |
|---|---|---|---|---|---|
| ACME WORK GLOVE - M | AG-100-M | "5,60" | 120 | 0.08 | Acme |
| ACME WORK GLOVE - L | AG-100-L | "5,60" | 95 | 0.09 | Acme |
| ACME WORK GLOVE - XL | AG-100-XL | "5,60" | 0 | 0.09 | Acme |
With a 50% markup, the three rows become one product with three variants. The result is the shopify-import.csv excerpt in step 4, with the comma turned into a dot, kilograms turned into grams and the size split out of the name.
Step 3: Build a stable handle
The handle is the product’s identity in the import. Rows with the same handle are treated as the same product; a different handle creates a new one. That is why handle rules matter more than any other column.
- Lowercase letters, numbers and hyphens only: no spaces, accents or periods.
- Generate it from something that will not change, such as brand plus supplier part number, not from the marketing title the supplier rewrites every season.
- Never reuse a handle for a different product.
If you generate handles from titles and the supplier later edits a title, the next import creates a duplicate listing instead of updating the old one.
Step 4: Turn supplier rows into variants
Many supplier files list every size and colour as a separate product row. Shopify expects one product with several variant rows. Group the supplier rows by a shared base code, then use Option1 Name and Option1 Value for the choice:
| Handle | Title | Vendor | Option1 Name | Option1 Value | Variant SKU | Variant Price | Variant Inventory Qty |
|---|---|---|---|---|---|---|---|
| acme-work-glove | Acme Work Glove | Acme | Size | M | AG-100-M | 8.40 | 120 |
| acme-work-glove | Size | L | AG-100-L | 8.40 | 95 | ||
| acme-work-glove | Size | XL | AG-100-XL | 8.40 | 0 |
Only the first row of a product carries the title, vendor and description. The following rows repeat the handle and fill only the variant columns.
Step 5: Apply your pricing rule once, in one place
Compute Variant Price from the wholesale column with a single rule: multiply by your markup, then round to the price endings you use. Put the markup in one cell and reference it, so changing it updates every row. Hard-coding a different multiplier per row is how a store ends up selling a product below cost without anyone noticing.
Check the result against the wholesale cost for the cheapest 20 rows. Any price at or below cost means a mapping error, usually a shifted column.
Step 6: Clean the data before you import
- Currency and thousands separators: 1.299,00 is 1299.00. Shopify expects a dot as the decimal separator and no thousands separator.
- SKUs that Excel turned into numbers or scientific notation (1.2E+5). Format the column as text before pasting.
- Encoding: save as CSV UTF-8, or accented characters arrive broken.
- Empty titles on first rows, duplicate SKUs and image links that open a web page instead of a picture.
Step 7: Import a small batch first
Import ten products before you import ten thousand. Open them in the admin and check variants, price, stock and images. Tick “Overwrite products with matching handles” only when you intend to update existing products. Be careful with it: a blank column in your file clears the existing value in your store, while a column you leave out entirely keeps it. Do not sort the finished CSV in a spreadsheet, because that can separate variants and images from their products. A product CSV can be at most 15 MB, so a large catalog has to be split into several files.
Checklist before you click Import
- Headers copied from the current Shopify template, not typed from memory.
- One handle per product, identical on every variant row, never reused.
- Prices are plain numbers with a dot, and no price is at or below cost.
- SKUs are text and unchanged from the supplier file.
- Stock is a whole number if you track inventory (0 means out of stock); if you do not track it, the tracker column stays blank.
- File saved as CSV UTF-8 and not re-sorted in a spreadsheet afterwards, with a ten-product test import checked in the admin.
Why this gets repetitive
The first conversion takes an afternoon. The fifth takes an afternoon again, because the supplier sends a new file every week with the same quirks. Stock changes, new items appear and discontinued items vanish silently from the sheet.
The steps above are a fixed procedure: read the file, map columns, group variants, apply the price rule, clean values, write the CSV. A procedure that never changes is exactly what a small local script does in seconds, on your own computer, without uploading your supplier prices to anyone.
Common questions
Can Shopify import a supplier CSV directly?
Only if the columns already match Shopify’s product template. A supplier file almost never does, so it needs mapping first: column names, one row per variant and a stable handle.
What is the Shopify handle and why does it matter?
The handle is the product’s URL name and its identity in an import. Rows with the same handle belong to one product, and a changed handle creates a duplicate instead of updating the existing listing.
Why does my Shopify import show errors?
The usual causes are wrong header spelling, price values with currency symbols or comma decimals, SKUs mangled by Excel, missing titles on first variant rows and image links that are not public.
How often should I update stock from the supplier file?
As often as the supplier changes it. Doing that by hand weekly is slow and error-prone, which is why stock updates are the first thing most sellers automate.