🧾 Bill It Before You Leave the Roof: Invoicing Is In the App Now
You finish the job, you close the work order, and then the money part happens somewhere else — a notepad in the truck, a spreadsheet on Sunday night, a number half-remembered by the time anybody types it. There is now an Invoices section in the app and on the dashboard. It builds the bill out of the hours and parts already logged on the job, it prints with your logo on it, it records payments including partial ones, and it tells you what is still owed. It is free to use in the app. Here is exactly what it does, and — the part worth reading twice — exactly what it does not.
The old Maintenance Invoice report is gone. It was a text-only PDF built out of a report picker, it had no number that stayed the same between the screen and the printout, and it had no idea whether anybody had paid. It is deleted from the app and from the dashboard, and what replaced it is a real invoice with a real life cycle.
This is written for the person who actually presses the buttons. Every control name below is the label on the screen, not a description of it.
Where it lives
On the phone, INVOICES is the fifth item in the Workflow bar along the bottom, beside ORDERS, CALENDAR, PM and TEAM. There is also a tile on the home screen under WORKFLOW, reading Invoices — "Bill a finished job & track what is owed".
On the web dashboard there is an Invoices button in the header and a Go to Invoices entry in the command palette.
It carries no PRO chip, and that is deliberate rather than an oversight. None of the other Workflow tiles has one, and this one is not gated either.
Three ways to start one
Finish a work order and the success alert that already appeared now has a CREATE INVOICE button on it. If you dismissed that alert, or the job was completed last week, there is a CREATE INVOICE action button on the work order itself. Complete a PM visit and the same button is on that alert. If the job has already been billed once, the button reads CREATE A SECOND instead, so a genuine second bill is possible and an accidental duplicate is not.
From scratch: open INVOICES and tap the green + in the top bar. The empty state names both routes — "Finish a work order or a PM and tap CREATE INVOICE, or start one here with the + button."
The dashboard puts all three on the page as buttons: + NEW INVOICE, FROM WORK ORDER and FROM PM.
Both job types run through one converter. That matters more than it reads: the dashboard used to total an invoice by adding up the cost field on each log while the phone billed hours times rate plus materials, and one customer could receive both numbers for the same visit.
The numbers come off the job, not out of your head
Work orders and PM completions now carry a BILLING DETAILS section. It holds LABOR HOURS, RATE ($ / HOUR), PARTS / MATERIALS COST ($) and PARTS & MATERIALS USED.
It is closed by default. A tech logging a filter change should not have to scroll past four money boxes to reach the notes field. It opens itself when there are already figures stored, so a job that has been priced does not hide the pricing behind a chevron.
Leave the rate blank and the hours bill at your Settings rate — the field shows that rate as its placeholder rather than writing a copy of it onto the job, so raising the shop rate next month still reaches the jobs nobody priced by hand. If there is no rate in either place, the section says so in plain words rather than quietly billing zero.
A PM completion used to record no money at all — four empty columns and, later, a blank invoice with nothing on it to bill. The billing section is now on the PM completion sheet on both the phone and the dashboard, so the visit records what it cost while somebody still remembers.
- ▸ On a work order, the amend control reads ADD BILLING when there are no figures yet and EDIT BILLING when there are. It is on both the phone and the dashboard, beside the log it edits.
- ▸ On the phone PM list the same thing is an unlabelled $ icon on the row, sitting next to the invoice button on purpose. On the dashboard it opens a modal titled Billing details with a Save billing button.
- ▸ Amending touches the five billing columns and nothing else. The completion date does not move, the schedule does not recalculate, and the job does not have to be reopened to correct a number.
- ▸ If the log you are editing is already named on an invoice, the app tells you which one — because an issued document does not restate itself underneath a customer who is already holding it.
Who you are billing
The BILL TO card has four chips: SITE, OWNER, TENANT and TYPE IT IN. Site is the building. Owner is the property owner on the building record. Tenant asks WHICH UNIT, and is greyed out on a location that has no units on it. TYPE IT IN is for the one-off — a management company, a warranty carrier, somebody whose address you are never going to need again. A typed address prints on that invoice and is not written back to the location.
If the building has no address at all, the card says NO ADDRESS ON THIS LOCATION and offers both honest options rather than one: ADD TO SITE INFO, which fixes the record for every future job, or USE ON THIS INVOICE ONLY, which does not.
The labor rate belongs to the invoice
Each invoice carries its own rate, in a box labeled LABOR RATE FOR THIS INVOICE ($/HR) on the phone and Labor rate for this invoice ($/hr) on the dashboard. It is seeded from DEFAULT LABOR RATE ($ / HOUR) in Settings when the invoice is raised — copied onto it, not read through it — so raising the shop rate next month cannot re-price a draft that has been sitting on a desk, and certainly cannot restate an invoice that has already gone out.
Change the rate on an invoice and only the labor lines still sitting at the old rate move. A line you priced by hand keeps the price you gave it.
A blank rate box and a rate of zero are two different instructions, and the app keeps them apart. Blank means this invoice has no rate of its own and you type each line. Zero means this invoice bills labor at nothing, and it is never quietly replaced by the shop rate. Type something the box cannot read — 125/hr, or a typo — and it is refused with a message, rather than read as an empty box and silently wiping the rate you had.
On the dashboard there is no Settings screen, so the same defaults live behind a DEFAULTS button on the Invoices page.
Issuing, and the number
A draft is a draft. ISSUE INVOICE is what turns it into a document, and that is the moment the number is minted — INV-2026-0004, with your own prefix if you changed it in Settings — and the moment the totals are frozen onto the row. The number is computed once and stored, so the number on the screen and the number on the PDF are the same number. In the old report they were two independently generated timestamps.
UNISSUE — BACK TO DRAFT exists for the invoice you issued and had not sent yet. It keeps the number: once a number is spent, it stays spent.
VOID INVOICE is what you use on one that did go out. A void keeps its number for ever, and the PDF the phone produces for it is headed VOID — NOT PAYABLE. DELETE VOIDED INVOICE then removes the record itself if you want it out of the list, and the number still will not be reused. Gaps in the sequence are evidence that something was voided, which is the one thing a numbered document series exists to make impossible to hide.
One honest wrinkle for teams: there is no server counter behind the sequence, so two people issuing offline in the same year can both mint INV-2026-0008. The app does not silently renumber one of them, because one of those numbers is already on a customer desk. It puts a DUPLICATE NUMBER flag on every row carrying that number, on the phone and on the dashboard, with a line naming the number and how many invoices are on it, and tells you to void the one that has not been sent and raise it again.
Getting paid, and knowing who has not
+ RECORD PAYMENT opens a sheet asking for the amount, the date and the method: CASH, CHECK, CARD, ACH or OTHER. Check, card and ACH ask for a reference — a check number, the last four, an auth code — because those are the three you will be asked about later.
Part payments are the normal case here, not an edge case. Somebody pays half now and half on the thirtieth; you record both, and the balance is worked out from the payments every time it is shown rather than stored in a column that can drift out of step with them. A payment entered by mistake is voided rather than deleted, so the correction stays visible.
The INVOICES list opens on TOTAL OUTSTANDING, the largest number on the screen, with the overdue figure under it. Below that, the invoices are grouped: OVERDUE, PART PAID, SENT, ISSUED, DRAFT, PAID and VOID, with PAID and VOID collapsed because they are not what you opened the screen to look at. Each row says what it is — outstanding, settled, or overpaid by whatever the difference is.
Getting it to the customer
On the phone, SHARE PDF hands the finished document to the share sheet, so it goes wherever you already send things from — mail, messages, a cloud folder, a printing app. On Android there is also SAVE PDF TO DEVICE, which writes it into a folder you pick. That one is Android only; on an iPhone the app says so and points you at SHARE PDF, rather than doing nothing.
On the dashboard the button reads PRINT / SAVE PDF and opens the browser print dialog, which is where save-as-PDF lives on a desktop.
The document carries the company header from Settings — Company Profile, which is free on every plan. Logo, company name, your name and title, phone and email: whatever you filled in there heads every invoice you make.
MARK SENT is a stamp you apply, not a send. It records that the invoice left, so the list can tell an invoice you have chased from one you have not. Nothing is transmitted by pressing it.
What this is not
This is the section that decides whether the app is right for you, so it is not buried at the bottom of a pricing page. Everything in the left column below is genuinely absent from the code, not merely unfinished.
If two or more of those are things you need every day, buy a field service platform instead. That is not modesty, it is arithmetic: software that gets you 80% of the way through a billing workflow and stops is worse than software that goes the whole way, and a roof is an expensive place to find that out.
| Not in the app | What actually happens |
|---|---|
| Payment processing | Recording a payment is bookkeeping. No money moves, and no payment gateway is contacted. |
| Card capture | There is no field anywhere that takes a card number. CARD is a chip meaning they paid by card, and the reference box is for the last four or an auth code you type. |
| QuickBooks or Xero sync | There is no accounting integration of any kind. What comes out of an invoice is a PDF. |
| Recurring or automatic billing | Every invoice is raised by a person, from a job, a PM visit or the + button. PM schedules recur; the invoice raised from one does not. |
| Credit notes | A mistake is voided, not credited. VOID INVOICE and VOID PAYMENT are the only two retraction verbs. |
| Emailing from inside the app | The phone hands the PDF to the share sheet; the dashboard prints. Neither one sends mail on your behalf. |
| Dispatch, routing, quotes and estimates | None of these exist. There are work orders, PM schedules, a calendar, a team and now invoices. |
Who on the crew can bill
Billing is done by the owner and by managers. A technician cannot create, edit, issue, void or take payment on an invoice, and that refusal is written into the database security rules rather than being a hidden button — a modified app gains nothing by drawing the screen. The Invoices item is also kept off their Workflow bar, because a tab that leads to a screen of refusals is not a feature. What a technician does is the part the invoice is built out of: the hours, the parts and the materials on the work order or the PM.
The refusal says exactly that rather than a generic denial: "Invoicing is handled by the owner and by managers... Record your hours, the parts you used and any materials on the work order or the PM — that is what the invoice is raised from. Nothing has been changed."
A Viewer on a workspace can look at invoices but cannot change one, which is what read-only access has always meant here.
Free, Pro, and what happens with no signal
Raising an invoice, issuing it, printing it and recording payment on it are free in the app. There is no credit, no counter and no paywall in front of any of it.
Two things around it are Pro, and both were Pro before invoicing existed. Cloud sync is Pro, so on a free account your invoices live on that phone. And the web dashboard is Pro in its entirety — the invoice screens sit behind the same gate as the dashboard, work orders, team and reports.
Invoicing itself works with no signal. The rows are in the on-device database, the totals are arithmetic, and the PDF is rendered on the phone. You can build and issue an invoice in a basement and share it when you surface.
The AI features are the opposite, and it is worth being blunt about that because the changelog has had to correct this exact claim before. Nameplate scanning, condition assessment, invoice scanning and diagnostics all call Google Gemini and need cellular or Wi-Fi. Only core data tracking — records, logs, photos, barcode and QR search, and now invoicing — is genuinely offline.
Ten minutes, on a job you already finished
The fastest way to judge this is to bill a real job you closed last week rather than a made-up one. Nothing here has to be sent to anybody.
Put a rate in Settings
Settings, then DEFAULT LABOR RATE ($ / HOUR). While you are there, fill in Company Profile — the logo and company details there head every invoice, on any plan. On the dashboard the same defaults sit behind the DEFAULTS button on the Invoices page.
Price the job
Open a completed work order and use ADD BILLING on the log. Hours, a rate if it is not your default, parts and materials cost. The job does not have to be reopened and its completion date does not move.
Raise the invoice
Tap CREATE INVOICE on the work order. The lines are already there. Choose SITE, OWNER, TENANT or TYPE IT IN on the BILL TO card, then ISSUE INVOICE to mint the number.
Share it, then take a payment
Use SHARE PDF and send it to yourself, so you see what the customer sees. Then + RECORD PAYMENT for half of it and go back to the list: the invoice moves to PART PAID and TOTAL OUTSTANDING drops by exactly what you entered.
Frequently Asked Questions
Do I need Pro to invoice?
No. Raising, issuing, printing and recording payment on an invoice is free in the app. Two things around it are Pro and both were Pro already: cloud sync, so on a free account your invoices stay on that phone, and the web dashboard, whose invoice screens sit behind the same gate as the rest of the dashboard.
Can I take a card payment through the app?
No. There is no payment processing and no card capture anywhere in it. Recording a payment is bookkeeping: you note the amount, the date, the method and a reference. CARD means the customer paid by card somewhere else. If collecting payment inside the software is what you need, buy a field service platform that does it.
Does it sync with QuickBooks or Xero?
No. There is no accounting integration of any kind. What comes out of an invoice is a PDF — shared from the phone or printed from the dashboard.
Can I edit the hours and parts after the job is finished?
Yes, and without reopening the job. The control reads ADD BILLING or EDIT BILLING on a work order, and on the phone PM list it is the $ icon on the row. Only the billing figures change; the completion date does not move and the schedule does not recalculate. If that log is already on an invoice, the app tells you which one.
What happens to the invoice number if I void one?
It keeps it, for ever. The printed copy reads VOID — NOT PAYABLE, and you can delete the record afterwards with DELETE VOIDED INVOICE if you want it out of the list. The number is still never reused. A gap in the sequence is evidence that something was voided, which is the point of numbering documents at all.
If I change the labor rate on an invoice, does it re-price everything?
Only the labor lines still sitting at the old rate. A line you priced by hand keeps your price, and a line at $0.00 is never swept up. Parts, materials and trip charges are never touched by an hourly rate.
Can my technicians raise invoices?
No, and it is enforced by the security rules rather than by hiding a button. Billing is done by the owner and by managers. Technicians record the hours, parts and materials on the work order or the PM, which is what the invoice is built from. A Viewer can look at invoices but cannot change one.
Does invoicing work with no signal?
Yes. The invoices are in the on-device database and the PDF is rendered on the phone, so you can build, issue and share one with no bars. The AI features are the exception and always have been: nameplate scanning, condition assessment, invoice scanning and diagnostics call Google Gemini and need a connection.
What happened to the Maintenance Invoice report?
It was deleted from both the app and the dashboard. It was a text-only PDF with no stable number and no idea whether anybody had paid. Everything it was used for is now in the Invoices section, which has a number minted at issue, a bill-to block, payments and an outstanding balance.
Jonathan Curtis
HVAC Technician & Founder · Equipment Tracker Pro
Jonathan Curtis is an HVAC technician and the founder of Equipment Tracker Pro. He built the app to solve real problems he encountered in the field, including the daily frustration of faded nameplates and administrative double-entry.
Try Equipment Tracker Pro Free
Core equipment tracking is free forever. Pro features include AI nameplate scanning, condition assessment, invoice scanning, cloud sync, and more.