Building a Working Invoice System in Sheets
I spent about three weeks trying to get a Google Sheets Invoice Template to actually behave like a real invoicing tool instead of just a pretty spreadsheet that breaks when you move one cell. Most free templates you find online are functional in the simplest cases and completely fall apart the moment you need to handle a second tax rate or split a payment across two months. Start with a blank sheet rather than downloading one of those pre-built templates from Google's template gallery. The built-in ones have hardcoded cell references that make customization a nightmare. Your invoice needs a header section with your business info, a client section, a line items table, a totals section, and a notes area. That's it. The line items table should have columns for description, quantity, unit price, and line total. Use this formula in the line total column:
=B2*C2*D2 where B is description (text, no formula needed there), C is quantity, and D is unit price. Drag that formula down. Don't manually type each line total because you will forget to update one and then wonder why your invoice doesn't balance.
Setting Up the Totals Section
For the subtotal, use SUM on your line total column. Keep it simple: =SUM(E2:E100) Even if you only have five line items, reference up to 100. It costs nothing and saves you from editing formulas later when the invoice grows.
Get the Full Details

Tax calculation is where most people go wrong. The default templates assume a single flat tax rate. If you deal with different tax situations, you need a separate cell for the tax rate and a formula that references it: =F2*F4 Where F2 is your subtotal and F4 is your tax rate cell containing something like 0.08 for 8 percent. This way you can change the rate once instead of hunting through multiple cells.
The Problem I Ran Into With Recurring Invoices
I was managing monthly retainers for about twelve clients and realized I was copying and pasting the same invoice structure over and over. Each copy had its own set of formulas that kept breaking because the row references got misaligned during the paste. Eventually I stopped creating separate sheets for each invoice and started using a single master sheet with a data validation dropdown for the client name. When you select a client, INDEX and MATCH pull the right address and rate automatically. The actual invoice layout sits on a separate tab that references the master data. It took me two days to set up properly, but it cut my invoicing time from about 45 minutes per client per month down to roughly 8 minutes. Merging cells in your line items area. This sounds fine until you need to sort or filter, which you will. Merged cells break sorting and make conditional formatting unreliable. Keep every cell separate and use formatting to make it look grouped instead. Hardcoding values instead of referencing cells. If you type 15 instead of referencing a cell that contains 15, you've created a maintenance problem. When your rate changes, you'll have to find every instance. Reference cells. Always.
Forgetting about date formatting. Sheets treats dates as serial numbers internally. If you're doing anything with due dates or aging, make sure your date cells are actually formatted as dates and not text. I once had an invoice where the due date was stored as text and the DAYS function returned a #VALUE! error that I spent two hours tracking down because the cell looked perfectly normal.

Advanced: Conditional Formatting for Payment Status
Add a column for payment status and use conditional formatting based on a formula rather than a fixed value. This lets you change the status label without breaking the formatting rule. Set it to highlight cells green when the status says Paid, yellow for Pending, and red for Overdue. The formula for the conditional format should reference the status cell in that same row, not an absolute reference to one specific cell. When you're ready to send the invoice, use File > Download > PDF. Don't send the raw spreadsheet unless the client specifically asks for it. PDFs lock the formatting and prevent accidental edits. If you need to send editable versions for review, use the share settings carefully and set permissions to Commenter rather than Editor unless you trust the recipient not to restructure your formulas. There's no perfect out-of-the-box solution in Sheets for automated invoice numbering across multiple clients. You can build a simple auto-increment system using a counter cell and the ROW function, but it gets fragile if rows are ever deleted. Most people I work with just accept manual numbering and keep a separate log sheet to track invoice numbers. It's not elegant but it works reliably.
Google Sheets Invoice Template
If you want something to start from rather than building from scratch, the template structure I described above is straightforward enough to recreate in under an hour. The key difference between a template that works and one that doesn't comes down to whether the formulas are flexible enough to handle real-world changes without breaking. Test it by changing a quantity, a rate, and a tax percentage before you put it into production. If anything breaks during that test, fix it now rather than discovering it while chasing a payment.