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.

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 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.

See it run on
your data.

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