How do I fix Shopify product CSV import errors (encoding, prices, handles)? (2026)
Most Shopify product import errors come from three things a spreadsheet does silently: it saves the file in a non-UTF-8 encoding or with curly quotes ("Illegal quoting", "Missing or stray quote", accents shown as é), it formats numbers for your locale (12,90, $15.00, 1,299.00) when Shopify wants a plain number with a dot, and it lets handles contain spaces, capitals or accents when Shopify accepts only letters, numbers and dashes. Re-save the file as CSV UTF-8, comma-separated, write prices as 12.90, and make every handle lowercase with dashes. The tables below map each Shopify error message to its cause and fix.
Shopify's import error messages and their fixes
From Shopify's common import issues page:
| Error shown by Shopify | Cause | Fix |
|---|---|---|
| Illegal quoting on line … | A character that isn't UTF-8, or a missing or stray quote | Save as CSV UTF-8; replace curly quotes with straight quotes |
| Missing or stray quote on line … | Spreadsheet inserted "smart" quotes, or a cell like 12" frame isn't quoted | Use straight quotes; wrap the cell in quotes and double the inner quote ("12"" frame") |
| Invalid CSV header: missing headers | First row doesn't match the template; often trailing spaces | Correct the header row; header names are case-sensitive |
Ignored line … because handle x already exists | Two separate products use the same handle | Give each product its own handle; keep a product's rows together |
| Ignored line … because it did not contain product data | First row of a handle has no Title | Put the Title on the first row of each handle |
| Validation failed: options are not unique | Two variants of a handle have the same option values | Make every option combination unique |
| Validation failed: price can't be blank | Empty price on a variant row | Fill the price |
| Inventory quantity is not a number / can't be blank | Text or decimals in the quantity, or empty quantity with a tracker set | Use a whole number; clear the tracker if you don't track stock |
| Inventory policy is not included in the list | Value other than deny or continue | Use deny or continue |
| Fulfillment service can't be blank | Empty fulfillment service | Use manual |
| Not a valid product category | Category text doesn't match the Standard Product Taxonomy exactly | Copy the full breadcrumb or the category ID |
| Validation failed: getaddrinfo … / error while trying to download the image | Image URL wrong or not public | Use a direct, public image URL |
| Line is invalid (No details) | An existing option value moved to another option position | Import once with a temporary option name, then again with the final one |
Encoding: accents, symbols and the BOM
Shopify's import guide says "UTF-8 encoding is required to prevent unexpected characters from appearing in your content", and the column guide asks for "UTF-8 format using LF-style linefeeds" (Importing products, Using CSV files).
| What you see | What happened | Fix |
|---|---|---|
é, è, ’ instead of é, è, ’ | UTF-8 text was opened as Windows-1252 and saved again | Repair the text, or go back to the original file and open it as UTF-8 |
? or � instead of accents | The file was saved in a non-UTF-8 encoding and the characters were lost | Re-type them, or re-export from the source as UTF-8 |
Whole rows in the first column, separated by ; | Excel in a European locale saved with semicolons | Save as "CSV UTF-8 (Comma delimited)" or change the list separator |
| First header not recognised | A byte order mark (BOM) is stuck to the first header | Save without BOM |
In Excel choose File › Save As › CSV UTF-8 (Comma delimited), not "CSV (Comma delimited)" and not "Unicode Text". Google Sheets exports UTF-8 by default.
Prices, weights and quantities
The column guide describes Price, Compare-at price and Cost per item as numbers "without the currency symbol", Weight value (grams) as the number "without the unit of measurement or decimals", and Inventory quantity as an integer (CSV columns).
| In the file | Write instead | Why |
|---|---|---|
12,90 | 12.90 | Decimal separator must be a dot |
$15.00, 15 €, EUR 15 | 15.00 | No currency symbol or code |
1,299.00 or 1 299,00 | 1299.00 | No thousands separator |
950g in the grams column | 950 | Number only |
0.9 in the grams column, unit kg | 900 | The column is always grams; the unit column only changes how the weight is displayed |
5.0 in quantity | 5 | Whole number |
7.61234E+12 in SKU or barcode | the original code | Excel turned the code into a number and dropped digits; format the column as Text before pasting |
Compare-at price must be higher than Price for the reduction to show.
Handles
The handle identifies the product and builds its URL. Shopify's rule: letters, numbers and dashes, no spaces; by default it is the title in lowercase with dashes (CSV columns).
| Handle in the file | Problem | Normalised |
|---|---|---|
Trail Backpack 28L | Spaces and capitals | trail-backpack-28l |
thé-vert-sencha | Accented letter | the-vert-sencha |
tee/black | Symbol | tee-black |
mug | Leading space | mug |
If you change the handle of a product that already exists, the import no longer matches it and creates a second product. Normalise handles on new products; for existing ones, use the handle from your export.
A faster check
Running each table above by hand on a few thousand rows takes time. The checker at Shopify product CSV checker reads the CSV or XLSX in your browser, reports each of these problems with its row and column, and offers ticked fixes: UTF-8 conversion and accent repair, BOM removal, price and number formats, handle normalisation, header spelling, default option values and duplicate image rows. The report is shown in full on the page; the fixed file is the paid part.
FAQ
Why does Shopify show "Choose column headings" when I import? Your header names don't match the template. Shopify then asks you to map them by hand. Correct the header row, respecting capitals and spaces, and the window doesn't appear.
Is the file size limited? Yes. "Your product CSV can't exceed 15 MB." Split larger files and keep the header row in each part, with all rows of a handle in the same part.
Can I import an .xlsx file directly? No. The importer takes CSV. Save the sheet as CSV UTF-8 first.
Why are my images missing after the import? Either the URLs are not public direct links (a Google Drive or Dropbox share page is not an image file), or the file was sorted and image rows were separated from their product. Shopify also advises avoiding image files with _thumb, _small or _medium in their names.