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
- Where product data actually breaks
- The five failure modes, with symptoms
- Variants: the merged-cell problem
- Identifiers: leading zeros, GTIN and the check digit
- Prices, currencies and the geo-pricing trap
- What Google Merchant and Meta really validate
- A five-minute pre-upload checklist
- Which free tool fixes which step
- FAQ
1. Where product data actually breaks
Product data moves through four stages, and each has its own way of losing information:
- Source — a supplier spreadsheet, an admin panel, a marketplace export, or a web table you copy from a browser.
- Transform — merging columns, expanding variants, fixing prices, renaming headers, converting to CSV or XLSX.
- Transport — importing into Shopify, uploading to Google Merchant Center or Meta Commerce Manager, or posting to an API.
- 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
| Failure | Symptom you see | What actually happened |
|---|---|---|
| Merged cells | Prices land in the SKU column after flattening | Rowspan/colspan collapsed, shifting every subsequent cell left |
| Leading zeros | SKU 00127 becomes 127 | The column was typed as a number, so the zeros were never data |
| Quoted commas | A title like Hoodie, black splits into two columns | Naive comma splitting ignored the quote characters |
| Price formatting | $1,299.00 or 1.299,00 rejected | Currency symbols and thousands separators are not numbers |
| Identifier mismatch | GTIN rejected, product not matched | Wrong 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
- Every row has every column populated (or deliberately empty, with the parent fields repeated).
- The variant option names are their own columns, not a single “Variant” string.
- Two-row headers are joined into one unambiguous header (
Variant_Color,Variant_Size). - Rows with no option value are flagged rather than silently dropped.
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:
- Formatting.
$1,299.00,1 299,00and1.299,00all mean the same thing to a human and three different things to a parser. Normalise to1299.00with a separate currency field. - Meta’s format. Meta expects the currency code inside the value:
24.00 USD. Google expects the number alone inprice. The same catalogue needs two different shapes. - Geo-pricing. Stores that localise prices can return a different currency depending on where the request comes from. Comparing your feed price to what you see in a browser is not a valid check.
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 validator7. A five-minute pre-upload checklist
- Header check. Do all required columns exist, spelled exactly? A missing
image_linkrejects the whole file. - Row count check. Does the imported row count match the source? A mismatch means a quoted field split a row.
- Identifier check. Do the SKU and GTIN columns still contain the strings you sent — leading zeros intact?
- Price check. Every value a plain number (Google) or number plus currency code (Meta)? No symbols, no thousands separators.
- Variant check. Does every variant row carry its parent fields, with a shared group id?
- 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
| Step | Free browser tool | What it does |
|---|---|---|
| Table → CSV | Chrome extension | Expands merged cells, keeps leading zeros, exports a Shopify-ready CSV |
| Feed validation | Feed validator | Row-level errors for Google and Meta rules |
| Identifiers | GTIN validator | Length and GS1 check digit, with padded suggestions |
| Format conversion | CSV to JSON · XLSX to JSON | Quote-aware parsing, leading zeros preserved |
| Refresh comparison | CSV diff | Added, removed and changed rows by key |
| Deduplication | Remove duplicate lines | Case 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.
- Expand before mapping. Turn every merged cell into repeated values first; never map columns on a table that still has merges.
- Force identifier columns to text before any transformation, so the leading zero has no opportunity to disappear.
- Normalise prices into a number plus a separate currency column, and decide early which platform’s format you are targeting.
- Validate the produced file against the target platform’s rules, and read the row numbers — not the summary count.
- 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 ExtensionFree for 10 rows per table. $9 once for unlimited — no subscription.