Purchase Receipts
Sync receipts from your ERP into Ottimate for three-way invoice matching
A purchase receipt is a document that confirms goods or services were delivered against a purchase order. Receipts record what was actually received — including quantities and item details — and serve as the second verification step in three-way matching.
Source of truth: Purchase receipts originate in your source system (ERP). Ottimate syncs receipts from your ERP and stores them for document matching — your ERP remains the authoritative source for receipt data.
How receipts work in Ottimate
In a three-way matching workflow, receipts are synced to Ottimate after a purchase order has been created. Each receipt is linked to a specific PO, and a single PO can have one or more receipts (for example, when goods are delivered in multiple shipments).
Receipt line items reference the original PO line items through ottimate_po_item_id, connecting what was received back to what was ordered.
When an invoice arrives, Ottimate matches it against both the PO and its associated receipts to confirm that:
- The billed items match what was ordered (PO)
- The billed quantities match what was received (receipt)
- The billed prices match the agreed amounts (PO)
Receipt status values
Key fields
Linking receipts to purchase orders
Each receipt must reference an existing PO. You can identify the PO in two ways:
- By Ottimate ID — Provide
ottimate_po_iddirectly - By lookup fields — Provide
erp_vendor_id+ottimate_location_id+ eitherpo_numberorpo_external_id. Ottimate will resolve the PO for you.
Receipt line items
Each receipt line item links back to a PO line item. You can reference the PO item in three ways:
- By Ottimate ID — Provide
ottimate_po_item_id - By external ID — Provide
po_external_item_id(the external ID of the PO item) for lookup - By SKU — Provide
sku. Ottimate matches it against theskufield of the PO’s line items. This is used only whenottimate_po_item_idandpo_external_item_idare not provided; see SKU matching below for how ties are resolved.
SKU matching
When a receipt item is matched by sku and that SKU appears on exactly one PO line item, it resolves to that item directly. When the SKU appears on more than one PO line item, Ottimate tries to disambiguate using the receipt item’s quantity, in order:
- Exact match — If exactly one of the matching PO items has an ordered quantity equal to the receipt item’s
quantity, the receipt item is linked to that PO item. - Consolidated match — Otherwise, if the receipt item’s
quantityequals the sum of the ordered quantities across all PO items sharing that SKU, the single receipt item is expanded into one receipt item per matching PO item, each carrying that PO item’s ordered quantity. Use this when your source system sends one consolidated receipt line for multiple PO lines that share a SKU. - Ambiguous — If neither of the above applies, the request fails with a 400 validation error (
{"sku": ["N PO items match sku \"...\". Use Purchase Order Item external_id to disambiguate."]}). Usepo_external_item_idorottimate_po_item_idinstead to disambiguate.
API endpoints
Bulk operations
The bulk upsert endpoint allows you to create or update multiple receipts in a single request. This operation is processed asynchronously.
Rate limits:
- Maximum 100 receipts per request
- Maximum 1,000 total line items across all receipts in a single request
The response returns a batch_id that you can use with the Batch progress and Batch results endpoints to track the status of your bulk operation.
Updating receipts
When updating a receipt via PATCH, note the following restrictions:
- You cannot change
status,receipt_number,external_id, orottimate_po_id - To update existing line items, include the item
idin the items array - To add new line items, omit the
idfield

