Return Restock Reconciliation Checker
Refunds that never make it back into inventory cause overselling, shrinkage and support tickets that are hard to trace. This free return inventory reconciliation tool compares your returns records with your inventory adjustment history to surface returns not restocked, duplicate restocks, quantity mismatches and wrong-location restocks — the exact records that need investigating.
Pasted data is processed locally in your browser — never uploaded.
Pasted data is processed locally in your browser — never uploaded.
A restock counts as a candidate when its adjustment date is within this many days of the return date (0–365). Pairs with a missing date on either side are kept as date-unverifiable and flagged for review instead of auto-matched.
Load both reports to reconcile
Paste or upload the returns report in stage 1 and the inventory adjustment history in stage 2 above — both are processed locally in your browser. Set the matching date window, map the columns when prompted, and the reconciliation runs automatically.
How It Works
- 1
Export a returns or refunds report and your inventory adjustment history from Shopify, WooCommerce or your 3PL as CSV.
- 2
Paste or upload the returns report in stage 1 and map the SKU, returned quantity and return date columns.
- 3
Load the inventory adjustment history in stage 2 and map the SKU, signed quantity adjustment and adjustment date columns.
- 4
Set the matching date window and review the reconciliation: matched pairs, returns not restocked, duplicate restocks, quantity mismatches and wrong-location restocks.
- 5
Download the full report or the unresolved-only CSV and work through the flagged rows in your store admin.
Example
- ORD-3201 — 2 × SKU-101 returned on Jan 8; a +2 restock of SKU-101 logged on Jan 9 → matched.
- ORD-3203 — 3 × SKU-101 returned on Jan 10; a +3 "Customer return" adjustment on Jan 12, inside the ±3-day window → matched.
- ORD-3202 — 1 × SKU-102 returned, but two +1 restocks were logged (Jan 9 and Jan 10) → duplicate restock to investigate.
- ORD-3205 — 2 × SKU-103 returned but only 1 was restocked → quantity mismatch.
- ORD-3204 — 1 × SKU-104 returned and no SKU-104 adjustment exists at all → returned but not restocked.
Accuracy & Limitations
- The tool reads exported reports only — it never changes inventory in Shopify, WooCommerce, or any other platform.
- Matching is by SKU plus a signed positive adjustment within the date window; restocks logged under a different SKU or packaging code cannot be linked.
- Ambiguous matches are flagged for manual review, never auto-matched — when two returns could share one restock, you decide.
- Adjustments with unrelated reasons (transfers, cycle counts, damages, purchases) are excluded from candidate restocks by reason classification — review the excluded list before concluding a return was never restocked.
- Returns with an empty date cell cannot be window-matched; they are kept and flagged for review instead of being dropped.
- When a numeric date like 03/04/2026 is ambiguous, the tool assumes the US MM/DD order.
- Results are records to investigate, not proof of errors — confirm each flagged row in your store admin before correcting stock.
Supported CSV Formats & Columns
Both reports need a header row as the first line. Comma-, tab- and semicolon-separated files all work, including exports copied straight out of a spreadsheet. Columns are auto-detected from common header names and can be remapped by hand; only the Required columns must be mapped before the reconciliation runs.
1. Returns report CSV
One row per returned line — the refunds or returns export from Shopify, WooCommerce or your 3PL.
| Column | Required? | What it does / accepted header names |
|---|---|---|
| SKU | Required | Item identifier matched against the adjustment history. Detects sku, item_code, product_code, variant_sku, part_number. |
| Returned quantity | Required | Units returned on the line. Detects quantity_returned, qty, quantity, returned, units. |
| Return date | Required | Anchors the ±day matching window (default ±3). Any header containing “date”; ambiguous numeric dates like 03/04/2026 are read as US MM/DD/YYYY. Rows without a date are kept and flagged for review, never dropped. |
| Order number | Optional | Order or RMA reference; keeps flagged rows traceable. Detects order_number, order, rma, return_id. |
| Return reason | Optional | Shown in results for context. Detects reason, cause, note. |
| Location | Optional | Enables wrong-location detection when present in both files. Detects location, warehouse, facility, site. |
| Unit cost | Optional | Optional — unlocks the potential inventory value-at-risk estimate. Detects unit_cost, cost, price. |
Example rows
order_number,sku,quantity_returned,return_date,reason,location,unit_cost ORD-3201,SKU-101,2,2026-01-08,Wrong size,WH-East,8.50 ORD-3202,SKU-102,1,2026-01-09,Changed mind,WH-East,12.00
2. Inventory adjustment history CSV
One row per stock adjustment — the positive entries should be the restocks.
| Column | Required? | What it does / accepted header names |
|---|---|---|
| SKU | Required | Same identifier as in the returns report. |
| Quantity adjustment | Required | Signed number: positive for restocks, negative for write-offs. Detects quantity_adjustment, qty, adjust, change, delta, units. |
| Adjustment date | Required | Used together with the return date to apply the matching window. |
| Adjustment reason | Optional | Classified as return-like (restock, return, refund, RMA, putaway), unrelated (transfer, cycle count, damage, purchase…) or unknown. Unrelated reasons are excluded from matching and reported separately. |
| Location | Optional | Enables wrong-location detection. |
| Reference / order number | Optional | Matched against the returns order number when present. Detects reference, ref, order, source, document. |
| Unit cost | Optional | Used as a fallback for the value-at-risk estimate. |
Example rows
sku,quantity_adjustment,adjustment_date,reason,location,reference SKU-101,2,2026-01-09,Restocked,WH-East,ORD-3201 SKU-102,1,2026-01-09,Restocked,WH-East,ORD-3202
- Rows with missing or invalid required values are reported with the reason — never silently discarded.
- Only positive, return-like or unknown-reason adjustments inside the date window become match candidates; transfers, cycle counts, damages and purchases are excluded and listed so you can verify the exclusions.
- Ambiguous matches are flagged for manual review instead of being auto-matched — the matched list only ever contains clean 1:1 quantity matches.
- The checker only reads your files — it never connects to Shopify, WooCommerce or any other platform, and never changes inventory.