Founders & Small BusinessFree
Shopify Order and Fulfilment Reconciliation
A platform order export repeats each order across one row per line item and leaves the order-level cells empty on every row but the first.
River reconciles the export at line level, which is the only level where the answer exists. In the worked example one month of orders is 2,847 rows representing 1,192 orders, so 1,655 rows are continuation lines with the order-level cells blank. Filter that file on a paid financial status and you keep 1,192 rows and silently drop 58.1% of the line items. A revenue total built that way reads $76,940 against a real $184,320.
Reconciled properly there are 126 exception orders worth $18,030, which is 9.8% of the month across 10.6% of orders. The largest class is the one an order-level report cannot show. Sixty-one orders are partly shipped, holding 88 unshipped lines worth $7,412, and the platform reports each of them with a single status covering the whole order. An order-level reconciliation finds $9,655 of that and structurally misses the other 46.5%, which is why the pile never clears no matter how often anyone runs the unfulfilled orders view.
Written for the operator whose dashboard, spreadsheet and 3PL report all disagree, and who has quietly stopped trusting any of the three. Every exception comes back with its customer, its age against your published window, and the action. The money side of the same file is the marketplace settlement reconciliation, and whether the orders were worth shipping is margin per SKU per channel. Where a supplier sits behind the late lines, the price increase response reads their paper, and a month of unshipped orders belongs in a payment prioritization memo.
One status per order is a display decision, not a fact
The aggregation is documented rather than accidental. Shopify's own API describes the field as the order's aggregated fulfillment status for display purposes, with valid values that include partially fulfilled. So a three-item order with one item still in the warehouse is a single row in any order-level report, carrying a status that is true of the order and false of two of its lines. The unshipped lines are real, they have customers attached, and nothing at order level will surface them.
The continuation rows make it worse in the opposite direction. Because order-level columns appear only once per order, any filter or pivot touching financial status, fulfilment status or total quietly discards every other row in the file. Here that is 1,655 of 2,847 rows. The failure is silent: the spreadsheet returns a clean-looking answer, the totals are wrong by 58.3%, and nothing indicates a problem. Correct handling means forward-filling the order-level fields down each order's rows before anything is matched.
Then the paid-and-unshipped pile stops being an operations metric. The FTC's mail and internet order rule makes it an unfair or deceptive practice to solicit an order without a reasonable basis to expect shipment inside the time clearly and conspicuously stated, or thirty days where none is stated. Where the seller cannot meet that, the buyer gets the option to consent to a delay or to cancel for a prompt refund, which the rule defines as seven working days. Marlow & Field promises five business days and is holding $12,630 past it.
How it works
Send the export
The raw order export as the platform produced it, blank rows and all included.
Send the fulfilment side
Shipment records, carrier tracking exports, and whatever SKU mapping your own warehouse uses instead.
State the promise
The dispatch window your site publishes, plus any pre-orders or subscriptions you ship late.
Work the exceptions
Classified, valued and aged, with the action and the affected customer on each.
What you get
- Order-level fields forward-filled down every continuation row before a single match is attempted
- Every line item reconciled against a shipment, not every order against a status
- Partly shipped orders broken out into their shipped lines and their waiting ones
- Every exception classified and valued, from paid but never shipped through to shipped twice
- The age of every unshipped paid line against the dispatch window you publish
- The action per exception, with the customer sitting behind each one named
Common questions
Why does my pivot table never tie to the dashboard?
Because the order-level columns are populated once per order and blank on every other row. Any pivot or filter touching financial status, fulfilment status or total drops those rows. In the worked example that is 1,655 of 2,847 rows, and the resulting revenue figure is 58.3% short while looking entirely plausible.
What is a partly shipped order and why does it hide?
It is an order where some lines went out and some did not. The platform reports one aggregated status for the whole order, by design, so the unshipped lines have nowhere to appear. Here that class is 88 lines worth $7,412, which is 41.1% of all the exception value and the single largest category.
Can I not just use the unfulfilled orders view?
It finds the orders where nothing shipped and misses the ones where something did. Those are the two classes worth $8,375, or 46.5% of the exceptions here. The view is not wrong, it is answering a question about orders when the question you have is about line items.
How urgent is the paid but unshipped pile?
More urgent than most operators treat it, because a published dispatch window is a commitment with a rule behind it. If you cannot ship inside the time you state, the buyer is entitled to be offered a delay or a prompt refund. Marlow & Field states five business days and is holding $12,630 past that. Left open long enough, the line often becomes a chargeback instead.
My warehouse uses different SKU codes. Does that break it?
Only if nobody maps them, which is the usual reason a reconciliation is abandoned. Send whatever mapping exists, even a half-finished sheet, and unmapped codes come back as their own exception class rather than being quietly counted as unshipped. Roughly a fifth of the range needed mapping here.
Does this work for Amazon, Etsy or a marketplace export?
Yes, and the same structural quirk shows up wherever an export flattens orders into line rows. What changes is the column names and which fields are order-level. Deliberate exceptions like pre-orders and subscription-generated orders get excluded by rule rather than by hand, so tell it about those.
What do I actually do with 158 exception lines?
Work them in age order against your published window, not in value order. Each line comes back with its customer, its order, what went wrong and the action, so the shipped-with-no-payment lines go to a process fix and the paid-and-waiting lines go out this week. That sequencing is the point of classifying them.
Shopify Order and Fulfilment Reconciliation
Fill in the form and your workspace opens with the work already underway.