for a fixed-length 6-digit SKU). This catches truncated values that no longer match the expected length or pattern. Prevention is the correct fix: open CSVs via Excel's Data → From Text/CSV import wizard, setting numeric-looking columns to Text format before loading. Recovery from the CSV alone is often not possible if the source system is unavailable — see [Recover a Corrupted or Broken Shopify Product CSV](/blog/recover-corrupted-shopify-product-csv) for the options.\n\n**Check 10 — No empty rows or columns**\n\nTrailing empty rows at the end of a product CSV produce row-count mismatches in some import systems and make format checks less precise. Empty columns (a column with a header but no values in any row) can break import mapping in edge cases. Use [Data Cleaner](/tools/data-cleaner) with `removeEmptyRows` and `removeEmptyColumns` operations before import.\n\n---\n\n## Validate Before Upload, Not After Rejection\n\n\u003ca name=\"validate-before-upload\">\u003c/a>\n\nThe platform error loop — upload, read the error, fix one field, re-upload — is slow and often misleading. A single error message may correspond to multiple root causes: \"error importing your file\" maps to encoding, quoting, delimiter, and header issues simultaneously. The platform reports the first parse failure and stops — it does not surface all errors in one pass.\n\nRunning the ten-step sequence before upload surfaces all errors in one pass, against a readable validation report rather than a platform error screen. The workflow:\n\n1. Run Format Checker (checks 1–3). Fix any reported encoding, delimiter, or column-count issues.\n2. Run Data Validator with the E-commerce Orders preset extended for your catalog (checks 4–9). Fix all flagged rows.\n3. Run Data Cleaner `trimWhitespace` + `removeEmptyRows` (checks 4, 10). Re-run Data Validator to confirm zero errors.\n4. Upload to the platform.\n\nA file that clears all ten checks imports without row-level errors. Silent failures from price-rule violations and image-URL issues are also prevented — those are the failures that produce a success banner but a broken catalog.\n\nFor the split-and-batch workflow needed for large catalogs (15MB+ or 1,000+ new variants), see [How to Split a Large Shopify Product CSV Without Breaking Variants](/blog/split-large-product-csv-for-shopify). For the full e-commerce CSV error taxonomy and platform format comparison, see [Shopify & WooCommerce Product CSV: Fixes, Imports & Migrations](/blog/ecommerce-product-csv-complete-guide).\n\n---\n\n## Additional Resources\n\n> **Methodology:** Validation rules verified against Shopify and WooCommerce product CSV documentation, May 2026. Platform behavior on rule violations (silent drop vs. error) may vary by plan version — verify against your store's current import error output.\n\n**Platform documentation:**\n- [Shopify: Product CSV file format](https://help.shopify.com/en/manual/products/import-export/using-csv) — Column definitions, required fields, and Handle/variant structure\n- [Shopify: Import a CSV file](https://help.shopify.com/en/manual/products/import-export/import-products) — Import workflow and error reporting\n- [WooCommerce: Product CSV importer and exporter](https://woocommerce.com/document/product-csv-importer-exporter/) — Required fields and column format for WooCommerce imports\n\n**Standards:**\n- [RFC 4180: Common Format and MIME Type for CSV Files](https://datatracker.ietf.org/doc/html/rfc4180) — The CSV quoting and delimiter standard; the reference for column-count consistency and quote compliance\n- [Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM](https://www.unicode.org/faq/utf_bom.html) — Encoding reference; explains BOM, byte-order marks, and UTF-8 vs. Windows-1252 differences\n- [MDN Web Docs: TextDecoder](https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder) — How browsers handle encoding detection in client-side file processing\n\n---\n\n## FAQ\n\n### Why should I validate encoding before checking delimiters?\n\nEncoding errors corrupt delimiter detection. A Windows-1252 file processed by a UTF-8 delimiter detector may misread multi-byte character sequences as comma or quote characters, producing incorrect field counts and split boundaries. If you run delimiter detection on an incorrectly-encoded file, the results are unreliable — fix encoding first, then validate the delimiter.\n\n### Does Format Checker check whether my headers match the Shopify template?\n\nNo. Format Checker validates file-format properties: encoding, delimiter, line endings, BOM, quote compliance, and intra-file column-count consistency. It does not validate header names against a platform template or verify that required columns are present. For header name validation, compare manually against the Shopify CSV template, or configure a `required` rule in Data Validator on each required column.\n\n### Can Data Validator confirm my image URLs are accessible?\n\nNo. Data Validator's `url` rule validates URL *format* — that the value is a well-formed URL with a valid scheme and domain structure. It does not make HTTP requests to confirm the image is publicly reachable. A URL that passes format validation may still fail at import if Shopify cannot fetch the image. To confirm reachability, open a sample of image URLs in a browser before uploading.\n\n### What is the Data Validator E-commerce Orders preset?\n\nThe E-commerce Orders preset is a built-in rule configuration in [Data Validator](/tools/data-validator) designed for e-commerce product and order CSV files. It includes required-field rules, numeric type checks on price and quantity fields, and uniqueness rules. Load it as a starting point and extend it with catalog-specific rules — your expected SKU format, option-name enum values, or Compare-At Price constraints — rather than building rules from scratch.\n\n### What does \"handle already exists\" mean and how do I fix it before import?\n\nThe `Handle` field is Shopify's product identifier and must be unique across your catalog. \"Handle already exists\" means either a Handle in your import file matches an existing product in your store (an update-vs-create conflict) or a Handle appears more than once in the file itself. Run [Data Validator](/tools/data-validator) with a `uniqueness` rule on the Handle column. For near-duplicates (like `shirt-red` vs `shirt_red`), use [Remove Duplicates](/tools/remove-duplicates) with fuzzy matching to surface them before import.\n\n### Can I validate a WooCommerce product CSV with the same checklist?\n\nYes, with adjustments. The encoding, delimiter, and column-count checks (1–3) are platform-agnostic. The structural and data-rule checks (4–10) require substituting WooCommerce's column names: `SKU` instead of `Handle`, `regular_price` and `sale_price` instead of `Variant Price` and `Variant Compare At Price`. WooCommerce's uniqueness constraint is on `SKU` (row-level unique identifier) rather than `Handle`. Configure Data Validator accordingly. For WooCommerce-specific import errors, see [Fix WooCommerce CSV Import Errors](/blog/woocommerce-csv-import-errors).\n\n### Why do price errors appear as successes in Shopify import?\n\nShopify validates price fields at the row level and silently drops invalid values rather than failing the row. A `Variant Compare At Price` that is less than or equal to `Variant Price` is dropped silently — the product imports without the sale pricing. A price field containing a currency symbol (`$12.99`) may cause the row to fail without a row-level error report. The only way to catch these before import is to validate the file against price rules — which is exactly what checks 6 and 7 in this checklist do.\n\n---\n\n## Validate Your Product CSV Before It Reaches the Platform\n\n✅ Ten validation checks — encoding, structure, data rules — run before upload\n✅ E-commerce Orders preset pre-configured for Shopify and WooCommerce fields\n✅ Files processed in your browser — never uploaded, never retained\n\n**[Validate Your Product CSV →](/tools/data-validator)**\n"};
Navigated to blog › product-csv-pre-import-validation-checklist
Back to Blog
csv-import-guides

Product CSV Pre-Import Checklist: Shopify and WooCommerce Validation

May 24, 2026
11
By SplitForge Team

Quick Answer

A product CSV can pass a platform's upload check and still produce a broken catalog. "Imported successfully" means the file parsed — it does not mean the data is correct. The fix is a ten-step validation sequence run before upload: encoding and delimiter checks first (encoding errors corrupt delimiter detection, making all subsequent checks unreliable), then structural checks on headers and Handle uniqueness, then business-rule checks on price fields and required values. Data Validator's built-in E-commerce Orders preset covers most of the data-rule checks out of the box; Format Checker covers the file-format layer.


TL;DR: The product import said "completed successfully." The store showed 800 products. What it didn't show: 73 products had Compare-At prices lower than their regular prices (Shopify silently dropped the Compare-At value), 12 products had image URLs that failed to load because the URL format was invalid, and 6 SKUs were blank because Excel had stripped their leading zeros. No error. No warning. A customer found the first pricing inconsistency.

The validation sequence below catches all of these before the file reaches the platform.


The Pre-Import Validation Checklist

Run these ten checks in order. Order matters: encoding errors corrupt delimiter detection, so checks 1–3 must complete cleanly before checks 4–10 are reliable.

#CheckToolWhat to look for
1Encoding is UTF-8, no stray BOMFormat CheckerRe-encode if Windows-1252 / ANSI detected; remove BOM if present
2Delimiter is comma (not semicolon or tab)Format CheckerEuropean-locale Excel exports default to semicolon
3Consistent column count across all rowsFormat CheckerInconsistent count = structural damage or extra comma in a field
4Required headers present, exact case, no trailing spacesManual or Data Validator required ruleHandlehandle; Variant SKU (trailing space) silently breaks import
5Handles and SKUs are uniqueData Validator uniqueness + Remove DuplicatesDuplicate Handles produce "handle already exists" errors or silent merges
6Data types correct — prices numeric, quantities integerData Validator dataType rulesA price column containing $12.99 fails Shopify's numeric-only requirement
7Compare-At Price exceeds Variant Price (if both are set)Data Validator range / regex ruleShopify drops the Compare-At silently if it violates the rule
8Image URL format is validData Validator url rule (format only — not reachability)Validates URL syntax; does not confirm the image is publicly accessible
9No leading zeros stripped from SKU or barcodeVisual inspection / Data Validator regex01234512345 is unrecoverable from the CSV if the source is gone
10No empty rows or columnsData CleanerTrailing empty rows cause row-count mismatches; empty columns waste column mapping

Table of Contents


Why Encoding Validation Comes First

Encoding errors do not just garble text — they corrupt the file's structure in a way that makes every subsequent check unreliable. A Windows-1252 file opened by a comma-delimiter detector may produce incorrect field counts because the detector misinterprets multi-byte sequences as delimiter or quote characters. A BOM-prefixed file may cause the first column header to appear with a three-character prefix, breaking header matching for the entire import.

Check 1 — Encoding: UTF-8, no BOM

Run Format Checker first. It detects encoding using byte-frequency analysis and reports the result before any other check. If the result is Windows-1252 (ANSI / CP1252) — the default for Excel on Windows — re-encode to UTF-8 before continuing. Format Checker performs this re-encoding in your browser; the original file is not uploaded anywhere.

BOM (Byte Order Mark): a EF BB BF prefix on UTF-8 files is injected by some tools as an encoding signal. Most Shopify import flows handle BOM correctly, but a malformed BOM can cause the first header cell to appear as Handle instead of Handle, breaking the import mapping silently. Format Checker detects and reports BOM presence.

Check 2 — Delimiter: comma

Shopify and WooCommerce both require comma-delimited product CSVs. Excel on European-locale systems defaults to semicolon as the list separator, producing a semicolon-delimited file when saved as CSV. Format Checker detects the actual delimiter character; if it reports semicolon or tab, the file must be converted to comma-delimited before any row-level validation is meaningful.

Amazon Seller Central flat files use tab-delimited format — that is intentional and correct for Amazon. For Amazon-specific validation, see Fix Invalid SKU Format in Amazon Seller Central CSV.

Check 3 — Column count consistency

Every row in a valid product CSV must have the same number of fields as the header row. Format Checker checks the first 10,000 rows for column count consistency and reports any row where the count differs. A count mismatch on an interior row indicates one of three causes: an unescaped comma inside a field (a product title or description containing a comma that was not properly quoted), a missing field (a row was edited and a column deleted), or structural damage from spreadsheet sorting.

A file with column-count inconsistencies cannot be reliably validated at the data-rule level — fix structural errors before running checks 4–10.


Structural Checks: Headers, Handles, and Column Count

Check 4 — Required headers present, exact case, no trailing spaces

Shopify's product CSV requires specific column headers with exact case and no whitespace variation. Handle works; handle fails. Variant SKU works; Variant SKU (trailing space) causes that column to fail import mapping silently — the column simply does not import. These failures produce no error; the field values are ignored.

Format Checker does not validate header names against a platform template — that check is a schema conformance check, not a file-format check. Run it manually: download the official Shopify product CSV template from your store's Products → Import → download template. Compare your column headers character-for-character against the template. For a programmatic check, configure a Data Validator required rule on each of your required headers.

Use Data Cleaner trimWhitespace to remove leading and trailing spaces from all cells — including header cells — before validating. A header cell that appears correct visually may still carry a non-printing space character.

Check 5 — Handle and SKU uniqueness

Each product Handle must be unique in the import file (one parent row per Handle, unless you are intentionally adding variant rows under an existing Handle). Duplicate Handles produce either "handle already exists" errors or silent product-data merges — the import processes without an error banner, but the resulting product may have combined variant lists from two different products.

Run Data Validator with a uniqueness rule on the Handle column. For near-duplicate detection — shirt-red vs shirt_red, blue-tshirt vs blue-t-shirt — use Remove Duplicates with fuzzy matching (Jaro-Winkler or token-based) to surface variants that exact-match deduplication misses. For the full deduplication workflow, see How to Clean a Product Catalog CSV for Shopify and WooCommerce.


Data-Rule Checks: Prices, Types, and Required Fields

Loading the E-commerce Orders preset

Data Validator includes a built-in E-commerce Orders preset. Load it first: it covers required fields, numeric type checks, and common e-commerce data rules out of the box. Extend it for your catalog's specific requirements rather than configuring rules from scratch.

Check 6 — Data types: prices numeric, quantities integer

Shopify requires Variant Price and Variant Compare At Price to be numeric values with no currency symbols — 12.99 not $12.99, 12.99 not 12,99 (European decimal format). A price column containing currency symbols or non-numeric characters fails validation at the row level. Configure a dataType: decimal rule on price columns in Data Validator. For Variant Inventory Qty, use dataType: integer.

WooCommerce uses regular_price and sale_price with the same numeric-only requirement.

Check 7 — Compare-At Price rule

Shopify requires Variant Compare At Price to exceed Variant Price when both are set. If Compare-At Price is less than or equal to Variant Price, Shopify silently drops the Compare-At value on import — the sale pricing disappears from the product without an error. Configure a range or custom regex rule in Data Validator to flag rows where Compare-At ≤ Price.

Check 8 — Image URL format

Data Validator's url dataType validates URL format — that the value is a well-formed URL (scheme present, no illegal characters, valid domain structure). It does not confirm that the image is publicly accessible or that Shopify can fetch it at import time.

A URL that passes format validation may still fail at import if the image is behind authentication, returns a non-200 HTTP response, or is a private URL. To verify image reachability, open a sample of image URLs in a browser before importing. Do not claim that format validation confirms reachability — it does not.

Check 9 — Leading zeros in SKU and barcode fields

Excel auto-converts columns that look like numbers to numeric format when it opens a CSV, stripping leading zeros from SKU and barcode values. A Variant SKU of 012345 becomes 12345. This conversion happens silently at the file-open step — the original values are lost in the CSV.

Configure a regex rule in Data Validator matching your expected SKU format (for example, ^\d{6}$ for a fixed-length 6-digit SKU). This catches truncated values that no longer match the expected length or pattern. Prevention is the correct fix: open CSVs via Excel's Data → From Text/CSV import wizard, setting numeric-looking columns to Text format before loading. Recovery from the CSV alone is often not possible if the source system is unavailable — see Recover a Corrupted or Broken Shopify Product CSV for the options.

Check 10 — No empty rows or columns

Trailing empty rows at the end of a product CSV produce row-count mismatches in some import systems and make format checks less precise. Empty columns (a column with a header but no values in any row) can break import mapping in edge cases. Use Data Cleaner with removeEmptyRows and removeEmptyColumns operations before import.


Validate Before Upload, Not After Rejection

The platform error loop — upload, read the error, fix one field, re-upload — is slow and often misleading. A single error message may correspond to multiple root causes: "error importing your file" maps to encoding, quoting, delimiter, and header issues simultaneously. The platform reports the first parse failure and stops — it does not surface all errors in one pass.

Running the ten-step sequence before upload surfaces all errors in one pass, against a readable validation report rather than a platform error screen. The workflow:

  1. Run Format Checker (checks 1–3). Fix any reported encoding, delimiter, or column-count issues.
  2. Run Data Validator with the E-commerce Orders preset extended for your catalog (checks 4–9). Fix all flagged rows.
  3. Run Data Cleaner trimWhitespace + removeEmptyRows (checks 4, 10). Re-run Data Validator to confirm zero errors.
  4. Upload to the platform.

A file that clears all ten checks imports without row-level errors. Silent failures from price-rule violations and image-URL issues are also prevented — those are the failures that produce a success banner but a broken catalog.

For the split-and-batch workflow needed for large catalogs (15MB+ or 1,000+ new variants), see How to Split a Large Shopify Product CSV Without Breaking Variants. For the full e-commerce CSV error taxonomy and platform format comparison, see Shopify & WooCommerce Product CSV: Fixes, Imports & Migrations.


Additional Resources

Methodology: Validation rules verified against Shopify and WooCommerce product CSV documentation, May 2026. Platform behavior on rule violations (silent drop vs. error) may vary by plan version — verify against your store's current import error output.

Platform documentation:

Standards:


FAQ

Encoding errors corrupt delimiter detection. A Windows-1252 file processed by a UTF-8 delimiter detector may misread multi-byte character sequences as comma or quote characters, producing incorrect field counts and split boundaries. If you run delimiter detection on an incorrectly-encoded file, the results are unreliable — fix encoding first, then validate the delimiter.

No. Format Checker validates file-format properties: encoding, delimiter, line endings, BOM, quote compliance, and intra-file column-count consistency. It does not validate header names against a platform template or verify that required columns are present. For header name validation, compare manually against the Shopify CSV template, or configure a required rule in Data Validator on each required column.

No. Data Validator's url rule validates URL format — that the value is a well-formed URL with a valid scheme and domain structure. It does not make HTTP requests to confirm the image is publicly reachable. A URL that passes format validation may still fail at import if Shopify cannot fetch the image. To confirm reachability, open a sample of image URLs in a browser before uploading.

The E-commerce Orders preset is a built-in rule configuration in Data Validator designed for e-commerce product and order CSV files. It includes required-field rules, numeric type checks on price and quantity fields, and uniqueness rules. Load it as a starting point and extend it with catalog-specific rules — your expected SKU format, option-name enum values, or Compare-At Price constraints — rather than building rules from scratch.

The Handle field is Shopify's product identifier and must be unique across your catalog. "Handle already exists" means either a Handle in your import file matches an existing product in your store (an update-vs-create conflict) or a Handle appears more than once in the file itself. Run Data Validator with a uniqueness rule on the Handle column. For near-duplicates (like shirt-red vs shirt_red), use Remove Duplicates with fuzzy matching to surface them before import.

Yes, with adjustments. The encoding, delimiter, and column-count checks (1–3) are platform-agnostic. The structural and data-rule checks (4–10) require substituting WooCommerce's column names: SKU instead of Handle, regular_price and sale_price instead of Variant Price and Variant Compare At Price. WooCommerce's uniqueness constraint is on SKU (row-level unique identifier) rather than Handle. Configure Data Validator accordingly. For WooCommerce-specific import errors, see Fix WooCommerce CSV Import Errors.

Shopify validates price fields at the row level and silently drops invalid values rather than failing the row. A Variant Compare At Price that is less than or equal to Variant Price is dropped silently — the product imports without the sale pricing. A price field containing a currency symbol ($12.99) may cause the row to fail without a row-level error report. The only way to catch these before import is to validate the file against price rules — which is exactly what checks 6 and 7 in this checklist do.


Validate Your Product CSV Before It Reaches the Platform

Ten validation checks — encoding, structure, data rules — run before upload
E-commerce Orders preset pre-configured for Shopify and WooCommerce fields
Files processed in your browser — never uploaded, never retained

Continue Reading

More guides to help you work smarter with your data

csv-guides

Do You Need a Database for a Large CSV File? (2026 Answer)

The internet's answer to every big CSV is 'import it into a database.' Sometimes that's right. Usually it's a weekend of setup to answer one question. Here's the honest decision.

Read More
csv-guides

How to Open a Large CSV File — Even 10 GB, No Database (2026)

Excel dies at 1,048,576 rows, text editors choke, and 'just use a database' is a weekend project. Here's every real way to open a huge CSV — receipts included.

Read More
excel-guides

Excel File Too Large to Open? Fix Every Memory Error (2026)

Excel freezes, throws 'not enough memory,' or crashes outright — on a file that's only 40 MB. Here's why file size lies about memory, and the fix per error.

Read More