← All articles

How to Automate Purchase Order and Expense Approvals for Your Service Business

Learn to automate purchase order approvals for your service business with a no-code n8n workflow that routes by dollar threshold and only pings you for exceptions.

A field technician at a supply house counter checking a phone while a manager approves a purchase order remotely

It’s 7:40 a.m. Your lead tech is at the supply house counter with a cart full of copper and a $612 total, texting you: “cool to grab this?” You’re mid-shower, on a call, or driving. He waits. The counter guy waits. Ten minutes of two guys standing around because a $600 purchase needs your thumbs-up.

Multiply that by every crew, every day. That idle time is real money. Worse, it trains crews to either wait forever or just buy whatever and sort it out later — which is how you get $4,000 of mystery charges on the card statement at month-end.

The fix isn’t a bigger approval app. It’s a workflow that approves the routine stuff instantly and only interrupts you when something actually needs your judgment.

Why manual approval chains stall jobs

“Text me before you buy” puts a human — you — in the middle of every transaction, including the 80% that are completely predictable. A journeyman buying standard fittings from your regular vendor for a job you already quoted does not need your approval. He needs to get back to the truck.

But you can’t rip the gate out entirely, because the other 20% — the $2,800 rental compressor, the laser level someone “needs,” the sketchy vendor nobody’s used before — is exactly where money leaks.

So the goal is a system that:

  • Auto-approves low-risk spends instantly (under a threshold, known vendor, tied to a job)
  • Routes mid-size or unusual spends to whoever should decide
  • Only pings you for the true exceptions
  • Logs everything so you’re never guessing at month-end

That’s an internal approval workflow automation, and you can build it in a weekend with n8n, a form, and your accounting tool.

Step 1: Map your approval rules before you build anything

Do not open n8n yet. The tool is the easy part. The rules are where owners get this wrong.

Spend 30 minutes writing out three things.

Dollar thresholds. Pick two lines, not one. A common setup for a small crew:

  • Under $250 — auto-approve, no human, if the vendor is on the whitelist and a job number is attached.
  • $250 to $1,000 — approved by a lead/foreman, not the owner.
  • Over $1,000 — owner approval required.

Set these to your reality. If your average material pull is $800, a $250 auto-approve line is too low and you’ll still be the bottleneck. Pull your last 60 days of receipts and find the number where 70–80% of purchases fall below it. That’s your auto-approve line.

Vendor whitelist. List the 8–15 suppliers your crews actually use — Ferguson, the local supply house, Home Depot Pro, whoever. A whitelisted vendor under threshold sails through. An unknown vendor always gets a human, even at $40, because that’s where fraud and “personal” charges hide.

Who can auto-approve what. Your lead with eight years in can approve up to $1,000 on his own jobs. The apprentice can’t. Map name → limit. Keep it dead simple.

Write this as a plain table. That table is your automation logic — you’re just going to translate it into routing steps.

Step 2: Build the request intake

Every purchase needs a front door: a form — Tally, Fillout, or a Google Form — the tech fills out from their phone in 20 seconds.

  1. Who’s requesting (dropdown of your crew)
  2. Job number / address (dropdown, validated against open jobs)
  3. Vendor (dropdown of your whitelist + “other”)
  4. Amount
  5. What it’s for (one line)
  6. Photo of the cart/quote (optional but great for the log)

The form submission is your trigger. In n8n, a Form Trigger node or a webhook fires the moment they hit submit — no polling, no delay.

Realistically the tech fills this out at the counter while the order’s being pulled. By the time the counter guy is ringing it up, the answer is already back.

Step 3: Build the conditional routing in n8n

Here’s the workflow, node by node.

1. Form Trigger node. Catches the request the instant it’s submitted.

2. Set node — normalize the data: cast amount to a clean number, pull requester and vendor into variables you can test against.

3. HTTP Request or Google Sheets node — read your rules table (whitelist + per-person limits) at the top of the run. Store it in a Sheet or Airtable so you change a limit by editing one cell, never the workflow.

4. Switch node — the routing brain. Your rules table, in code:

if vendor NOT in whitelist        → route to owner (exception)
else if amount < requester_limit
     AND amount < 250             → AUTO-APPROVE
else if amount <= 1000            → route to foreman
else                              → route to owner

5a. Auto-approve branch. Writes “Approved (auto)” to the log, sends the tech a one-line confirmation via Twilio or WhatsApp: “Approved — PO #1043. Go.” No human touched it.

5b. Foreman branch. Sends the foreman a message with two buttons — Approve / Deny — via Slack, Telegram, or SMS reply keywords. Their tap flows back in and either confirms to the tech or sends “denied — call the office.”

5c. Owner branch (exceptions only). Same approve/deny message, but it comes to you, and only for the stuff that genuinely needs you. This is the whole point: instead of 40 texts a week, you get 5.

The timeout you’ll forget. n8n’s approval nodes wait for a response; wrap the foreman branch in a Wait node set to ~10 minutes with a fallback path. If the foreman is up a ladder and doesn’t respond, the request escalates to the owner automatically so nobody’s left standing at the counter.

If you’ve built routing like this for dispatch and scheduling, this will feel familiar — same “conditions → route → notify” backbone, pointed at spend instead of jobs.

Step 4: Sync approved POs to your accounting tool

The value isn’t just the yes/no. It’s that an approved purchase becomes a real PO in your books without anyone re-typing it.

On any approval (auto, foreman, or owner), add a branch that pushes the record into QuickBooks, Xero, Jobber, ServiceTitan, or Housecall Pro via their API or a connector node:

  • Creates a purchase order or expense entry
  • Tags it to the job number from the form
  • Attaches the requester and vendor
  • Drops in the cart photo as the receipt

The data your tech typed once at the counter now lives in the form log, the crew’s confirmation text, and your accounting system. No bookkeeper re-keying receipts from a shoebox at month-end. Same double-entry elimination we cover for data entry across a service business — captured once, reused everywhere.

Step 5: The running log and monthly rollup

Every request — approved, denied, auto or manual — appends a row to a master Sheet or Airtable base: timestamp, requester, job, vendor, amount, decision, who decided.

That log answers questions you currently have to ask people to answer:

  • How much has Job #4471 spent on materials so far?
  • Which crew runs hottest on Home Depot runs?
  • What got auto-approved last week vs. what needed me?

Then schedule a monthly rollup. A Cron node fires on the 1st, aggregates the log, and emails you a one-page summary:

  • Total spend by job
  • Total by crew/tech
  • Count and dollar value of auto-approved vs. escalated
  • Any denied requests and why
  • Top vendors by spend

Read it in two minutes over coffee instead of interrogating a spreadsheet. Same recurring-reporting pattern as our guide to automated reporting for service businesses, aimed at spend control.

What to watch for (the stuff that bites people)

Setting the auto-approve line too low out of fear. Owners nervous about control set it at $100. Then crews are still texting you constantly, they hate the system, and they route around it. Set it where 70–80% of normal purchases clear automatically. You control risk with the vendor whitelist and job-number requirement, not by choking the dollar amount.

No job number = no auto-approve. Make the job field required and validate it against your open jobs. The biggest source of “where did this money go” is spend tied to nothing. If a purchase can’t name a job, that alone routes it to a human.

Forgetting the timeout escalation. No escalation path means a tech stuck at the counter when the foreman doesn’t see the ping — the exact problem you were solving. Always build “no answer in X minutes → escalate.”

Whitelist rot. Crews find a new supplier, it’s not on the list, everything from there gets flagged, and they start putting it on the personal card to dodge the friction. Review the “other vendor” entries in your log monthly and promote the legit recurring ones.

Silent auto-approvals piling up. Auto-approve isn’t invisible — the log is why you can still see everything after the fact. Skim the auto-approved column weekly for the first month. If something looks off, tighten a limit — one spreadsheet cell.

Treating denial as the end. A denied request should tell the tech what to do next (“call the office”), not just “no.” Otherwise you get a confused crew and a stalled job.

When this is worth it — and when it isn’t

Say each stalled approval burns 8 idle minutes and happens 15 times a week. At a loaded crew rate of $65/hour, that’s roughly 2 hours — about $130 — of paid idle time every week, or ~$6,700 a year, before you count the mental tax of being pinged all day. If you run two or more crews making field purchases and approve more than a handful of buys daily, this pays for itself inside the first month.

Skip it if you’re a solo operator buying everything yourself — you’re not the bottleneck, you’re the whole process. And if your purchases are wildly custom with no repeatable pattern, the rules table won’t hold; you’ll spend more time maintaining exceptions than you save.

The first concrete step, today: pull your last 60 days of material receipts and find the dollar line where 75% of them fall below it. That single number is the foundation of the whole workflow — and it’s already sitting in your accounting tool. Build the form next, wire the routing after, and you can have crews unblocked at the counter inside a weekend.