# Find the services you're underpricing in your Jobber price book

> Open one screen to see how every service in your Jobber price book actually performed: how often it sold, what you charged, and where prices swing.

- Workflow type: app
- Services: Jobber, Google Sheets
- Categories: Finance, Operations
- Published: 2026-08-24

## What it does

- Lists every service in your price book alongside how many times it sold, what it brought in, the average price you charged, and the gap between the cheapest and most expensive time you billed it.
- Opens any service to show every job that included it, the price each client paid, the hours your crew logged against it, and the materials that went into it.
- Flags in red any service falling below the target margin you set, using your own hourly labor costs and the time and materials those jobs actually consumed.
- Hands a service off to a background assistant that reviews recent jobs, writes back a plain English pricing recommendation, and leaves a note on a matching quote.

## What you'll need

- A Jobber account with your products and services saved in the price book
- Invoices and quotes in Jobber covering the period you want to review
- Timesheets and expenses recorded against jobs, if you want the margin flags to be accurate
- A Google account, only if you want to export the table to a spreadsheet for your bookkeeper

## Prompt

I run a home service business on Jobber and I want an internal app for reviewing my pricing. Jobber's own reporting cannot break revenue down by service type or drill into individual items, so I want one screen that treats each entry in my price book as the unit of analysis and shows me how it actually performed. The people using this are owners and general managers, not accountants, so keep the language plain and concrete: say 'you charged between $180 and $420 for this' rather than using statistical terms.

The main screen is a table of every saved product and service in my price book, loaded with List Products and Services. Above the table there is a date range picker that defaults to the last 90 days. For each service the row shows how many times it was sold in that range, total revenue, the average price charged, and the spread between the lowest and highest price I ever billed for it. Make the spread visually obvious, because the whole point is catching the same service going out at wildly different prices. Let me sort by any column and search by service name.

Build these numbers by walking my billing documents and aggregating their line items on the server. Use List Invoices and List Quotes filtered to the selected date range, then Get Invoice and Get Quote for the ones in range, and read each document's line items with List Line Items. Jobber exposes line items only through the nested lineItems connection on a quote, job, or invoice, so there is no way to query line items globally and the grouping has to happen in the handler. Group the line items by service name, matching them back to price book entries case insensitively and trimming whitespace. Line items that match nothing in the price book go into an 'Unmatched line items' section at the bottom of the table, so I can see revenue that is not coming from a standard service. Revenue should come from invoices; quotes are only what I proposed, so keep quoted amounts in their own column rather than adding them to invoiced revenue.

There is a settings panel where I set a target margin percentage and an assumed hourly labor cost for each team member, and both persist between sessions. Build the team member list from the people who appear on timesheet entries, since List Time Sheet Entries returns the team member on each entry, and enrich each distinct person with Get User for their name and role. Include a default hourly cost that applies to anyone I have not set individually. Any service whose estimated margin falls below my target gets flagged in red in the table.

Estimate margin per service like this: revenue is what I invoiced for that service, labor cost is the hours logged against the jobs that included it multiplied by each team member's hourly cost, and materials cost is the expenses booked to those jobs. When a job includes several services, split that job's labor and expenses across its services in proportion to their line item revenue, and label the result as an estimate so I know it is apportioned rather than exact.

Clicking a service opens a detail view listing every job that included it, using List Jobs and Get Job. Each row shows the client, the date, the price charged for that service on that job, the labor hours logged against the job from List Time Sheet Entries, and any materials booked to it from List Expenses. Sort this list by price so the cheapest and most expensive instances of the same service sit at opposite ends, and always show the client name, because seeing the same service billed at very different prices across customers is the main thing I am trying to catch.

Each service detail view has a 'Review this service' button that kicks off a background agent. The agent samples the recent jobs that used the service, compares what I quoted and invoiced against the labor hours and expenses those jobs actually consumed, works out whether the current price clears my target margin, and writes a plain English pricing recommendation: whether to raise the price, tighten the scope, or stop discounting it for particular clients. Save that recommendation back into the app and show it on the service detail view with the date it was generated, so I can come back to it later. The agent should also pick one representative quote that used the service and leave a short note on it with Create Quote Note, so the reasoning is visible in Jobber next to the actual work. Show the agent's progress while it runs, and keep the previous recommendation visible until the new one lands.

Add an 'Export to Google Sheets' button that sends the current view, respecting the selected date range and any sorting or filtering I have applied, to a Google Sheets tab using Append Values, so I can hand it to my bookkeeper. Include a header row and a timestamp on the export.

Pulling every invoice and quote with their line items is a lot of requests, so cache the aggregated results per date range instead of refetching on every page load, show a 'last refreshed' timestamp with a manual refresh button, and page through results politely. Jobber charges by query complexity and deeply nested queries are expensive, so keep the nesting shallow and paginate rather than requesting everything at once. Show a clear loading state on first build of a date range, since that pull can take a while.

## How to customize

- Pick any date range for the table, and change your target margin percentage whenever you want
- Give each team member their own hourly cost, or apply one blended rate across the whole crew
- Choose which spreadsheet and tab the export lands in

## FAQ

### Will this change any of my prices or records in Jobber?

No. The app only reads your price book, invoices, quotes, jobs, timesheets and expenses. The single exception is the review assistant, which leaves a short note on one representative quote so its reasoning is visible next to the actual work. Your prices, invoices and quotes are never edited.

### How is this different from the reports already in Jobber?

Jobber's built-in reporting covers totals like revenue, jobs completed and outstanding invoices, but it does not break revenue down by service type or let you drill into individual items. This app treats each entry in your price book as the unit of analysis, so you can see one service across every customer who bought it.

### What if my team does not log timesheets or expenses?

You will still get the sales counts, revenue, average price and the high to low price spread for every service, which is where most of the value sits. The margin flags depend on logged hours and expenses, so without them the app shows the pricing picture and leaves the cost side blank rather than guessing.

### Can I look at a full year, or just a quarter?

Any date range you pick. Most owners run it quarterly. Longer ranges pull more invoices and quotes so the first load takes longer, and the app remembers the results and shows you when they were last refreshed.

### Do I have to connect Google Sheets?

No, it is optional. Connect it only if you want the one click export that sends the current table to a spreadsheet tab for your bookkeeper.

Use this prompt in General Input: https://www.generalinput.com/prompts/find-the-services-youre-underpricing-in-your-jobber-price-book