Browse the docs

Agent setup guide

Expense Claim Checker

Checks each expense claim against your written policy, gets the manager's approval, logs it to your sheet and tells the employee in Slack.

Available About 15 min to set up

What it does

Checks each expense claim against your written policy, gets the manager's approval, logs it to your sheet and tells the employee in Slack.

  • Starts from each claim your expense form posts to its webhook.
  • AI checks it against your written expense policy — allowed category, limits, receipt link, pre-approval, never-reimbursed items — and writes a policy note and a suggestion.
  • Limit math is recalculated in code before the manager sees it — never by the AI: each limit for the claim (e.g. per guest × guests) and how far the claim is under or over it; anything the AI got wrong is corrected and flagged.
  • The manager approves or rejects every claim in Reviews, seeing each check.
  • Approved claims are appended to your expense sheet with the policy result, note and approval time.
  • The employee gets a Slack direct message: approved and logged, or talk to your manager.

What it needs

  • A paid plan (agents run live on paid plans).
  • An AI provider key (Settings → AI Providers).
  • Google Sheets and Slack, connected in Settings → Integrations.
  • An expense form that can post JSON to a webhook, with the employee's Slack email.
  • Your written expense policy.

What it doesn't do

  • It checks claims and organises them for a person to approve; it makes no tax or credit decision and doesn't say what's tax-deductible.
  • It doesn't read receipt images — only whether a link was given; the manager opens the receipt.
  • It doesn't reimburse anyone or touch payroll or accounting.
  • Nothing is logged as approved without the manager's approval.

Availability and plans

Available

Its workflow is built and tested, and every app it needs is live. You can get it and set it up now.

Included free on the Enterprise plan; on other paid plans it's a one-time purchase per workspace (the price is on the Agents page). The Agents page in the app always shows its current status.

Before you start

  • A paid plan: agents run live, and the Free plan only runs Dry Runs.
  • An AI provider key (OpenAI, Anthropic, Google and more) in Settings → AI Providers. AI usage is billed by your provider.
  • These apps, connected in Settings → Integrations: Slack and Google Sheets.
  • A form, app or system that can send each new item to a webhook URL (the agent starts from a webhook).
  • About 15 minutes.

Set it up step by step

Get the agent first (buy it, or it's already yours when your plan includes it), then in Agents → My agents press “Set up this agent”. That creates the agent's workflow in your workspace (it counts towards your plan's workflow limit) and opens the canvas with a setup checklist above it. Each item links to the exact place to go and ticks itself off when it's done.

1. Connect your AI provider

The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.

2. Connect Slack

Connect your Slack workspace (Settings → Integrations → Slack).

3. Connect Google Sheets

Connect the Google account that can edit the expense sheet (Settings → Integrations → Google Sheets).

4. Paste your expense policy

Open “Check it against your policy” and replace the placeholder with your written policy.

SettingWhat to enterIn step
Your expense policyReplace the placeholder with your allowed categories, limits per category or per day, when a receipt is required, what needs pre-approval and what's never reimbursed. It starts as “[PASTE YOUR EXPENSE POLICY HERE: ALLOWED CATEGORIES, LIMITS PER CATEGORY OR PER DAY, WHEN A RECEIPT IS REQUIRED, WHAT NEEDS PRE-APPROVAL AND WHAT IS NEVER REIMBURSED]” until you replace it.“Check it against your policy”

5. Pick the expense sheet

Open “Add it to the expense sheet” and pick the account, spreadsheet and tab.

SettingWhat to enterIn step
Google account (expense sheet)The Google account that can edit the expense sheet. Pick your connected Google Sheets account.“Add it to the expense sheet”
Expense spreadsheetPaste the link of your expense spreadsheet (columns: Submitted, Employee, Email, Expense date, Merchant, Category, Amount, Currency, Purpose, Receipt link, Policy result, Policy note, Status, Approved at).“Add it to the expense sheet”
Expense tabThe tab approved claims are added to, e.g. Expenses.“Add it to the expense sheet”

6. Pick your Slack account

Open “Find the employee in Slack”, “Tell the employee it's approved” and “Tell the employee it wasn't approved” and pick your Slack account in each.

SettingWhat to enterIn step
Slack account (find employee)The Slack workspace your employees use. Pick your connected Slack account.“Find the employee in Slack”
Slack account (approved message)The same Slack workspace, to message the employee. Pick your connected Slack account.“Tell the employee it's approved”
Slack account (not approved message)The same Slack workspace, to message the employee. Pick your connected Slack account.“Tell the employee it wasn't approved”

7. Test it with Dry Run

Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.

8. Switch the trigger on

Open the trigger, switch the webhook on and copy its URL and secret into your expense form.

How it works

The agent is a normal workflow with 10 steps (1 AI step, with a person approving in Reviews). You can open, edit and monitor it like any other workflow.

  • New expense claim — Starts when your form or app sends data to the agent's webhook URL. Starts when your expense form posts a claim to this webhook: employee, amount, merchant, date, category, purpose and a receipt link.
  • Find the employee in Slack — Slack: Find user by email. Looks up the employee's Slack account from their work email, so they can be told the outcome by direct message.
  • Check it against your policy — AI step (runs on your AI provider key). AI checks the claim against your written expense policy — allowed category, limits, receipt rules, pre-approval — and writes a policy note and a summary for the manager. It suggests; the manager decides.
  • Check the math — Step. Recalculates each policy limit for this claim (limit × guests, days or nights) and how far the claim is under or over it in code — not by AI — writes the correct figures into the policy note and summary, and flags anything the AI got wrong for the manager.
  • Manager approves the claim — A person approves or rejects it in Reviews (the run waits). The manager reads the claim, the policy checks and the suggestion in Reviews, and approves or rejects. Every claim needs this approval.
  • Add it to the expense sheet — Google Sheets: Add a row. Branch: Approved. Appends the approved claim to your expense sheet with the policy result and note.
  • Tell the employee it's approved — Slack: Post a message. Sends the employee a Slack direct message that the claim was approved and logged.
  • Approved and logged — Kept in the run history. The run history keeps the claim, the policy check and the approval.
  • Tell the employee it wasn't approved — Slack: Post a message. Branch: Rejected. Sends the employee a short Slack direct message to talk to their manager.
  • Not approved — Kept in the run history. The run history keeps the claim and the rejection; nothing was logged.

Test it with Dry Run

Press Dry Run in the canvas. The agent runs on the sample data stored on its trigger (the “Sample data for Dry Run” box), so you can check every step's output before anything is live. Edit the sample to match the fields your own form or app sends.

Sample data fields

employee_name, employee_email, amount, currency, merchant, expense_date, category, purpose, receipt_url, submitted_at.

  • Nothing is sent or written: app actions, emails and Slack posts are simulated, and AI steps don't call your AI provider.
  • Approval steps use the Dry Run decision you pick in the step's settings (approved, rejected or timeout), so you can try each branch.

Go live

  • Open the trigger, switch the webhook on and copy its URL and secret into your expense form.
  • The webhook is protected by a secret: send it in the header shown in the Activation panel (requests without it are refused with 403). Each request starts one run.
  • The setup checklist adds a “paid plan” item before activation: live runs need a paid plan (the Free plan only runs Dry Runs).
  • When every checklist item is done and the trigger is on, the checklist says “Live — this agent is running”. Follow its runs in the workflow's History tab and in Analytics → Agents.

Questions

What should the form send?

A JSON POST with employee_name, employee_email (their Slack email), amount, currency, merchant, expense_date, category, purpose, receipt_url and submitted_at. Your form or site posts it with the webhook's signature header.

Can the AI get the limit math wrong?

Not in what the manager sees: a per-guest or per-day limit times the number of guests or days, and how far the claim is under or over it, are recalculated in code after the AI's check and written into the policy note. If the AI was off, the review screen shows what was corrected.

Does it read receipts?

No. It checks that a receipt link was given when your policy requires one; the manager opens the receipt.

What does the expense sheet look like?

A tab with the columns Submitted, Employee, Email, Expense date, Merchant, Category, Amount, Currency, Purpose, Receipt link, Policy result, Policy note, Status, Approved at (A to N).

Troubleshooting

  • “No AI provider connected” or a rejected key: connect or fix the key in Settings → AI Providers, then press Test there.
  • A checklist item stays unticked: the setting is still empty or still contains its placeholder text. Open the step from the checklist and fill it in.
  • An app step fails with “Needs reconnect”: the account's access was revoked or expired. Reconnect it in Settings → Integrations.
  • Slack says the app isn't in the channel: in Slack, type /invite @Fluxo Flow in that channel (always needed for private channels).
  • Nothing happens when your form sends data: check the webhook is switched on and the request carries the secret header (403 means it's missing or wrong).
  • A run shows as paused: it's waiting for someone in Reviews to approve or reject it.
  • A step failed: open the run in History and check that step in the Trace tab for the error and what it received.

Generated from the agent's own workflow, so it always matches what the agent does. Last updated .