Monthly ServiceM8 job margin and underquoting report
Find out which job types you consistently underquote, with a month by month margin tracker in Sheets and a plain summary in Slack.
On the first business day of each month, review job profitability across the ServiceM8 jobs I completed in the month that just ended, and tell me where I am systematically underquoting. I care about the pattern far more than any single job.
Start with List Jobs in ServiceM8 and narrow to jobs that were finished inside the previous calendar month. ServiceM8 deletes are soft, so records with active set to 0 still come back over the API. Filter those out everywhere, on jobs, material lines and labour records alike, or the numbers will be wrong. Job lists are cursor paginated, so page through until you have the whole month rather than stopping at the first batch.
For each job, build the real margin rather than trusting the invoice total. Call List Job Materials for the job. Each material line carries both a charge out price and a cost price, so sum the charge out side for revenue and the cost side for what the materials actually cost me. Then call List Job Admin Activities for the same job to get the labour time actually logged against it. Convert those logged hours into a labour cost using an hourly cost rate I can set at the top of the workflow, defaulting to 75 per hour if I have not set one. Job margin is revenue minus material cost minus labour cost, and I want it as both a currency figure and a percentage.
Group the results two ways. Use List Categories to resolve each job's category so I can see margin by job type, and use List Staff Members to resolve the staff member who ran the job so I can see margin by person. Roll up average and median margin for each category and each staff member, and always note how many jobs sit behind each number, so I know which groupings are meaningful and which rest on one or two jobs.
Append one row per job to my Google Sheets margin tracker using Append Values, so margin can be trended month over month. Each row should carry the month, job number, client, job category, staff member, revenue charged, material cost, labour hours logged, labour cost, margin in currency, margin percentage, and a flag for any job where materials were logged but no labour was recorded at all. Always append rather than overwrite, so history builds up in the same sheet.
Then post a narrative summary to Slack with Send a Message. Lead with the overall picture for the month: total revenue, total cost, blended margin, and how that compares with the previous months already sitting in the tracker. Then give me the three things I actually care about. First, the job categories that consistently run over the hours I charged for, judged across the whole category rather than on a single bad job. Second, the jobs where materials were logged but no labour was recorded at all, because those jobs look artificially profitable and their real cost is unknown. Third, one concrete suggested price adjustment for the worst performing category, expressed as the percentage increase or the extra quoted hours needed to bring that category back to a healthy margin, with the arithmetic shown so I can sanity check it.
Keep the Slack message short enough to read on a phone. Call out patterns and name the categories and people involved rather than listing every job, since the per job detail already lives in the spreadsheet. If a month has too few completed jobs to say anything meaningful, say so plainly instead of inventing a trend.
Example output
What does this prompt do?
- Reviews every job you finished last month and works out what each one actually earned, after the materials it consumed and the hours your team logged against it
- Groups results by job type and by the staff member who ran the job, so you see repeatable patterns instead of one off bad jobs
- Adds a row per job to a Google Sheets tracker so margin can be trended month over month
- Posts a short written summary to Slack calling out the job types that keep running over, the jobs missing labour records, and a suggested price change for your worst category
What do I need to use this?
- A ServiceM8 account where jobs, material lines, labour time and staff are recorded
- A Google Sheets spreadsheet to act as the margin tracker
- A Slack workspace and a channel for the monthly summary
- An hourly labour cost figure for your team, so margins can be calculated from logged hours
How can I customize it?
- Change the schedule, for example run it quarterly instead of on the first business day of each month
- Set your own hourly labour cost rate and the margin percentage that counts as underquoting
- Choose which Slack channel gets the summary and whether specific people are tagged
- Narrow the review to certain job types or a single crew
FAQs
Do I need to invoice through ServiceM8 for this to work?
What if my team does not always log their hours?
Will this change anything in my ServiceM8 account?
How does it know what my labour actually costs?
Do I need a lot of job history before it is useful?
Related templates
When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.
Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.
Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.
Stop guessing which jobs actually make money.
Get a monthly read on where your quotes fall short, broken down by job type and by crew, before you price another year of work the same way.