# Returns and warranty claim form with progress tracking

Canonical: https://useformwork.com/use-cases/returns-and-claims

Updated: 2026-10-09

A returns and warranty claim form that collects order details and photos, routes each claim through triage and lets customers check progress by link.

A returns and warranty claim form has two audiences. Your team needs a complete claim with the right photos, and the customer wants to know what is happening without emailing to ask. In a shared inbox, neither happens: claims arrive in pieces and chasers pile up. This walkthrough sets up both in FormWork for Halden Home, a fictional appliance retailer that sells direct. It is a configuration pattern, not a case study.

## Build the returns form

Three pages keep simple returns short and fault claims thorough.

**Your order.** A **Name** field, an **Email** question, and **Order number** as **Text** with a [validation rule](/docs/logic/validation-rules) of **Must match a pattern (regular expression)**, for example `^HH-[0-9]{6}$`, with the message "Enter the order number from your confirmation email, like HH-204518". A **Date** for delivery.

**Product** is a **Dropdown** whose options come from a Products [data table](/docs/data-tables/options-source) with Name, Warranty months and Active columns, filtered under **Only show rows where** to rows where Active is `true`. A **Hidden value** field uses **Look up from a dropdown** to copy Warranty months from the chosen row, so your team sees it and the customer doesn't.

**What's wrong.** **Reason** is a **Single choice**: Change of mind, Faulty or damaged on arrival, or Fault under warranty. [Conditional logic](/docs/logic/conditional-logic) then shows only what applies:

- Change of mind: "Is it unused and in its original packaging?" as **Yes or no**.
- Either fault: a **Long text** description and the photos question below.
- Fault under warranty: an optional proof of purchase upload.

**What you'd like.** Refund, replacement or repair, and a collection **Address**.

The pattern only checks the format. FormWork doesn't know your orders, so it can't confirm an order exists unless you add a lookup with **Send to webhook** (GET only while someone fills in the form) to a system that answers it.

## Collect photos with file uploads

The photos question is a **File upload** with these settings from [files and uploads](/docs/entries/files-uploads):

- **Allowed file types**: `image/*`. Leave proof of purchase open to `.pdf` as well.
- **Allow multiple files**, with **Min files** 1 and **Max files** 6. The limit is 20.
- **Maximum file size**: the default is 10 MB per file and the most is 100 MB. Test a photo from a recent phone.

Files that are too large or the wrong type are refused as they upload, with a message naming the file and the limit. Use the description to ask for "the whole item, the fault and the serial number label".

Photos appear on the entry's **Answers** and **Files** tabs and count towards your storage. Deleting a claim deletes its photos for good.

## Set up triage and decision stages

On the form's **Process** page, start from the **Triage and resolve** template, which turns on respondent status, and adapt it:

| Stage | Kind | Owner and due time | Moves on with |
| --- | --- | --- | --- |
| Triage | Open | The Customer care group, due within 1 day | **Ask the customer** (comment required), **Accept**, **Refer to warranty team**, **Decline** (comment required, with a confirmation question) |
| Waiting on customer | Waiting | Keep the current owner | **Customer replied**, back to Triage |
| Warranty approval | Waiting, needs approval | Keep the current owner | The decision: to Return arranged or Declined. **Back to triage** |
| Return arranged | Open | Keep the current owner, due within 14 days | **Mark as resolved** |
| Resolved, Declined | Closed | None | |

Warranty approval asks the Warranty team group, with **Any one** approval needed and links that expire after 7 days. Tick only the answers approvers need under **Choose what approvers can see**. Approvers who open the email link see files by name only, so warranty staff in your account should open photos from the entry. See [approvals](/docs/process/approvals).

Keep a return reference, the outcome and a triage note in [team fields](/docs/entries/team-fields). When a customer emails more photos, the owner adds them with **Edit answers**, recorded in the entry's history.

## Let customers track their return with respondent status

[Respondent status](/docs/process/respondent-status) gives each claim one private, read-only status link. Turn on **Let people who submit see progress?** at the end of the Process page, then check **What respondents see** on each stage card.

| Stage | Kind | Neutral default | Label used here |
| --- | --- | --- | --- |
| Triage | Open | In progress | Being checked |
| Waiting on customer | Waiting | Being reviewed | Waiting for your reply |
| Warranty approval | Waiting | Being reviewed | Being checked |
| Return arranged | Open | In progress | Return arranged |
| Resolved | Closed | Completed | Completed |
| Declined | Closed | Completed | Closed: see our email |

Warranty approval deliberately shares Triage's label. "When it last changed" only counts moves that change the label, so the customer doesn't see an internal referral as an update. Give Declined its own label: a closed stage without one shows the label of the stage before it, which would leave "Being checked" on a finished claim.

**How customers get the link.** Turn on **Email the person who filled it in** in [notifications](/docs/forms/notifications), and the confirmation gets a **See progress** button. You can also insert **Status link for respondents** in the success message's **HTML template** or in an automation's email. When a customer phones, use **Copy status link** in the entry's menu.

**What they see.** The form's title, the current label and when it last changed, and when they submitted, in the form's appearance. No answers, photos, owners, stage names or comments. Anyone with the link can see it, and the page says so.

**When links stop working.** 90 days after the claim enters a closed stage, when the page says "This status link has expired". Also when you turn respondent status off for the form, turn the link off with **Turn off status link**, or delete the entry. Those show "This status link isn't available" without giving a reason. After you turn a link off, the next email that includes it creates a new one.

## Add automations for assignment and updates

Add these [automations](/product/automations) (see [triggers](/docs/automations/triggers) and [steps](/docs/automations/steps)):

1. **Share out new claims.** **Form is submitted**, then **Assign** with **Next in a group** for Customer care and **Skip people marked away** on.
2. **Tell the customer the decision.** **Stage changes** with **To** set to Return arranged and Declined. An **If** on **New stage** sends one of two **Send email** steps: return instructions, or the decline reason with the **Comment** inserted. Include the status link in both, and write decline comments for the customer to read.
3. **Chase a reply.** **In a stage too long** for Waiting on customer, longer than 5 days, then **Send email** to the customer's email answer.
4. **Overdue triage.** **In a stage too long** for Triage, 1 day, then **Send email** to the owner's email. FormWork sends nothing on assignment or when an entry becomes overdue unless you add this.

FormWork doesn't issue refunds or courier labels. To start them, add **Send to webhook** to automation 2, check [automation runs](/docs/automations/runs) and turn on **Email admins when an automation run fails**: a moved stage doesn't prove the request worked.

## Know the limits

- Everyone in the account can open every claim, including addresses and photos. Groups decide ownership, not access. See [team members and roles](/docs/platform/users-permissions).
- A claim is in one stage at a time, and due times count calendar time, so a Friday claim due within 1 day is overdue on Saturday.
- This setup doesn't calculate whether a fault is still in warranty. Triage compares the delivery date with the warranty months on the entry.
- The status page is read-only. Customers reply by email.

## Test these cases before you publish

- Each reason, and switching from a fault to change of mind after uploading photos. Hidden answers stay on the entry but aren't checked or exported.
- A photo over 10 MB, a PDF in the photos question, and seven photos.
- A malformed order number and a product marked inactive.
- The status page at every stage, including a claim moved to Warranty approval, and a declined claim.
- A turned-off link, and a failed webhook.

## Change it safely

Publish changes as a [new form version](/product/versioned-forms). Claims keep the questions they were answered with, while stages, labels and automations follow the latest version, and the publish review asks where claims in a removed stage go. Product changes in the data table apply without publishing.

## What success looks like

Each claim arrives with the photos triage needs, has an owner and a due time, and ends in Resolved or Declined with the reason recorded, while the customer could check progress without contacting you. Set your own response targets; this page doesn't claim any.

Compare with [application review](/use-cases/application-review), see [pricing](/pricing), or [talk through your returns process](/#contact).