3PL & Fulfillment

How do I reconcile my 3PL's on-hand report to my books every week?

A weekly routine for matching your 3PL's on-hand report to your own records.

Last updated September 16, 2026

Weekly. Not at month end when one ugly count day can be millions. The 3PL file is units, a snapshot of their floor at close of their day. It is not a live pick face. It is not available-to-sell and it is not valuation. Your books need both, and they will not match the file unit-for-unit.

Build expected on-hand from your ledger

Build expected on-hand from your ledger: receipts marked received, shipments marked done, transfers in-transit, returns sitting in QC, and quarantine. Then subtract. Variance is file minus expected, by SKU and by location. Set a threshold you will actually work: two units or one percent of on-hand, whichever is larger, plus any SKU that went negative. Below the line, log it. Above the line, cycle-count. When you count, snapshot expected qty at the start. Live picks and receipts during the count are timing, not shrink. Do not type Shopify down to make the sites agree. Do not write the 3PL file straight into the GL. The file is their floor at their timestamp. Your publish is ATS after a buffer. Forcing those together is how you invent shrink and then oversell the correction.

Most variance is state, not shrink

Most fake variance is a state, not shrink. Open shipments you marked "sent to 3PL" that they have not finished. Returns refunded in Shopify and not received. Pending putaway still in an inbound zone. In-transit between you and them. Amazon Reserved if you mixed FBA into the same file. Keep FBA on its own recon. Their Reserved is not 3PL shrink. Some 3PLs only update you when a count file lands, so a Tuesday file can be Monday's close. Age the file before you chase a unit. "Done" on send-to-3PL means transmitted, not processed. Reconcile their response IDs if you have them. Reconstruct by SKU and timestamp before you call the week a loss.

Reconcile billbacks against shipments

Billbacks are a second weekly match. Storage, pick, pack, and return fees should tie to shipments and receipts you already have, not to a PDF total. Unmapped fee accounts will sit in a clearing GL until close. After you settle units, journal real shrink from the count. Then tie valued inventory to the balance sheet by location so a quantity fix does not hide a dollar problem. A unit that matches and a WAC that does not is still a miss. 3PL storage and pick-pack are fulfillment expense, not inbound COGS. Do not capitalize a pick fee into the SKU because the invoice was ugly. The weekly habit is the close. Month-end should be a lock, not a treasure hunt.

Run this with AI

Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.

You are the ops and finance lead reconciling a 3PL every week.
Here is: sku, location, ledger_on_hand, 3pl_file_qty, file_age_hours, open_shipments, in_transit, returns_qc, quarantined, fba_reserved, last_receipt_state, pick_pack_bill, storage_bill.
[paste]

Produce:
1. Expected on-hand vs file, variance, and whether it clears a 2-unit or 1% threshold.
2. Rows that are state, not shrink (open send, QC, putaway, in-transit, Reserved, stale file).
3. Billback lines that do not tie to a shipment or receipt.
4. What to cycle-count this week vs log.
Do not recommend typing Shopify or the GL to match the file. Age the file first.

See it run on
your data.

Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.