IIX Lab

Shopify product data management: imports, feeds, variants and identifiers

Most product data failures are not mysterious. They happen at five predictable points, they leave the same fingerprints, and they can be caught before upload. This guide walks through each one, what the platforms actually check, and a checklist you can run in five minutes.

What this covers

  1. Where product data actually breaks
  2. The five failure modes, with symptoms
  3. Variants: the merged-cell problem
  4. Identifiers: leading zeros, GTIN and the check digit
  5. Prices, currencies and the geo-pricing trap
  6. What Google Merchant and Meta really validate
  7. A five-minute pre-upload checklist
  8. Which free tool fixes which step
  9. FAQ

1. Where product data actually breaks

Product data moves through four stages, and each has its own way of losing information:

  1. Source — a supplier spreadsheet, an admin panel, a marketplace export, or a web table you copy from a browser.
  2. Transform — merging columns, expanding variants, fixing prices, renaming headers, converting to CSV or XLSX.
  3. Transport — importing into Shopify, uploading to Google Merchant Center or Meta Commerce Manager, or posting to an API.
  4. Storage — what the platform ends up holding, which is not always what you sent.

The dangerous stage is Transform. Source data is dirty but visible; storage errors are loud and reported. Transformation failures are silent: the file opens, the columns look right, the numbers look plausible, and only the importer knows something is wrong.

2. The five failure modes, with symptoms

FailureSymptom you seeWhat actually happened
Merged cellsPrices land in the SKU column after flatteningRowspan/colspan collapsed, shifting every subsequent cell left
Leading zerosSKU 00127 becomes 127The column was typed as a number, so the zeros were never data
Quoted commasA title like Hoodie, black splits into two columnsNaive comma splitting ignored the quote characters
Price formatting$1,299.00 or 1.299,00 rejectedCurrency symbols and thousands separators are not numbers
Identifier mismatchGTIN rejected, product not matchedWrong length, wrong check digit, or zeros stripped before upload

None of these produce an error at the moment they happen. They produce an error later, at the platform, where the message is aggregated: "invalid value" for a file of four thousand rows.

3. Variants: the merged-cell problem

Supplier tables present variants as a visual hierarchy. One row says Classic Tee, the next three rows share the same product but differ by size, and the colour cell is merged across all of them. That is a table designed for humans, not for an importer.

Shopify expects the opposite shape: one row per variant, with the parent fields repeated on every row and a shared item_group_id (in feed terms) or option columns like Option1 Name / Option1 Value (in Shopify CSV terms).

Flattening that by hand in Excel is where most damage happens. Excel fills merged cells by keeping the value only in the top-left cell, so a naive copy gives you three rows with an empty colour and a shifted price column. The file imports, the variants appear, and the prices are wrong by one column.

What good output looks like

You can reproduce the check in the browser: our free feed validator reports the row and column that will break, and the Chrome extension expands merged cells into complete rows before export.

4. Identifiers: leading zeros, GTIN and the check digit

Three separate problems hide behind the word “identifier”.

4.1 Leading zeros

00127 is a string. The moment a spreadsheet decides a column is numeric, it becomes 127 — and no formatting change afterwards can restore information that was never stored. The fix is at export time: write identifier columns as text (CSV) or as text-formatted cells (XLSX), never as numbers.

4.2 GTIN length

A valid GTIN has 8, 12, 13 or 14 digits. An 11-digit value is almost always a 12-digit GTIN that lost a leading zero. A 9-digit value is usually 13 digits missing four. Both are recoverable by padding — and both look completely normal in a spreadsheet.

4.3 The check digit

GTINs carry a GS1 check digit: starting from the right, multiply alternating digits by 3 and 1, sum, and the result plus the final digit must be divisible by 10. A value can have the right length and still fail. That is what “invalid GTIN” usually means.

The GTIN validator checks both length and check digit in bulk, and shows the padded value you probably meant.

5. Prices, currencies and the geo-pricing trap

A price is not a number — it is a number plus a currency plus a region. Three traps follow from that:

6. What Google Merchant and Meta really validate

Both platforms validate a small, strict core, and reject the file rather than the row when a required header is missing.

Google Merchant Center — required

id, title, link, image_link, price, availability. Warnings then come from gtin/mpn/brand, item_group_id for variants, and category-specific attributes.

Meta Commerce Manager — required

id, title, description, availability, condition, price, link, image_link. Note condition and description: Google does not require description, Meta does.

Why the error message is useless

Both platforms aggregate errors at file level. A message like “invalid value” for a 4,000-row file is technically correct and practically useless. The only way to find the row is to validate locally, with the same rules, before upload.

Run the same rules locally, free. Paste your CSV into the Google & Meta feed validator and get the line, the column, the value and a suggested fix. Nothing is uploaded.

Open the feed validator

7. A five-minute pre-upload checklist

  1. Header check. Do all required columns exist, spelled exactly? A missing image_link rejects the whole file.
  2. Row count check. Does the imported row count match the source? A mismatch means a quoted field split a row.
  3. Identifier check. Do the SKU and GTIN columns still contain the strings you sent — leading zeros intact?
  4. Price check. Every value a plain number (Google) or number plus currency code (Meta)? No symbols, no thousands separators.
  5. Variant check. Does every variant row carry its parent fields, with a shared group id?
  6. Diff check. If this is a refresh, compare last week’s file to this week’s: what changed, and should it have?

Steps 1–5 are what the feed validator automates. Step 6 is CSV diff. Step 3 for GTINs specifically is the GTIN validator.

8. Which free tool fixes which step

StepFree browser toolWhat it does
Table → CSVChrome extensionExpands merged cells, keeps leading zeros, exports a Shopify-ready CSV
Feed validationFeed validatorRow-level errors for Google and Meta rules
IdentifiersGTIN validatorLength and GS1 check digit, with padded suggestions
Format conversionCSV to JSON · XLSX to JSONQuote-aware parsing, leading zeros preserved
Refresh comparisonCSV diffAdded, removed and changed rows by key
DeduplicationRemove duplicate linesCase and whitespace aware, with a removed count

All of them run in the browser tab. No account, no upload, no analytics — you can save the page and use it offline, which matters when the data is a client’s catalogue under NDA.

9. A worked example: a 1,200-row supplier table

Here is the shape of a real problem, and the order that fixes it without rework.

The source. An .xlsx with 1,200 visual rows, three product families, two option columns (colour and size) and a merged “Colour” cell spanning four size rows. SKUs are 11 digits with a leading zero. Prices are typed as £24.99, some as 24,99. Images are in a “Photo” column as relative paths.

What a naive pipeline produces. Export to CSV → the merged colour survives only on the first row of each group → the price column shifts one position on the other rows → 900 of 1,200 rows have a price that belongs to a different product. Shopify imports them without complaint because each value is still a number.

The order that avoids rework.

  1. Expand before mapping. Turn every merged cell into repeated values first; never map columns on a table that still has merges.
  2. Force identifier columns to text before any transformation, so the leading zero has no opportunity to disappear.
  3. Normalise prices into a number plus a separate currency column, and decide early which platform’s format you are targeting.
  4. Validate the produced file against the target platform’s rules, and read the row numbers — not the summary count.
  5. Only then import. If the platform rejects the file, you have lost the round-trip cost, not the afternoon.

Most teams do steps 3–5 and skip 1–2, because merges and zeroes look like cosmetic issues. They are not: they are the two failure modes that survive every downstream check.

10. FAQ

Is Shopify CSV the same as a Google Merchant feed?

No. Shopify CSV is an import format with its own columns (Handle, Option1 Name, …). A Merchant feed is a different schema. Both start from the same messy table, which is why cleaning once and mapping twice is the efficient order.

Why does my CSV lose leading zeros when I open it in Excel?

Because Excel decides the column is numeric on open. The data is not corrupted by CSV itself — CSV has no types. Import with the identifier column set to Text, or use a tool that treats every cell as a string.

Can I fix a feed that is already uploaded?

Yes, but plan for re-approval: Google re-processes the file on upload, and disapprovals tied to that item persist until the item is re-crawled. Validate locally first; re-approval rounds are the expensive part.

How many variants can a single product have?

Shopify allows up to 2,048 variants per product in current plans, but the practical limit is your ability to keep option names and values consistent. Most import failures happen on products with 3+ options, not on row count.

If a supplier table is what you are starting from, skip the spreadsheet step entirely. The extension expands merged cells into complete rows, keeps identifier columns as text, and exports a CSV that imports on the first try.

Get the Extension

Free for 10 rows per table. $9 once for unlimited — no subscription.