Start inputs
NetSuite vendor bill approval
Passed by the calling system
Finance package
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.
Connects to Oracle NetSuite
About this package
NetSuite vendor bill (AP) approval runs bill approvals outside the NetSuite UI while keeping the approval status in NetSuite. When a vendor bill is created with approval status Pending Approval, a SuiteScript user event or a SuiteFlow action posts its internal id to the workflow.
The workflow reads the bill from the SuiteTalk REST record API with its item and expense sublists: vendor (entity), subsidiary, currency, total, tax, terms and due date. The AP approval limits decision table picks the approver level by subsidiary and amount and whether a financial controller or the CFO must also approve.
The AP approver sees the bill, its lines and the days to the due date, picks the cost centre from the Cost centres table (name, budget owner and NetSuite department fill in) and chooses Approve, Hold or Reject. Large bills go on to the second approver. The bill is then PATCHed in NetSuite: approvalStatus 2 (Approved) or 3 (Rejected), or kept at 1 with paymentHold set, with a memo, and AP is emailed the decision.
Starts from NetSuite: a SuiteScript afterSubmit user event (or a SuiteFlow "Send HTTP request" action) on Vendor Bill posts {"bill_id": record.id} to the workflow 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
Bill posted
NetSuite posts the vendor bill internal id when a bill is entered as Pending Approval.
Read the bill
GET /vendorBill/{id}?expandSubResources=true returns vendor, subsidiary, currency, total, due date and the item / expense lines.
Apply the limits
The AP approval limits table sets the approver level and any second approval by subsidiary and amount.
AP approves
The approver picks the cost centre (lookup), checks the PO match and chooses Approve, Hold or Reject.
Second approval
Over the subsidiary's limit, the financial controller or CFO approves or rejects.
Update NetSuite
PATCH /vendorBill/{id} sets approvalStatus (2 approved, 3 rejected, 1 with paymentHold for a hold); AP 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
Approve bill {{tran_id}}: {{vendor_name}} {{currency}} {{total}} (due {{due_date}}) · 2-column grid · own header and theme
User Task
{{second_approver}} approval: bill {{tran_id}} {{vendor_name}} {{currency}} {{total}} · 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":{"bill_id":"48213","tran_id":"INV-77120","ap_email":"accounts.payable@example.com"}}'CLI
usertasks workflows inputs <workflow id> # the start form: keys, types, required
usertasks workflows run <workflow id> --input bill_id=48213 --input tran_id=INV-77120 --input ap_email=accounts.payable@example.com --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 '{"bill_id":"48213","tran_id":"INV-77120","ap_email":"accounts.payable@example.com"}'What's included
| Type | Name | Details |
|---|---|---|
| Email template | Vendor bill decision | Sent to the AP mailbox with the decision on a vendor bill. |
| Data table | Cost centres | Cost centres AP approvers code bills to, with the NetSuite department and class ids and the budget owner. The approver picks one in the task form; its details fill in. |
| Integration | NetSuite | Oracle NetSuite SuiteTalk REST record API (/services/rest/record/v1). Use an OAuth 2.0 bearer token (client credentials / M2M) for an integration role with Bills (edit) and approval permissions. |
| API reference | Get vendor bill | GET /vendorBill/{{bill_id}} — Read the vendor bill with its item and expense sublists (GET /vendorBill/{id}?expandSubResources=true): vendor, subsidiary, currency, total, due date and approval status. |
| API reference | Update bill approval | PATCH /vendorBill/{{bill_id}} — Set the approval status on the vendor bill (PATCH /vendorBill/{id}): approvalStatus 1 = Pending Approval, 2 = Approved, 3 = Rejected; paymentHold and memo too. NetSuite answers 204 No Content. |
| Decision table | AP approval limits | 6 rules — Approval limits by subsidiary and bill total: the approver level, whether a second (controller / CFO) approval is needed and how long approvers have. First matching rule wins. |
| Workflow | NetSuite vendor bill approval | 19 steps — NetSuite posts a vendor bill id; the bill is read from the REST record API, the AP approval limits pick the approvers by subsidiary and amount, the AP approver codes the cost centre and approves, rejects or holds, and the approval status goes back to NetSuite. |
Cost centres · 6 sample rows
CodeNameNetSuite department idNetSuite class idBudget ownerBudget owner emailActive
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 “NetSuite”Required
Workflow “NetSuite vendor bill approval” 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/netsuite-vendor-bill-approval-1.0.0.utpkg
usertasks packages inspect netsuite-vendor-bill-approval-1.0.0.utpkg # offline: checksum, hashes, signature
usertasks packages install netsuite-vendor-bill-approval-1.0.0.utpkg --dry-run
usertasks packages install netsuite-vendor-bill-approval-1.0.0.utpkg # prompts for each requirement
usertasks packages install netsuite-vendor-bill-approval-1.0.0.utpkg --keep-incomplete --yes # in CI; finish with:
usertasks packages complete netsuite-vendor-bill-approval -f values.yamlVerify the download
shasum -a 256 netsuite-vendor-bill-approval-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
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
Finance Official
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.
Needs:REST APIAssigneesInbound webhook