Finance package

Expense claims

Employees submit a claim from a form; category limits and an approval policy route it, and approved claims are queued for reimbursement.

Starts from a formStarter~10 min setupv1.0.0

About this package

What it does

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

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

Step by step

  1. 1

    Claim submitted

    The start form collects the employee number, claim title, category, amount, currency, date, receipt link and business purpose.

  2. 2

    Look up the employee

    Get employee returns the name, email and cost centre from the finance system.

  3. 3

    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.

  4. 4

    Decide who approves

    The Expense approval policy decision table auto-approves small claims and routes the rest to a line manager or finance manager.

  5. 5

    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.

  6. 6

    Queue the reimbursement

    Approved claims are posted to the finance system and the claimant is emailed the payment run date.

Expense claim — 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. The same canvas you get in the designer after installing.

Forms

The start form and the task 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

Expense claim

Filled in by whoever starts the process

Employee number * employee_id · textEmployee number in the finance system (E-1001…)
What is the claim for? * claim_title · textShort description, e.g. "Client visit Wellington"
Category * category · select
travelaccommodationmealsequipmenttrainingother
Expense category (see the Expense categories table)
Amount * amount · number0Total including tax
Currency currency · select
NZDAUDUSDEURGBP
ISO currency code
Expense date expense_date · dateYYYY-MM-DDDate of the expense
Receipt receipt_url · urlhttps://…Link to the receipt (PDF or photo)
Business purpose business_purpose · textWhy the expense was needed
Approver (user id) approver_id · textOptional: user id of the approver for this claim (overrides the default approver chosen on install)

User Task

Approve expense claim

Approve {{employee_name}}: {{claim_title}} ({{currency}} {{amount}})

Approved amount * approved_amount · numberPrefilled: {{amount}}
GL code * gl_code · textPrefilled: {{category_rule.gl_code}}
Cost centre * cost_centre · textPrefilled: {{cost_centre}}
Comment for the claimant comment · text
ApproveRejectSend back

User Task

Fix and resubmit claim

Update your claim: {{claim_title}}

Amount * amount · numberPrefilled: {{amount}}
Receipt link receipt_url · textPrefilled: {{receipt_url}}
Note for the approver note · text
ResubmitWithdraw

From your code

Start a run over the API

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

shell
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

shell
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 … --wait

Inbound webhook

shell
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

8 assets, ready to adapt

TypeNameDetails
Email templateExpense claim approvedSent to the claimant when the claim is approved and queued for reimbursement.
Email templateExpense claim rejectedSent to the claimant when the approver rejects the claim.
Data tableExpense categoriesExpense categories with their general-ledger code, per-claim limit and receipt rule. Edit the rows to match your chart of accounts.
IntegrationFinance system
API referenceCreate expense reimbursementPOST /expense-reimbursements — Queue the reimbursement in the next expense payment run.
API referenceGet employeeGET /employees/{{employee_id}} — Employee record from the HR / finance system: name, cost centre and line manager.
Decision tableExpense approval policy4 rules — Who approves an expense claim, by amount and category. First matching rule wins.
WorkflowExpense claim21 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

What you connect it to

Credentials never travel in a package. The install wizard asks for what your environment must provide, or installs it incomplete until you finish setup.

Needs

  • REST API — A REST API integration: set its base URL and credentials on install.
  • Assignees — People in your workspace to receive the User Tasks (picked on install).
  • Email — Email delivery configured for the instance (EMAIL_PROVIDER), used for notifications.

After installing

  1. Finance system integration: set the base URL of your HR / finance API and an API token. The two references expect GET /employees/{id} and POST /expense-reimbursements; adjust their paths and the response model to your API in Integrations.
  2. Assignees: pick the default approver (used when a run does not pass approver_id) and the default claimant contact for sent-back claims (runs can pass claimant_user_id).
  3. Edit the Expense categories rows to your chart of accounts and limits, and the Expense approval policy rules to your delegation of authority.
  4. Email: configure EMAIL_PROVIDER on the instance so the approved / rejected emails are delivered (the steps continue on error).

Asked for on install

  • Integration “Finance system”Required

    • Tokenconfig.auth_config.token
    • Base urlconfig.base_urldefault https://finance.example.com/api· optional
  • Workflow “Expense claim” assigneesRequired

    • User for step “Approve expense claim”nodes.10.config.assignee_id
    • User for step “Fix and resubmit claim”nodes.11.config.assignee_id

Install

Install it in your workspace

Works on UserTasks cloud and on any self-hosted instance. Installing creates the assets above; nothing runs until you complete setup and start it.

In the app

  1. Download expense-claims-1.0.0.utpkg.
  2. Open Automations → Packages and drag the file onto the page (or choose Import package). Browse gallery there lists every gallery package without downloading by hand.
  3. Pick the file. The wizard verifies the checksum, every file hash and the signature, and shows the readme.
  4. Review the changes (what is created) and the data rows.
  5. Fill in the requirements, or tick Keep incomplete and finish later with Complete setup.
  6. Done: the workflow is published and active once setup is complete.

With the CLI

shell
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.yaml

Verify the download

File SHA-256
b61873a5a025c5bd764ffe8e4aa89daae84a37a5e7aa013c481d21a7a2fb971b
Package checksum (what is signed)
sha256:ca0ecd3777e48118e8b748bb3945c093bde841c96368b8377839a0cc648c540b
Signer
Unsigned preview build — compare the SHA-256 above

shasum -a 256 expense-claims-1.0.0.utpkg should print the file SHA-256. How gallery packages are signed.

Versions

Version 1.0.0

  1. v1.0.02026-10-26First release.

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

Related

Browse the whole gallery