# Find completed ServiceM8 jobs that were never invoiced

> Every Monday at 8am, get a Slack list of finished ServiceM8 jobs with no invoice in Xero, ranked by dollar value with your total exposure at the top.

- Workflow type: agent
- Services: ServiceM8, Xero, Slack
- Categories: Finance, Operations
- Published: 2026-08-09

## What it does

- Sweeps your ServiceM8 jobs every Monday morning for work sitting in completed or work done statuses, using your own status names rather than a fixed list
- Adds up the parts and labour on each job, the hours actually logged on site, and anything already paid, so you can see what the job is really worth
- Checks Xero to confirm whether an invoice genuinely exists for that client, because an invoice raised straight into Xero makes a job look unbilled when it is not
- Posts a single Slack message ranked by dollar value with your total unbilled exposure at the top, skipping anything finished in the last three days

## What you'll need

- A ServiceM8 account you can connect, with access to jobs, materials, time entries, payments, and clients
- A Xero organisation you can read invoices from
- A Slack workspace and a channel where the weekly list should land

## Prompt

Every Monday at 8am, hunt down work my ServiceM8 account has finished but never billed, and post a recovery list to Slack.

Start with List Job Queues in ServiceM8 so you know how my job statuses are actually named, and work out which queues represent completed or work done states rather than assuming a fixed set of names. Then use List Jobs and keep only the jobs sitting in those queues. Ignore any ServiceM8 record whose active field is 0, because deletes in ServiceM8 are soft and inactive records still come back over the API, so without that filter you will report on deleted jobs. Also exclude anything completed in the last three days, so I am not chasing paperwork that is still legitimately in progress.

For each remaining candidate job, pull the detail. Use List Job Materials for the value of the parts and labour lines, List Job Admin Activities for the hours actually logged on site, and List Job Payments to see what has already been received against that job. Use List Clients to resolve the client name for each job so it can be matched in the accounting system and read properly in the summary.

Cross-check every candidate against Xero before reporting it. Call List Invoices and look for an invoice for that client that plausibly covers the job, matching on the client name and on any job number or reference carried on the invoice. This step is the point of the whole workflow: a job can look unbilled in ServiceM8 while the invoice was actually raised straight into Xero. Drop any job where a real invoice exists. If a match is ambiguous, keep the job on the list but flag it as uncertain and say why, rather than silently dropping it.

Post the result to Slack with Send a Message as one message. Put the total unbilled exposure at the top, then list the jobs ranked by dollar value, highest first. For each job show the client name, the job number, the date it was completed, the value of materials and labour, the hours logged on site, anything already paid, and the remaining amount at risk. If nothing qualifies, still post a short message confirming the check ran and that everything completed is accounted for.

Keep the scope tight: this is about work that was never billed at all, not about chasing payment on invoices that have already been issued. Nothing should be sent to clients and nothing should be created or edited in ServiceM8 or Xero. Both systems are read only here, and the output is an internal recovery list for me.

## How to customize

- Change the timing, for example a daily check instead of every Monday at 8am
- Widen or shorten the three day grace period so work in progress is not flagged too early
- Set a minimum dollar value so small jobs stay off the list, or send it to a different channel or a direct message

## FAQ

### What counts as a finished job?

It reads your ServiceM8 job statuses first, so it works with whatever you have called them. Anything sitting in a completed or work done style status is treated as a candidate, then filtered from there.

### Will it flag jobs I already invoiced directly in Xero?

No. That is the main reason it looks at Xero at all. Before a job appears on the list it checks whether an invoice for that client genuinely exists, so work billed straight out of Xero does not show up as missing.

### Does it change anything in ServiceM8 or Xero?

No. It only reads from both systems and posts the summary to Slack. Nothing is invoiced, edited, or sent to your clients.

### Why does it ignore jobs finished in the last three days?

Recently finished work is often still being written up, so flagging it creates noise. The three day buffer keeps the list to work that really has slipped through, and you can change it.

### How is the dollar value worked out?

It combines the parts and labour lines on the job with the hours logged on site, then subtracts any payments already received, so the number you see is the amount still at risk.

Use this prompt in General Input: https://www.generalinput.com/prompts/find-completed-servicem8-jobs-that-were-never-invoiced