# Travel requests with cost estimates and budget approval

Canonical: https://useformwork.com/use-cases/travel-requests

Updated: 2026-10-09

A travel request form that estimates the trip's cost, asks the budget holder to approve anything over £1,000 and hands the trip to the travel desk.

This walkthrough sets up a travel request form in FormWork for Acme Studio, a fictional company: staff describe the trip and its costs, the form works out an estimated total, anything over £1,000 waits for the budget holder's approval, and the travel desk books what has been approved. It is a configuration pattern, not a case study, and the amounts are examples.

## What goes wrong with travel requests by email

Requests arrive by email with dates but no costs, or costs but no budget code. Approval is a "fine by me" in a thread nobody can find later. The travel desk can't tell which requests wait on a manager and which wait on them, and neither can the traveller. The setup below gives each request one record, one stage and one owner at a time.

## Build the travel request form

The form, titled "Travel request", has three pages.

- **Trip**: Traveller, Department, Destination, a Travel dates group holding Depart and Return date fields, Purpose of trip (Client meeting, Conference, Team offsite or Training), Travel class (Economy or Premium economy) and a long text "Anything else we should know?".
- **Costs**: Flights, Hotel nights, Nightly rate and Estimated total, all [Number fields](/docs/forms/field-types).
- **Approval**: Work email, Budget code and Budget holder's email.

Make every cost field required, so the total is never left empty. If the Work email must be a company address, add a [validation rule](/docs/logic/validation-rules) with **Must match a pattern (regular expression)**, such as `(?i)@acmestudio\.example$`. FormWork can't yet compare two dates in a rule, so a Return date before the Depart date isn't caught; the travel desk checks dates when it books.

Anyone with the link can submit. FormWork doesn't sign requesters in, so share the link internally and treat Traveller and Work email as what the requester typed.

## Calculate the estimated total

Estimated total uses a **Default value** of **Calculation**:

```text
= Flights + Hotel nights * Nightly rate
```

Turn on **Read only** so requesters can't type over it. The value is worked out on the server, and stays empty until every answer it uses has one. See [calculated values and defaults](/docs/logic/calculations) and [server-side logic](/product/server-side-logic).

The fields hold numbers, not currencies. Ask requesters to give costs in pounds; FormWork won't convert them.

In this example the requester types the Budget holder's email, which means they choose their own approver. To avoid that, keep budget codes in a [data table](/docs/data-tables/options-source) with a column for the holder's address, make Budget code a **Dropdown** with options from it, and set Budget holder's email to **Look up from a dropdown** with **Read only** on.

## Set up the stages and owners

On the form's **Process** page, set up these [stages](/product/process). Entries start in New when they are submitted.

| Stage | Kind | Owner and due time | Moves on with |
| --- | --- | --- | --- |
| New | Open | The Travel desk group, due within 1 day | **Send for approval**, **Ready to book** (account admins only), or **Reject** with a required comment |
| Waiting for approval | Waiting, needs approval | Keep the current owner, due within 2 days | The budget holder's decision, or **Back to travel desk** with a required comment |
| Approved | Open | The Travel desk group, due within 2 days | **Mark as booked**, or **Cancel** with a required comment |
| Booked | Closed | None | |
| Rejected | Closed | None | |

The automation below moves requests out of New as soon as they arrive. Anything still there was submitted while the automation was off or its run failed, and the travel desk routes it by hand.

The travel desk works from **My work** and the stage filters on the entries page. Requests unassigned in the group show as "Unassigned in Travel desk" until someone takes one. Due times count calendar hours, not working days, so a request that arrives on Friday afternoon is overdue on Saturday. See [owners and due dates](/docs/process/owners-due-dates).

Add [team fields](/docs/entries/team-fields) for what the desk records: Booking reference, Actual cost and Desk notes. Requesters never see them.

## Ask the budget holder to approve requests over £1,000

On Waiting for approval, turn on **Needs approval** and set:

- **Approvals needed**: **Any one**.
- **Approvers**: **An email answer on the form**, Budget holder's email. Budget holders decide by link and don't need a FormWork account.
- **When approved, move to** Approved; **When rejected, move to** Rejected.
- **Links expire after**: 5 days.
- **Choose what approvers can see**: the trip details, travel dates, Estimated total and Budget code.

Then add an [automation](/product/automations) called "Route travel requests":

1. **When**: **Form is submitted**.
2. **Send email** to the Work email: "We have your travel request".
3. **If** Estimated total is more than 1,000: **Move to stage** Waiting for approval, then **Send email** to the travel desk's shared address: "A trip is waiting for approval".
4. **Otherwise**: **Move to stage** Approved.

Entering a stage that needs approval sends the request to the budget holder by itself, so the automation doesn't need a **Request approval** step. The extra email gives the travel desk a heads-up about trips they will book soon. To chase slow approvals, add an automation with **In a stage too long** on Waiting for approval for 2 days and a **Remind approvers** step, or start from the **Remind and escalate approvals** template. See [approvals](/docs/process/approvals) and [steps](/docs/automations/steps).

## Keep the traveller informed

- **Approval is decided**, **Rejected**: **Send email** to the Work email with the budget holder's **Comment**.
- **Stage changes** to Booked: **Send email** with the Booking reference team field.
- [Respondent status](/docs/process/respondent-status) can show neutral labels such as "Received", "Waiting for budget approval", "Approved, being booked", "Booked" and "Not going ahead".

The **See progress** button comes with the [notification](/docs/forms/notifications) **Email the person who filled it in**. That notification also stops a requester approving their own trip: an approver with the same address as the Work email is skipped. If you turn it on, remove the automation's **Send email** step, or travellers get two acknowledgements.

FormWork doesn't email the travel desk when a request is assigned or overdue unless you add an automation, such as the **Remind the owner when a stage is overdue** template.

## Who can see travel requests

Everyone in the account can open every request, whichever group owns it. Groups decide who owns and approves work, not who can see it. Travellers and budget holders don't need accounts, so keep the account to the travel desk and the admins who run it. See [team members and roles](/docs/platform/users-permissions).

## Test these cases before you publish

- A request of exactly £1,000. "More than 1,000" sends it to Approved without approval; use **Is at least** if that's wrong for your policy.
- A day trip with 0 hotel nights.
- A Budget holder's email that matches the Work email, with and without the confirmation notification on.
- A budget holder who rejects, and one who never answers until the link expires.
- A Return date before the Depart date.
- A request moved back to the travel desk, corrected and sent for approval again.
- The automation turned off, so the request stays in New.

Check each run in [automation runs](/docs/automations/runs).

## Change it safely

Publish changes to questions, stages and the threshold as a [new form version](/product/versioned-forms). Requests keep the questions they were answered with, while the process and automations follow the latest published version. The publish review asks where requests in a removed stage should go, and whether new owners and due times apply to requests already in a stage. The **Form is submitted** trigger runs once per request, so a new threshold doesn't re-route requests already submitted.

## What success looks like

Every request has a stage and an owner. Requests over £1,000 have an approval or rejection in their history. The travel desk books only from Approved and records the booking reference, and travellers can see progress without asking. Set your own turnaround targets; this page doesn't claim any.

For spend requests with line items, see [purchase approvals](/use-cases/purchase-approvals). Compare [pricing](/pricing), or [talk through your travel policy](/#contact).