Start inputs
SAP supplier invoice three-way match
Passed by the calling system
Finance package
A captured supplier invoice is matched to the SAP PO and goods receipts; variances outside tolerance go to AP, and matched invoices are posted to S/4HANA.
Connects to SAP S/4HANA
About this package
SAP supplier invoice posting with 3-way match takes invoices from your capture or OCR tool into SAP S/4HANA without blind posting. The capture tool posts the invoice header and line (supplier, invoice number, PO and item, quantity, unit price, gross amount) to the workflow.
The workflow reads the purchase order item from API_PURCHASEORDER_PROCESS_SRV and every goods receipt for it from API_MATERIAL_DOCUMENT_SRV (movement type 101), totals the received quantity and computes the quantity, unit price and amount variances. The Invoice tolerance decision table, modelled on SAP tolerance keys, decides whether the invoice is within tolerance.
Matched invoices are posted straight to A_SupplierInvoice with the PO and goods receipt reference, and the SAP invoice number and fiscal year are logged. Exceptions go to accounts payable on a task form showing PO, received and invoiced side by side, with a reason code lookup and Approve variance, Hold and Reject buttons; approved variances are posted with the chosen payment block.
Starts when your invoice capture / OCR tool posts the extracted invoice to the workflow start API or inbound webhook.
Another system starts it over REST or an inbound webhook. No UI is needed; people only appear where a decision needs a human.
The flow
Invoice captured
The capture tool posts the supplier, invoice number, PO line, quantity, unit price and gross amount.
PO and goods receipts
A_PurchaseOrderItem gives the ordered quantity and price; A_MaterialDocumentItem lists the goods receipts, which are totalled.
Variances
Quantity over receipt, price variance % and amount variance are computed and logged.
Tolerance
The Invoice tolerance decision table decides whether the invoice is within tolerance.
Exception review
Outside tolerance, AP gets a task form with a reason code lookup and Approve variance / Hold / Reject.
Post to SAP
Matched or approved invoices are posted to A_SupplierInvoice; the SupplierInvoice and FiscalYear are logged.
Forms
The inputs a caller passes when it starts a run, and the forms people complete when the process needs a decision.
Start inputs
Passed by the calling system
User Task
Invoice {{invoice_reference}} outside tolerance: {{exception_reason}} · 2-column grid · own header and theme
Headless
Every workflow can be started over REST, MCP or the CLI, whatever its trigger, with the sample input below. Runs start straight away on the published version; replace <workflow id> with the id the install created.
REST
curl -X POST "$USERTASKS_URL/api/v1/workflows/start" \
-H "Authorization: Bearer $USERTASKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"workflow_id":"<workflow id>","variables":{"invoice_reference":"NW-88213","supplier":"17300001","company_code":"1010","document_date":"2026-10-27","purchase_order":"4500001245","po_item":"10","invoiced_quantity":100,"invoiced_unit_price":12.9,"gross_amount":1535.1,"currency":"EUR","capture_id":"CAP-2026-10-27-0042"}}'CLI
usertasks workflows inputs <workflow id> # the start form: keys, types, required
usertasks workflows run <workflow id> --input invoice_reference=NW-88213 --input supplier=17300001 --input company_code=1010 --input document_date=2026-10-27 … --waitInbound webhook
usertasks webhooks create <workflow id> # prints the hook slug and secret once
curl -X POST "$USERTASKS_URL/api/webhooks/inbound?hook=<slug>" \
-H "Authorization: Bearer <webhook secret>" -H "Content-Type: application/json" \
-d '{"invoice_reference":"NW-88213","supplier":"17300001","company_code":"1010","document_date":"2026-10-27","purchase_order":"4500001245","po_item":"10","invoiced_quantity":100,"invoiced_unit_price":12.9,"gross_amount":1535.1,"currency":"EUR","capture_id":"CAP-2026-10-27-0042"}'What's included
| Type | Name | Details |
|---|---|---|
| Data table | Invoice match log | Every captured supplier invoice: the PO and goods receipt it was matched to, the variances, the decision and the SAP invoice document. |
| Data table | Variance reason codes | Why a variance was accepted, rejected or held. The exception form looks the code up and fills the description and the SAP payment block. |
| Integration | SAP S/4HANA | |
| API reference | Get goods receipts | GET /API_MATERIAL_DOCUMENT_SRV/A_MaterialDocumentItem?$filter=PurchaseOrder eq '{{purchase_order}}' and PurchaseOrderItem eq '{{po_item}}' and GoodsMovementType eq '101' and GoodsMovementIsCancelled eq false — API_MATERIAL_DOCUMENT_SRV A_MaterialDocumentItem: goods receipt lines (movement type 101) posted for the purchase order item. |
| API reference | Get purchase order item | GET /API_PURCHASEORDER_PROCESS_SRV/A_PurchaseOrderItem(PurchaseOrder='{{purchase_order}}',PurchaseOrderItem='{{po_item}}') — API_PURCHASEORDER_PROCESS_SRV A_PurchaseOrderItem: ordered quantity, net price and price unit, currency, tax code and GR-based invoice verification flag. |
| API reference | Post supplier invoice | POST /API_SUPPLIERINVOICE_PROCESS_SRV/A_SupplierInvoice — API_SUPPLIERINVOICE_PROCESS_SRV A_SupplierInvoice: create the invoice with its purchase order reference line (to_SuplrInvcItemPurOrdRef) against the goods receipt. Returns SupplierInvoice and FiscalYear. |
| Decision table | Invoice tolerance | 5 rules — Three-way match tolerances (like SAP tolerance keys PP / DQ / BW). First matching rule wins; anything not caught is within tolerance. |
| Workflow | SAP supplier invoice three-way match | 27 steps — A captured supplier invoice is matched to the SAP PO item and goods receipts; within tolerance it is posted, otherwise AP decides on a task form. |
Invoice match log · 1 sample rows
Match referenceSupplier invoice no.SupplierPOPO itemInvoiced qtyReceived qtyPO priceInvoiced pricePrice variance %Amount varianceMatch resultStatusReason codeSAP invoiceFiscal year
Variance reason codes · 5 sample rows
CodeDescriptionSAP payment blockTypical action
Requirements
Credentials never travel in a package. The install wizard asks for what your environment must provide, or installs it incomplete until you finish setup.
Integration “SAP S/4HANA”Required
Workflow “SAP supplier invoice three-way match” assigneesRequired
Install
Works on UserTasks cloud and on any self-hosted instance. Installing creates the assets above; nothing runs until you complete setup and start it.
curl -fLO https://usertasks.com/gallery/sap-supplier-invoice-three-way-match-1.0.0.utpkg
usertasks packages inspect sap-supplier-invoice-three-way-match-1.0.0.utpkg # offline: checksum, hashes, signature
usertasks packages install sap-supplier-invoice-three-way-match-1.0.0.utpkg --dry-run
usertasks packages install sap-supplier-invoice-three-way-match-1.0.0.utpkg # prompts for each requirement
usertasks packages install sap-supplier-invoice-three-way-match-1.0.0.utpkg --keep-incomplete --yes # in CI; finish with:
usertasks packages complete sap-supplier-invoice-three-way-match -f values.yamlVerify the download
shasum -a 256 sap-supplier-invoice-three-way-match-1.0.0.utpkg should print the file SHA-256. How gallery packages are signed.
Versions
Installing a newer version upgrades in place: local credentials and requirement values are kept, and changes you made are flagged first. How packages work
More packages
Finance Official
Match each incoming invoice to its purchase order and goods receipts, pay matches within tolerance and route exceptions to accounts payable.
Needs:REST APIAssigneesInbound webhook
Finance Official
NetSuite posts a vendor bill; subsidiary and amount limits pick the approvers, AP codes the cost centre and approves, rejects or holds, and NetSuite is updated.
Needs:REST APIInbound webhookAssigneesEmail
Finance Official
An SAP S/4HANA purchase requisition is read over OData, routed by an approval matrix to approvers who pick the cost centre, then turned into a PO.
Needs:REST APIAssigneesInbound webhook