Start inputs
Invoice three-way match
Passed by the calling system
Finance package
Match each incoming invoice to its purchase order and goods receipts, pay matches within tolerance and route exceptions to accounts payable.
About this package
Invoice three-way match checks every vendor invoice against what was ordered and what was received before it is paid. Your AP or OCR capture system posts the invoice (number, vendor, PO number, total, currency and lines) to the workflow; there is no form to fill in.
The workflow reads the purchase order and the goods receipts from your ERP, works out the quantity variance (invoiced minus received) and the price variance against the received value, and evaluates the Match tolerance decision table with the vendor's risk rating. Exact matches and small variances are scheduled for payment on the due date from the vendor's payment terms, and the invoice is marked matched.
Anything else becomes a "Resolve match exception" task for accounts payable, with a two-day SLA, a reminder and escalation to the clerk's manager. AP can approve the variance and pay, put the invoice on hold and email the vendor for a credit note, or reject it. Adapt the tolerance rules, the ERP paths and the vendor emails to your process.
Headless: your AP / OCR capture system posts each invoice to the start API or an inbound webhook. People only see the invoices that fail the match.
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 received
The AP / OCR system posts the invoice number, vendor, PO number, total, currency, invoice date and lines.
Read the PO and receipts
Get purchase order returns the vendor, risk rating and payment terms; Get goods receipts returns the quantity and value received.
Calculate the variances
Quantity variance is invoiced minus received; price variance is the invoice total minus the received value, also as a percentage.
Apply the tolerance rules
The Match tolerance decision table returns matched, within tolerance or exception, with the approver and a hold reason.
Pay the match
Matched invoices are scheduled for payment on the due date from the payment terms and marked matched in the ERP.
Resolve exceptions
AP approves the variance, holds the invoice and requests a credit note, or rejects it, and the vendor is emailed.
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
Match exception: {{vendor_name}} invoice {{invoice_number}} ({{currency}} {{abs_variance}} variance)
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_number":"INV-55410","vendor_id":"V-2001","po_number":"PO-4500123","invoice_total":11500,"currency":"NZD","invoice_date":"2026-10-20","lines":[{"line":1,"sku":"BRG-6204","description":"Ball bearing 6204-2RS","quantity":200,"unit_price":12.5,"amount":2500},{"line":2,"sku":"MTR-0750","description":"Electric motor 0.75 kW","quantity":10,"unit_price":900,"amount":9000}],"document_url":"https://files.example.com/ap/inv-55410.pdf"}}'CLI
usertasks workflows inputs <workflow id> # the start form: keys, types, required
usertasks workflows run <workflow id> --input invoice_number=INV-55410 --input vendor_id=V-2001 --input po_number=PO-4500123 --input invoice_total=11500 … --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_number":"INV-55410","vendor_id":"V-2001","po_number":"PO-4500123","invoice_total":11500,"currency":"NZD","invoice_date":"2026-10-20","lines":[{"line":1,"sku":"BRG-6204","description":"Ball bearing 6204-2RS","quantity":200,"unit_price":12.5,"amount":2500},{"line":2,"sku":"MTR-0750","description":"Electric motor 0.75 kW","quantity":10,"unit_price":900,"amount":9000}],"document_url":"https://files.example.com/ap/inv-55410.pdf"}'What's included
| Type | Name | Details |
|---|---|---|
| Email template | Credit note request | Sent to the vendor when AP asks for a credit note to cover a match variance. |
| Email template | Invoice rejected | Sent to the vendor when AP rejects the invoice. |
| Integration | ERP | |
| API reference | Get goods receipts | GET /goods-receipts — Goods received against a purchase order, summed per line, with the received value at PO prices. |
| API reference | Get purchase order | GET /purchase-orders/{{po_number}} — Purchase order header and lines from the ERP, including the vendor risk rating, payment terms and remittance email. |
| API reference | Schedule payment | POST /payments — Approve the invoice for payment and schedule it in the payment run on its due date. |
| API reference | Update invoice status | PATCH /invoices/{{invoice_number}} — Set the AP status of an invoice (matched, on hold, rejected) with a reason visible to the AP team. |
| Decision table | Match tolerance | 6 rules — Three-way match outcome from the price and quantity variance and the vendor risk rating. First matching rule wins. |
| Workflow | Invoice three-way match | 26 steps — An invoice from the AP / OCR system is matched against its purchase order and goods receipts. Matches within tolerance are scheduled for payment; exceptions go to AP to approve, request a credit note or reject. |
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 “ERP”Required
Workflow “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/invoice-three-way-match-1.0.0.utpkg
usertasks packages inspect invoice-three-way-match-1.0.0.utpkg # offline: checksum, hashes, signature
usertasks packages install invoice-three-way-match-1.0.0.utpkg --dry-run
usertasks packages install invoice-three-way-match-1.0.0.utpkg # prompts for each requirement
usertasks packages install invoice-three-way-match-1.0.0.utpkg --keep-incomplete --yes # in CI; finish with:
usertasks packages complete invoice-three-way-match -f values.yamlVerify the download
shasum -a 256 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
Employees submit a claim from a form; category limits and an approval policy route it, and approved claims are queued for reimbursement.
Needs:REST APIAssigneesEmail
Finance
On the first of each month, open the close in the ERP and issue every checklist task with a deadline, evidence rule and an audit log.
Needs:REST APIAssignees
Finance
Requesters submit a requisition; the purchasing policy sets approvals and quotes, and approved requests become a purchase order sent to the supplier.
Needs:REST APIAssigneesEmail