Slippage → Checks → Orders & returns

Your storefront says it sold. Your warehouse never heard of it.

The orders that cost you aren’t the ones that fail loudly — those get retried. It’s the silent ones: payment cleared, fulfilment never heard of it, and nothing says so until the customer asks.

Three months of orders against shipments, causes grouped. $1,200 — $600 for the first three.

Write, with the questions filled in
oleksii@slippagehq.com

Two lines by email · no obligation · answered by the person who would do the work

Mechanism

Webhooks fail quietly, and then stop existing

This isn’t a theory about sloppy operators. Shopify documents the behaviour: a failing webhook is retried eight times over about four hours, and after eight consecutive failures the subscription is deleted — after which orders simply stop arriving downstream, with no error on your side. Their documentation →

Their own documentation recommends polling the Orders API to find orders your system missed — the platform telling you in writing that a separate reconciliation is required. Most brands have never read that page.

The same shape appears without webhooks: a marketplace order that failed validation, a connector run that timed out mid-batch, a return scanned into the warehouse whose posting job silently errored.

Sound familiar

Three that come up most

Paid, never fulfilled

Payment cleared, the webhook didn't. The order sits as paid/unfulfilled in a view nobody opens until a customer emails.

SKU drift

TWL-BLU-SET in the store, TWL_BLUE_SET at the warehouse. The connector never matches them, and you get oversells on one side and dead stock on the other.

Returns that never post back

The warehouse received it. The store system doesn't know. The refund goes out and the unit stays invisible.

Evidence

One hour, 43 orders, 42 of them lost

There is one public dataset where both sides of this seam are visible at once — a retailer's orders and what the warehouse actually shipped. We measured it instead of guessing.

0.64%

of orders vanished between the two systems

42 / 43

orders in the worst hour, across 42 different products — stock doesn't run out on 42 products in the same hour

~$2,700

a month at that rate for a brand doing $5M at an $80 average order value: refunds, reships, and stock already paid for

The honest caveat: that's one dataset, and yours will be different. It's a starting point for the question, not an estimate of your number. Most brands have never measured their own, which is exactly why it isn't in anyone's reporting. How we measured it →

The check

Two exports you already have

Export orders and shipments

Orders from Shopify, Amazon Seller Central or your ERP; shipments from the 3PL portal, ShipStation, ShipHero or the WMS. Same date range, standard exports, no integration or access required.

They get lined up by order number

Where order numbers don't match formats across the two systems — a prefix here, a suffix there — we normalise and report the match rate. Below 90% we say the files can't be trusted together instead of printing a number.

You get every paid order with no shipment against it

With the value attached, grouped by likely cause: never arrived, arrived and failed validation, shipped but never posted back, cancelled upstream only.

You can run this yourself right now, free. The browser version does the same matching on your own file, on your own machine, with nothing uploaded and no account. Run the check →

See it run

See the orders you were paid for and never shipped

Not a mock-up: this is the output of the same script we run on client exports, pointed at the sample files that ship with it. Note what it does with a result above 5% — it argues with itself before it argues with you.

Store: 420 rows sample_store_orders.csv Warehouse: 393 rows 3pl_shipments_sample.csv Key: store["Name"] ↔ warehouse["Order Number"] other candidates: Discount Amount↔Order Number 9%, Total↔Tracking 0% Key match on mature paid orders: 93% (404 orders) ✓ key looks right ======================================================================== ORDERS: STORE ↔ WAREHOUSE ======================================================================== Mature paid orders in flow: 404 ---------------------------------------------------------------------- A. Paid, no shipment anywhere 25 $4,088 B. Store says fulfilled, warehouse has no record 4 $623 ·C. Warehouse shipped, store never marked it 11 ·D. Refunded, and the goods shipped 104 E. Cancelled, but shipped anyway 3 $285 F. Shipped without payment 0 ·F2. Payment not captured, but shipped 4 ·G. Shipped more than once 6 ---------------------------------------------------------------------- MONEY AT RISK (A B E F) 32 $4,996 Share of flow 7.92% ======================================================================== · C, D and G are not in the total. C and G are risk and extra cost; D is what a normal return looks like — a loss only if the goods never came back, which is a different check. [!] Above 5% is more often a data problem than a leak of that size. Check: did the warehouse export the same period, and all channels? A — Paid, no shipment anywhere (25): ageing: median 27 days, oldest 82 days #1033 2026-06-28 82d $176.54 paid unfulfilled 0 shipments #1037 2026-07-09 71d $215.78 paid unfulfilled 0 shipments #1030 2026-07-17 63d $80.99 paid unfulfilled 0 shipments
sample data Console output of the same script that runs on client files, translated from its working language. The numbers come from the sample files shipped with it — no client data appears anywhere on this site.
Sample findings file — ordersCSV

The file is what you would actually receive: one row per problem order, with the value, the age and what to do about it. Take it to your operations meeting and see whether the columns are the ones you would ask for.

Deliverable

What lands in your inbox

orders-reconciliation.csv — sample shape, not real client data
37
paid, no shipment
$4,180
at retail
12
returns never posted
99.2%
key match rate
Never reached fulfilment21 orders · all within two hours on 14 Feb · webhook subscription removed the same day$2,640
SKU not recognised at the warehouse9 orders · one SKU family with an underscore convention$980
Returns received, not posted back12 units · refunded and still missing from stock$560
Cancelled upstream only7 orders · shipped anyway — the other direction of the same gapreview
Ongoing

The version that runs every morning

A one-off check tells you what the last quarter cost. It doesn't stop the next one, because the failure mode is continuous: every integration in your stack breaks on a renamed column — connectors, middleware, custom scripts, all of it. That isn't the interesting question.

The question is how long it stays broken before anyone notices. In an error queue nobody owns, that's until month-end. With a daily check it's a morning, because looking is the job rather than a side effect of it.

You get the exceptions before you're at your desk, with the value attached, and we keep the check working when your 3PL changes their export format — which they will.

Price

Published

One-off reconciliation
$1,200
three months of orders and shipments
  • Every paid order with no shipment, with value
  • Returns received and never posted back
  • Causes grouped, not just a list
Daily reconciliation
$800 / month
the check runs every morning
  • Exceptions in your inbox before the day starts
  • Format changes handled, not billed as a project
  • Month to month, no lock-in
Questions

The ones that come up

Our 3PL portal shows all of that.

It shows what they shipped. It cannot show an order that never reached them — that order isn't in their system at all. Same with a connector: it reports what it processed, not what it silently dropped. That gap is the whole reason the check needs two files instead of one.

We use Celigo / Zapier / a native integration. Doesn't it flag errors?

Yes, and that genuinely helps. Detection isn't resolution: the errors land in a queue, and at most brands of this size nobody is assigned to read it daily. The integration also can't see gaps between tools it doesn't touch. We're not replacing it — we're reading the queue and the space around it.

Isn't your script just as fragile as the connector?

Honestly, yes — it breaks on a renamed column like everything else. The difference isn't robustness, it's attention: watching and repairing it is the job we're paid for, not an afterthought between other work.

Can you do this for Amazon and other marketplaces?

Yes. Marketplace settlement files have the same shape of problem, plus their own flavours — reimbursements that never arrive, units lost inbound. The matching logic is the same; the file formats differ.

How to start

Two lines by email. No form, no calendar link.

Which two systems, roughly what size, what you have already tried. You get a straight answer the same working day — including “this is not something we would help with”, when that is the honest one.

Write, with the questions filled in
oleksii@slippagehq.com

Two lines by email · no obligation · answered by the person who would do the work