Purchasing & Supplier Management
What is three-way matching and how do I do it for ecommerce purchase orders?
What three-way matching is and how to run it on your ecommerce purchase orders.
Last updated September 16, 2026
Match three documents before you pay: the purchase order (what you asked for), the receipt (what landed), and the supplier invoice (what they billed). If any one disagrees, you have a variance, not a bill to click. That is the whole method. Pay the goods invoice against the receipt, not against the PO alone. A PO with no receipt is open inbound, not a payable. Timing fights (a factory bill that arrives weeks before the carton) are a later problem. Here the job is the match itself.
Match quantity and price
Opening a PO does nothing to inventory or cost. Cost moves when goods receive, when the supplier invoice disagrees with the PO price, and when freight, brokerage, and duty post. Quantity match is receipt qty versus PO qty. Price match is invoice unit price versus PO unit price. If they short you 40 units, pay 40, not the invoice. If they raised the price after the PO, that variance hits the receipt (and then WAC) when you post it on purpose, not when AP forwards a PDF. Do not invent a dummy PO so the three-way "passes." Do not book a receipt you do not have so a bill can clear. A leftover $1 on a kit or a negative on-hand will poison the average long after the invoice is gone.
Handle partial receipts
Partials are normal. Forty of one hundred can land this week. Match and pay the forty. Leave the rest of the PO open. The short against the PO is a credit or a claim, not a close-enough click. One invoice per receipt when you can. Credit notes for shorts, not a second payment.
True up freight and duty
Ecommerce often adds a late freight or duty invoice. That is a landed-cost true-up, not a fourth match that replaces the goods. Estimate on the receipt. Sell. When the forwarder bill lands, match it to the container (or the value pool you allocated), not to a random SKU. Received-not-invoiced should hold goods you have and have not been billed for. Unmapped GL accounts (duty, freight, RNIV) will silently fail a pile of invoices and stall close.
Returns and dropship exceptions
Do not bring customer returns back as zero-cost POs; that recycles a bad average. Factory-direct dropship still has a three-way: the customer-driven PO, the vendor ship confirm, and their invoice. The warehouse never saw the unit, so warehouse WAC should not move. Sweep the variance queue weekly. The point is not a perfect match rate. The point is you pay for what the receipt shows, at the price you agreed, and you post price variance on purpose.
Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.
You are AP and the controller for an ecommerce brand. Here is: po_id, sku, po_qty, po_price, receipt_qty, receipt_date, invoice_qty, invoice_price, invoice_date, freight_or_duty_bill, allocated_to_container (yes/no), rniv_balance, gl_mapped (yes/no). [paste] Produce: 1. Three-way result per PO (qty match, price match, pay / hold / credit). 2. Variances that should move WAC on purpose vs bills that should not be paid. 3. Freight/duty bills that are a late true-up (match to container, do not skip the goods match). 4. Dummy POs, zero-cost return POs, and unmapped GLs that will stall close. Do not treat opening a PO as a cost event.
Explore this in Fulfil
More on Purchasing & Supplier Management
How do I forecast demand and build a purchase plan for a seasonal Shopify brand?
Building a purchase plan for a seasonal brand from a week-by-week demand forecast.
Three-way matching when your invoice arrives before your inventory does.
Handling a supplier invoice that arrives before the inventory does.
Handling partial receipts and short-shipments cleanly.
Keeping a PO clean when a supplier ships part of the order or comes up short.
See it run on
your data.
Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.