Start form
Expense claim
Filled in by whoever starts the process
Finance package
Employees submit a claim from a form; category limits and an approval policy route it, and approved claims are queued for reimbursement.
About this package
Expense claims is a complete claim-to-reimbursement process. An employee fills in the start form (what the claim is for, the category, amount, date, receipt link and business purpose) from the Run dialog in UserTasks or from your own portal posting to the API.
The workflow looks the employee up in your finance system, reads the category rules from the Expense categories table (GL code, per-claim limit, receipt rule) and evaluates the Expense approval policy decision table. Small claims are approved automatically; everything else goes to an approver as a User Task with the approved amount, GL code and cost centre pre-filled.
The approver can approve, reject or send the claim back. Sent-back claims go to the claimant to fix and resubmit, then return to the same approval step. Approved claims are queued for reimbursement through the finance API and the claimant gets an email with the payment run date. A five-day SLA tracks the whole run.
Starts from a form: the claimant fills in the workflow inputs (Run dialog in the app, or your portal posting them to the start API or the inbound webhook).
Someone fills in a form to start it: the workflow inputs are the start form (Run dialog in the app, or your own portal posting to the API), and people complete User Task forms along the way.
The flow
Claim submitted
The start form collects the employee number, claim title, category, amount, currency, date, receipt link and business purpose.
Look up the employee
Get employee returns the name, email and cost centre from the finance system.
Apply category rules
The Expense categories row for the category gives the GL code and per-claim limit; a claim over the limit is flagged.
Decide who approves
The Expense approval policy decision table auto-approves small claims and routes the rest to a line manager or finance manager.
Approve, reject or send back
The approver confirms the approved amount, GL code and cost centre. Sent-back claims go to the claimant and return to the same approval.
Queue the reimbursement
Approved claims are posted to the finance system and the claimant is emailed the payment run date.
Forms
The workflow inputs are the start form: the Run dialog renders them, and your own portal can post the same fields. User Tasks show their fields and outcome buttons to the assignee.
Start form
Filled in by whoever starts the process
User Task
Approve {{employee_name}}: {{claim_title}} ({{currency}} {{amount}})
User Task
Update your claim: {{claim_title}}
From your code
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":{"employee_id":"E-1001","claim_title":"Client visit Wellington","category":"travel","amount":640,"currency":"NZD","expense_date":"2026-10-20","receipt_url":"https://files.example.com/receipts/r-20931.pdf","business_purpose":"Quarterly review with Contoso"}}'CLI
usertasks workflows inputs <workflow id> # the start form: keys, types, required
usertasks workflows run <workflow id> --input employee_id=E-1001 --input claim_title="Client visit Wellington" --input category=travel --input amount=640 … --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 '{"employee_id":"E-1001","claim_title":"Client visit Wellington","category":"travel","amount":640,"currency":"NZD","expense_date":"2026-10-20","receipt_url":"https://files.example.com/receipts/r-20931.pdf","business_purpose":"Quarterly review with Contoso"}'What's included
| Type | Name | Details |
|---|---|---|
| Email template | Expense claim approved | Sent to the claimant when the claim is approved and queued for reimbursement. |
| Email template | Expense claim rejected | Sent to the claimant when the approver rejects the claim. |
| Data table | Expense categories | Expense categories with their general-ledger code, per-claim limit and receipt rule. Edit the rows to match your chart of accounts. |
| Integration | Finance system | |
| API reference | Create expense reimbursement | POST /expense-reimbursements — Queue the reimbursement in the next expense payment run. |
| API reference | Get employee | GET /employees/{{employee_id}} — Employee record from the HR / finance system: name, cost centre and line manager. |
| Decision table | Expense approval policy | 4 rules — Who approves an expense claim, by amount and category. First matching rule wins. |
| Workflow | Expense claim | 21 steps — An employee submits a claim; the category rules and approval policy decide whether it is auto-approved or reviewed, then the reimbursement is queued in the finance system. |
Expense categories · 6 sample rows
CategoryGL codePer-claim limitReceipt requiredPolicy notes
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 “Finance system”Required
Workflow “Expense claim” 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/expense-claims-1.0.0.utpkg
usertasks packages inspect expense-claims-1.0.0.utpkg # offline: checksum, hashes, signature
usertasks packages install expense-claims-1.0.0.utpkg --dry-run
usertasks packages install expense-claims-1.0.0.utpkg # prompts for each requirement
usertasks packages install expense-claims-1.0.0.utpkg --keep-incomplete --yes # in CI; finish with:
usertasks packages complete expense-claims -f values.yamlVerify the download
shasum -a 256 expense-claims-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
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
Finance
Screen new vendors for sanctions, registry and adverse media, tier the risk, review and verify bank details, then create the vendor in the ERP.
Needs:REST APIAssigneesEmail
Finance
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