A small job, worked through
Compare two CSV files by ID, not row number.
A sorted export can look completely different without a single value changing. Choose an existing ID that identifies the same item in both exports. Do not create new row numbers to make the files match.
Try a tiny, shuffled example
These three-row files are synthetic practice data, not a real catalog. In After, the rows move, one mug arrives, one leaves, and one stock value changes.
Open CSV Change Report and follow these steps:
- Choose synthetic-before.csv under Before (the older file).
- Choose synthetic-after.csv under After (the newer file).
- Select ID as the key—the column used to match the same item.
- Choose Create change report.
No cleanup step is needed for this practice pair.
| Record | What the report says |
|---|---|
| MUG-01 | Unchanged, despite moving from first to last |
| MUG-02 | Changed: Stock goes from 8 to 9 |
| MUG-03 | Removed |
| MUG-04 | Added |
1 added · 1 removed · 1 changed · 1 unchanged. The changed-values CSV has one data row: MUG-02, Stock, value, yes, 8, yes, 9. “Changed” in the summary counts records, not changed cells.
Choose a key that survives the shuffle
Use a stable, unique record ID present in both files. Row numbers are positions, not identities. A product SKU works only if it is unique per row; a repeated product handle or a reused SKU does not.
Missing or duplicate IDs stop the comparison. Resolve them in the source; the tool does not guess a composite key or merge duplicates. If an ID itself changes, the report sees a removed row and an added row.
Compare WooCommerce price changes by ID
Checking a price update? Compare an older and a newer product export from the same WooCommerce store. Keep the same columns, product types, categories and selected products in both exports. Different export settings can make products look added or removed.
Try this tiny pair: synthetic practice data only—never import it into a store. Save each block as a separate UTF-8 CSV file.
Before: woo-before.csv
ID,Name,Regular price,Sale price 101,Practice mug,18.00, 102,Practice bag,40.00,35.00 103,Practice notebook,8.00,
After: woo-after.csv
ID,Name,Regular price,Sale price 103,Practice notebook,8.00, 101,Practice mug,20.00, 102,Practice bag,40.00,32.00
- Open CSV Change Report and choose the older file under Before and the newer file under After.
- Select ID to match each product by its existing ID, then choose Create change report.
0 added · 0 removed · 2 changed · 1 unchanged. ID 101 has a Regular price change from 18.00 to 20.00. ID 102 has a Sale price change from 35.00 to 32.00. ID 103 stays unchanged even though its row moved.
This checks CSV values only. It does not prove an update succeeded or what customers see on the storefront; check the actual product pages separately. No store was tested for this example. For export steps and column names, see the official WooCommerce CSV guide.
Need to add product details rather than find changes?
A picking list and a product reference are related tables, not two versions of the same export. To add names or bins to every picking-list line, use CSV Lookup Join and its downloadable Main/Lookup practice files. Repeated item IDs in the main list are allowed; the lookup needs one nonblank, unique key per product. Main rows stay in order, and unmatched rows stay in the result.
Use CSV Change Report when you have Before and After exports and want added, removed or changed records. Its key must be unique within each file. A join does not replace that comparison or resolve ambiguous lookup duplicates.
Which file needs fixing when a CSV will not load?
A file-specific loading error starts with Before or After. The selected files stay in the tool: keep that tab open, correct the indicated source export, then replace only that file. If both files fail, Before is reported first; after fixing it, check for any After error.
“After: Record 2 has 3 columns; expected 2”
This synthetic CSV has an unquoted comma inside a product name:
ID,Name 001,Mug, blue
Re-export the name as one quoted field:
ID,Name 001,"Mug, blue"
Do not delete a real comma from a value or an entire record just to suppress an error. A CSV-aware editor or the source system’s CSV exporter should quote fields containing commas, line breaks or quotation marks. Inside a quoted field, a literal quotation mark is written twice. An unclosed quote error identifies the CSV record where that field began; record numbers include the header and can differ from physical text-line numbers.
For a UTF-8 decoding error, re-export using UTF-8 rather than changing the filename extension. For blank or duplicate headers, correct the source headings so each column has a unique nonblank name. If the files have no shared header, choose exports that use the same exact heading for the stable ID; case and spaces matter. The tool does not repair or normalize these inputs automatically.
Why does CSV comparison stop on a missing or duplicate ID?
Each ID must identify one row within each file. The same ID appearing once in Before and once in After is expected: that is how the tool pairs records.
“Before: duplicate ID in record 3”
This synthetic file has two variants sharing a product ID:
Product ID,Variant ID,Stock MUG,MUG-BLUE,8 MUG,MUG-CREAM,4
Selecting Product ID stops at the second MUG row. Selecting Variant ID works if that column is present in both exports and stays unique and stable. Do not delete a legitimate variant just to remove the error. If the source repeats rows by mistake, investigate and correct the source before exporting again.
“After: missing ID in record 3”
The selected ID cell is empty or contains only whitespace. Recover the real ID from the source system or export a different stable ID column in both files. Do not invent row numbers: sorting or adding rows would pair different records.
The error names the file and the CSV record, counting the header as record 1. A quoted field can contain a line break, so record 3 is not necessarily physical text line 3. Review the parsed row in a CSV-aware editor.
The ID column is not available to select
The selector lists only column headings that match exactly in both files. ID, id and ID are different headings. Check the export settings and use the same heading for the same field in both source files. Duplicate or blank headings must also be corrected before the files can load.
If no single column identifies each record consistently, this tool cannot safely match the rows. It does not build a key from multiple columns or guess which duplicate belongs to which row.
Why is an unchanged-looking record added, removed or changed?
If Before uses ID 001 and After uses 1, the result is one removal and one addition, even when every other cell matches. Preserve IDs as text when exporting; check for lost leading zeros, changed case and extra spaces. Do not normalize real identifiers unless the source confirms they represent the same record.
If the ID stays 001 but a value changes from 1 to 1.00, the record is changed. This is a text comparison, not a numeric equivalence check.
Does every row change because of an export timestamp?
Try comparing CSV exports without counting export timestamps. The synthetic inventory example ignores ExportedAt while keeping a Quantity change visible. Only shared non-ID columns can be ignored; added or removed columns still count as changes. “Unchanged in compared columns” does not mean the complete rows are identical, and ignored values remain in added/removed-row reports.
Read the differences literally
Comparison is exact and case-sensitive. Spaces, leading zeros, and 1 versus 1.00 count as changes. Row and column order do not. Added or removed columns are reported and make surviving rows count as changed, even when their other values match. A missing column differs from an empty cell.
Download the portable HTML report to read or share, or the added, removed and changed CSVs to review. Reports contain your data. Review CSVs protect formula-like values with a leading apostrophe, so they are not lossless re-import files.
File limits and a useful last check
This compares CSV data, not Excel formulas, formatting or workbooks. Use comma-separated UTF-8 files, at most 2 MiB, 10,000 data rows, 100 columns and 200,000 data cells per file. Headers must be unique, nonblank and at most 256 UTF-8 bytes each. A conservative 8 MiB combined output budget can reject large reports.
A comparison explains differences between the files you supplied; it does not prove either export is correct or explain why a value changed. Keep the originals.
Files are processed in your browser. See privacy and limited usage analytics.