Skip to content
Back to Resources
How-To

How to Automate Expense Review and Approval Routing

Skopx Team
July 27, 2026
10 min read

Expense review is one of the few finance processes where almost all of the work is mechanical and almost none of the decision is. Someone opens a report, checks the receipt is attached, checks the amount against a policy threshold, checks the category is coded correctly, then forwards it to the right approver and waits. When you automate expense approval routing, you are not asking software to decide whether a $900 client dinner was reasonable. You are asking it to do the checking, the chasing, and the routing so a human sees a clean, decided-in-thirty-seconds packet instead of a raw report.

This guide walks through building that workflow in Skopx, where you describe the automation in plain English in chat rather than dragging boxes around a canvas. It also draws a hard line that matters in finance: the workflow prepares and routes, a person approves.

What manual expense review actually costs teams

The cost is rarely one big number. It is spread across four places.

The submitter's time. Reports come back for missing receipts, wrong categories, or a missing project code. Each round trip is a day or more of calendar time and a context switch on both sides.

The approver's time. A manager opening an expense tool sees line items without context. Was this trip approved? Is this vendor already on a contract? Is this the third $200 lunch this month from the same person? Answering those questions means opening two more systems, so most approvers stop asking and just click approve.

The finance close. Reports that sit unapproved past the cutoff either land in the wrong period or force an accrual. Every unapproved report at day 3 of close is a phone call someone has to make.

The audit trail. When approvals happen over Slack DMs and hallway conversations, the record in the system of record says "approved by manager" with no reasoning attached. That is the part auditors ask about.

None of these are solved by making people faster. They are solved by moving the checking upstream of the human.

Why teams automate expense approval before other finance work

Expense review has three properties that make it an unusually good first automation.

It is high volume and low variance. Most reports look like most other reports. The rules that catch problems are simple: over threshold, missing receipt, non-standard category, duplicate amount and date, out-of-policy vendor.

It has a clear owner. Unlike revenue recognition or forecasting, one person or a small team owns expenses, so you do not need six stakeholders to agree before you build anything.

And it has an obvious human checkpoint. The approval itself is a judgment call, so you are never tempted to let the automation run the whole way. That constraint makes the design honest from the start. If you have already read our guide on automating invoice processing without losing control, the same split applies here: extract, check, and prepare automatically, then hand a human the decision.

The workflow design

The basic version runs on a schedule, pulls reports that are waiting, checks each one against your policy, and posts a single digest to the approver with everything they need to decide.

Daily expense triage

Every weekday 08:00

Fetch pending reports

Normalize fields

AI policy summary

Post approver digest

Log to sheet

A scheduled run that checks pending reports and hands each approver one clean digest.

Six steps, one decision point, and the decision point is a person reading Slack. That is the whole shape.

The pieces map onto Skopx step types directly. Fetching reports is an integration action against your expense tool, your accounting system, or a spend card provider. Normalizing fields is a field transform: trimming currency symbols, converting to a single reporting currency label, standardizing the category string. The policy summary is an AI step that runs on your own provider key. Posting the digest and writing the log row are integration actions again.

Data moves between steps with expressions. The AI step reads {{ steps.normalize.output.line_items }}, the Slack message reads {{ steps.policy.output.summary }}, and if you trigger the workflow from a webhook instead, the report ID comes in as {{ trigger.report_id }}.

What to automate versus what stays human

This is the part worth being blunt about. Skopx has no human-approval step. There is no node that pauses a run, waits for someone to click yes, and then continues. That is a real constraint, and for expenses it is also the right design.

An expense approval is a spending decision with a named accountable person attached. A workflow that clicks approve on someone's behalf creates an audit record that is not true. So the workflow prepares the decision and notifies the person who owns it, and that person acts in the expense tool where the approval is properly recorded against their name.

Here is a practical split.

TaskAutomatedHumanWhy
Pull reports awaiting reviewYesNoPure retrieval
Check receipt attachedYesNoDeterministic field check
Compare amount to policy thresholdYesNoDeterministic comparison
Flag duplicate amount plus date plus vendorYesNoPattern match
Summarize what the spend was forYesNoAI step on your own key
Decide if the spend was justifiedNoYesJudgment and accountability
Click approve or rejectNoYesMust be recorded against a real approver
Chase a missing receiptYesNoTemplated message to the submitter
Post the reason for an exceptionPreparedConfirmedDraft written, human sends

The rule of thumb: if a spreadsheet formula could produce the answer, automate it. If a person would need to be comfortable defending the answer in a meeting, route it.

How to automate expense approval in Skopx, step by step

You build this by describing it. Open the Workflows page, start a new workflow, and type what you want in chat. Skopx turns the description into concrete steps you can then inspect and edit.

1. Connect your tools first. The workflow can only act on connected accounts. At minimum connect your expense or accounting system and your messaging tool. Skopx connects to nearly 1,000 business tools, so the same design works whether reports live in a dedicated expense product, a spend management card platform, or a folder of submitted forms.

2. Add your own provider key. AI steps run on your key with zero markup. Without a key on the account, the AI step will not run. Add it in settings before your first test.

3. Describe the workflow. Paste something close to this into chat:

Every weekday at 8:00 in America/New_York, get all expense reports in Expensify with status submitted, then for each report check whether a receipt is attached, whether the total is over 500, and whether the category is one of Travel, Meals, Software or Other, then use an AI step to write a two sentence summary of what the spend was for and list any policy flags, then post one Slack message per approver to their DM listing each report with the amount, submitter, summary, flags, and a link to the report, and finally append a row to the Expense Review Log sheet with the report ID, amount, flags, and the time the digest was sent.

Be specific about the timezone, the status filter, the thresholds, and the destination. Vague descriptions produce vague steps, and the fastest way to a working workflow is naming the exact fields you care about.

4. Review the generated steps. Skopx will show you the trigger and each step. Check three things: the schedule trigger has the timezone you intended, the integration action is pointing at the right account, and the expressions in the Slack message reference the step outputs you expect. Fix anything that is off by editing the step directly or by telling the chat what to change.

5. Run it manually once. Every workflow can be fired manually regardless of its trigger. Do this before you let the schedule take over. Open the run and read each step's real output.

6. Turn on the schedule. Schedules support 15 minute minimum, hourly, daily, and weekly cadences. Daily at 8:00 local is right for most teams. If your approvers are spread across regions, build one workflow per region rather than one workflow with a branching timezone.

The advanced version: policy checks with two outcomes

Once the digest version is running, add a condition so clean reports and exceptions take different paths. Clean reports get a lightweight nudge to the approver. Exceptions get a prepared packet plus a task so nothing quietly ages out.

Policy check with exception routing

cleanexception

Report submitted webhook

Fetch report detail

Normalize amounts

AI policy check

Flags present?

Queue for approver

Draft exception packet

DM approver, open task

Submitted reports split into a clean path and an exception path, both ending with a human.

The condition step uses simple operators: is_empty on the flags array, greater_than on the total, contains on the category string. Keep the condition boring. If you find yourself wanting three nested conditions, that usually means the policy itself needs writing down more clearly.

Note that both branches end at a human. The clean branch does not approve anything. It just means the approver gets a one line "nothing unusual, ready for you" instead of a wall of detail.

Webhooks are a good fit here because the workflow fires the moment a report is submitted. Each workflow gets its own URL and a per-workflow secret, so point your expense tool's outbound webhook at it and the run starts on submission rather than waiting for tomorrow's 8:00 batch.

How to tell it is working

Every run in Skopx is inspectable. Each step records its real output, how long it took, and the exact error if it failed. That is your instrument panel, and you should actually look at it for the first two weeks.

Three signals tell you the workflow is earning its place.

Time to first approver view. Before automation, this is however long it takes someone to open the expense tool. After, it should be the time between submission and the digest landing. If reports are still sitting for days, your approvers are not reading the digest and the fix is the message format, not the workflow.

Exception rate stability. Log every flag to a sheet from day one. If your exception rate is above roughly a third of reports, your thresholds are too tight and people will start ignoring the flags. If it is near zero, they are too loose and you are automating a rubber stamp.

Rework volume. Count reports sent back to the submitter. This should drop, because the workflow catches missing receipts before the approver ever sees the report.

For a broader view of how finance workflows report on themselves, the approach in automating revenue reporting finance can trust applies here too: log the workflow's own output to a sheet so you can audit the automation, not just the expenses.

Common mistakes

Letting the workflow approve. Worth repeating. If your expense tool exposes an approve action over its API, it is tempting to call it for small clean amounts. Do not. The approval record becomes meaningless and you lose the one control your auditors care about.

Sending a digest per report. Twelve Slack messages at 8:00 gets muted by 8:05. One message per approver with all their pending reports gets read.

Skipping the manual test run. Schedules are unforgiving. If a missed schedule falls outside the 2 hour grace window, it is recorded as failed rather than fired late, which is honest but means you find out about a broken integration the next morning. Test manually first.

Forgetting the AI step needs your key. AI steps bill to your own provider key. No key, no summary, and the run fails at that step with a clear error. Add the key before you turn on the schedule.

Building one giant workflow. The 20 step ceiling exists, and hitting it usually means you merged three processes. Keep expense triage separate from reimbursement payment and separate from card reconciliation. The chasing of overdue items belongs in its own automation, closer in shape to automating payment reminders and dunning.

Trying to loop. Workflows are acyclic. There is no "keep checking until approved" loop. Model follow-ups as a separate scheduled workflow that looks for reports still pending after N days.

Frequently asked questions

Can Skopx approve low value expenses automatically?

Technically an integration action could call an approve endpoint. You should not build it that way. Skopx has no human-approval step by design, and an approval executed by an automation records a decision nobody actually made. The correct pattern is to mark low value clean reports as ready and let the approver clear them in one click.

What if our expense tool has no integration?

Two options. Use the webhook trigger, which gives you a unique URL with a per-workflow secret, and have your tool post to it on submission. Or run on a schedule and read the data from wherever it lands, a sheet, an inbox, or your accounting system. With nearly 1,000 integrations available, the more common problem is choosing which system is the source of truth, not finding one that connects.

How do we handle multi-level approval chains?

Model each level as its own routing step, not as a loop. The first workflow routes to the direct manager. A second scheduled workflow looks for reports approved at level one and over the escalation threshold, then routes those to finance. Each hop is a separate, inspectable run.

Can the AI step read receipt images?

The AI step works with whatever data the preceding steps produce. If your expense tool already extracts merchant, amount, and date from the receipt, pass those fields through and the AI step can reason over them. If you need raw extraction from an image, do that in the expense tool or an OCR integration first, then feed the structured output into the AI step.

What does this cost to run?

Skopx is $5 per month for Solo, $16 per seat per month for Team, and $5,000 per month for Enterprise. Every plan bills from day one. AI steps bill to your own provider key with zero markup, so the model spend goes straight to your provider rather than through us. For expense review, Team is usually the right fit because approvers need their own seats to inspect runs.

Where to start

Build the six step digest version first. Run it manually for a week, watch the step outputs, and tune your thresholds based on what actually gets flagged. Only then add the condition and the exception branch. The goal is not a workflow that approves expenses. It is a workflow that makes every approval a thirty second decision with the evidence already assembled, and leaves the decision itself exactly where it belongs.

You can build the first version in a single chat message at skopx.com/workflows.

Share this article

Skopx Team

The Skopx engineering and product team

Related Articles

Stay Updated

Get the latest insights on AI-powered code intelligence delivered to your inbox.