Templates › Business and freelance
Job Quotes & Margin Tracker
Made for builders, electricians, plumbers and other trades.
A workbook for a tradesman: record every quote with its customer, labour hours and rate, materials and quoted price; see the margin made on each job and the win rate on quotes. The summary carries a chart that redraws itself as you type.
- Tabs
- 4
- Columns
- 36
- Fill themselves in
- 28
£7one payment, yours to keep
- Opens in Excel, Google Sheets and Numbers
- Delivered straight away
- No macros, nothing to install
- Change it free before you buy
Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.
Everything inside, before you pay
This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 1,450 rows.
Customers
| Column | Type | Worked out as |
|---|---|---|
| Customer | text | |
| Contact | text | |
| Phone | text | |
| text | ||
| Type | choice (list) | |
| Town / Area | text | |
| Quotes Sent | number | IF(ISBLANK([customer_name]), "", COUNTIF([Quotes!customer], [customer_name])) |
| Jobs Won | number | IF(ISBLANK([customer_name]), "", COUNTIFS([Quotes!customer], [customer_name], [Quotes!status], "Won")) |
| Value Won | currency | IF(ISBLANK([customer_name]), "", ROUND(SUMIFS([Quotes!quoted_price], [Quotes!customer], [customer_name], [Quotes!status], "Won"), 2)) |
| Notes | text |
Quotes
| Column | Type | Worked out as |
|---|---|---|
| Quote No | text | |
| Date Quoted | date | |
| Customer | choice (from Customers › customer_name) | |
| Job | text | |
| Job Type | choice (list) | |
| Status | choice (list) | |
| Labour Hours | number | |
| Hourly Rate | currency | |
| Labour Cost | currency | IF(ISBLANK([quote_ref]), "", ROUND([labour_hours] * [hourly_rate], 2)) |
| Materials Cost | currency | IF(ISBLANK([quote_ref]), "", ROUND(SUMIF([Materials!quote_ref], [quote_ref], [Materials!line_cost]), 2)) |
| Other Costs | currency | |
| Total Cost | currency | IF(ISBLANK([quote_ref]), "", ROUND([labour_cost] + [materials_cost] + [other_costs], 2)) |
| Price Quoted | currency | |
| Margin | currency | IF(ISBLANK([quote_ref]), "", ROUND([quoted_price] - [total_cost], 2)) |
| Margin % | percent | IF(ISBLANK([quote_ref]), "", IFERROR([margin_value] / [quoted_price], 0)) |
| Effective £/Hour | currency | IF(ISBLANK([quote_ref]), "", IFERROR(([quoted_price] - [materials_cost] - [other_costs]) / [labour_hours], 0)) |
| Decided On | date | |
| Notes | text |
Materials
| Column | Type | Worked out as |
|---|---|---|
| Quote No | choice (from Quotes › quote_ref) | |
| Date | date | |
| Item | text | |
| Supplier | text | |
| Qty | number | |
| Unit Cost | currency | |
| Line Cost | currency | IF(ISBLANK([item]), "", ROUND([quantity] * [unit_cost], 2)) |
| Notes | text |
Summary
| Measure | Worked out as |
|---|---|
| Quotes recorded | COUNTA([Quotes!quote_ref]) |
| Quotes still awaiting a decision | COUNTIF([Quotes!status], "Quoted") |
| Value out with customers | ROUND(SUMIF([Quotes!status], "Quoted", [Quotes!quoted_price]), 2) |
| Jobs won | COUNTIF([Quotes!status], "Won") |
| Jobs lost | COUNTIF([Quotes!status], "Lost") |
| Win rate | IFERROR(COUNTIF([Quotes!status], "Won") / (COUNTIF([Quotes!status], "Won") + COUNTIF([Quotes!status], "Lost")), 0) |
| Total value quoted (all quotes) | ROUND(SUM([Quotes!quoted_price]), 2) |
| Value of work won | ROUND(SUMIF([Quotes!status], "Won", [Quotes!quoted_price]), 2) |
| Cost of work won | ROUND(SUMIF([Quotes!status], "Won", [Quotes!total_cost]), 2) |
| Profit on work won | ROUND(SUMIF([Quotes!status], "Won", [Quotes!quoted_price]) - SUMIF([Quotes!status], "Won", [Quotes!total_cost]), 2) |
| Average margin on work won | IFERROR((SUMIF([Quotes!status], "Won", [Quotes!quoted_price]) - SUMIF([Quotes!status], "Won", [Quotes!total_cost])) / SUMIF([Quotes!status], "Won", [Quotes!quoted_price]), 0) |
| Average job value won | IFERROR(SUMIF([Quotes!status], "Won", [Quotes!quoted_price]) / COUNTIF([Quotes!status], "Won"), 0) |
| Labour hours on work won | SUMIF([Quotes!status], "Won", [Quotes!labour_hours]) |
| Profit per labour hour on work won | IFERROR((SUMIF([Quotes!status], "Won", [Quotes!quoted_price]) - SUMIF([Quotes!status], "Won", [Quotes!total_cost])) / SUMIF([Quotes!status], "Won", [Quotes!labour_hours]), 0) |
| Jobs won at under 10% margin | COUNTIFS([Quotes!status], "Won", [Quotes!margin_pct], "<0.1") |
| Quotes sent this year | COUNTIFS([Quotes!date_quoted], ">=" & DATE(YEAR(TODAY()), 1, 1)) |
| Quotes sent in the last 30 days | COUNTIFS([Quotes!date_quoted], ">=" & TODAY() - 30) |
| Materials spend recorded | ROUND(SUM([Materials!line_cost]), 2) |






