Home / English

How to track freelance invoices without a subscription

Client IDs, invoice statuses, a Friday review, and a one-page invoice. A spreadsheet routine for freelancers who send a handful of bills a month.

If you invoice a handful of clients a month, another billing app is mostly a login you forget. You need four lists and a short weekly habit: who the client is, what you billed, what they paid, and which receipts still need to land on an invoice.

This is that system, written so you can build it in Excel or Google Sheets. Numbers below are an example, not a real client.

The four lists

Keep them in one file, on separate sheets.

Sheet One row is You type A formula can own
Clients One client in one currency ID, name, contact, rate, currency, active or not Nothing important
Invoices One bill Number, client, dates, amounts, status, amount received Total, balance, “overdue”
Expenses One receipt Date, category, vendor, amount, billable or not Month totals
Invoice page The PDF you send The same invoice, laid out for a human Line totals

Skip pipelines, proposals, and “maybe” columns. A maybe column becomes a second job. Put prospects somewhere else, or nowhere, until they have an invoice number.

Give every client an ID

C-014 is a better key than “the designer who pays late,” typed three different ways.

Suggested columns:

  • Client ID
  • Name
  • Contact name
  • Email
  • Default rate
  • Currency
  • Status: Active or Inactive
  • Notes

Rules that keep the totals honest:

  • One currency per row. A client who pays you in USD and EUR gets two IDs. Adding those amounts in one cell is how “outstanding” becomes a feeling.
  • Retire an ID by marking it Inactive. Don’t delete the row. Old invoices still point at it.
  • Copy the currency onto each invoice (a lookup is fine). The dashboard should filter by that column, not by memory.

XLOOKUP works in current Excel and in Google Sheets:

=IF(B2="","",IFERROR(XLOOKUP(B2,Clients!A:A,Clients!F:F),""))

If you are on an older Excel, VLOOKUP does the same job when the ID is the first column of the client table:

=IF(B2="","",IFERROR(VLOOKUP(B2,Clients!A:F,6,FALSE),""))

Column letters will differ in your sheet. The point is: the invoice row should carry the currency, so a total can refuse to mix them.

Invoice status is the whole system

Use the status column for a decision you make, not for a date the sheet can see.

Status Meaning Counts as invoiced? Counts as outstanding?
Draft Not sent No No
Sent The client has it, and it is not fully paid Yes Yes
Paid The balance reached the account you actually use Yes No

Overdue is not a fourth thing you should have to remember. It is “Sent, and the due date is before today.”

=IF(I2="","",IF(AND(I2="Sent",D2<>"",D2<TODAY()),"Overdue",I2))

Keep that in its own column, called something like Shown status. If you type Overdue on top of Sent, you lose the fact that it was sent, and a formula can’t safely write back into the cell you edit.

A practical layout:

Column Example Who fills it
Invoice number 2026-031 You
Client ID C-014 You
Issue date 2026-10-01 You
Due date 2026-10-15 You
Summary Homepage revisions, October You
Subtotal 800 You
Tax 0 You, if you charge any
Total =F2+G2 Formula
Status Sent You: Draft, Sent, or Paid
Shown status Overdue Formula above
Received 300 You, when money lands
Balance =IF(H2="","",H2-N(K2)) Formula

Color the input cells one way and the formula cells another. Yellow for typed numbers and gray for calculated ones is enough. You should be able to see, without reading a formula, which cells you are allowed to edit.

A walkthrough with one invoice

Client C-014, USD.

  1. On 1 Oct 2026 you send invoice 2026-031. Subtotal 800, tax 0, total 800, due 15 Oct 2026, received 0. Status is Sent. Shown status stays Sent until the 15th. Outstanding is 800.
  2. On 21 Oct the due date has passed. You change nothing except opening the file. Shown status becomes Overdue. Outstanding is still 800.
  3. On 28 Oct the client pays 300. You type 300 in Received. Status stays Sent, because the balance is 500. Outstanding for this invoice is 500, and it is still overdue.
  4. On 2 Nov the remaining 500 arrives. Received is 800, balance is 0. Now you change Status to Paid. Outstanding drops by 500. Paid-to-date includes the 800.

Don’t mark Paid because someone wrote “processing.” Paid means the balance is zero in the account you use.

Don’t put Draft rows into “invoiced.” A draft you might never send will make the month look better than it was.

Dashboard totals for one currency

If column M holds the currency and you want USD only:

Invoiced     =SUMIFS(H:H,I:I,"Sent",M:M,"USD")+SUMIFS(H:H,I:I,"Paid",M:M,"USD")
Paid         =SUMIFS(H:H,I:I,"Paid",M:M,"USD")
Outstanding  =SUMIFS(L:L,I:I,"Sent",M:M,"USD")
Overdue rows =COUNTIFS(J:J,"Overdue",M:M,"USD")

H is total, I is the status you type, L is balance, J is shown status. Change the letters to match your header row, and start the ranges at row 2 if you don’t want the header involved. SUMIFS ignores text in the header anyway.

Repeat the block for EUR if you have any. Two currencies, two blocks. Never one blended total.

If every client is the same currency, drop the currency condition. Don’t add it “for later” and then forget to fill the column. A blank currency drops the row out of a filtered total, and the invoice disappears from the dashboard while still being unpaid.

Number invoices so you can talk about them

YYYY-NNN, for example 2026-031.

  • Don’t reuse a number, including for a draft you abandon.
  • If you cancel one, leave the row. Set Status back to Draft only if it was never sent. Write VOID in the summary. If the client already received it, don’t pretend it was a draft. Send a credit or a new invoice and note the original number.
  • If you must correct a sent invoice, use a new number such as 2026-031-R1. Don’t quietly change the total on the copy they already have.

The printable page is a different sheet that reads one invoice number and lays it out. It is not a second log. The log stays the source of truth.

On that page, include:

  • Your name and the email you actually answer
  • Invoice number, issue date, due date
  • Who it is billed to
  • Lines: description, quantity, rate, amount
  • Subtotal, tax if any, total
  • One sentence of terms: due in how many days, how you get paid

Print to PDF from Excel or from Google Sheets. You don’t need a macro for that.

Tax is a number you type because you already know what applies. The sheet cannot know your local rule. If you don’t charge tax, leave it at 0. This file is not a tax return.

Expenses: only the ones that change an invoice

Columns that earn their keep:

  • Date
  • Category, in your own short list: software, travel, subcontract, supplies, platform fee
  • Vendor
  • Amount
  • Currency
  • Billable: Yes or No
  • Client ID, when it’s billable
  • Invoice number, filled in when you actually bill it
  • Note

A month total is a SUMIFS between two dates. The more useful check is narrower:

=SUMIFS(D:D,F:F,"Yes",H:H,"")

That is “billable, and no invoice number yet.” Those rows are money you already spent and have not asked for. Put them on the next invoice as their own line. If the original invoice was already sent, add a new invoice. Don’t edit the sent one in place.

Platform payouts

If a marketplace already shows the job as paid, decide which number you trust and stick to it.

  • Record the invoice when you bill, for the amount you expect.
  • Mark it Paid when the payout reaches your bank, not when the client clicks pay inside the platform.
  • Record the fee as an expense (category: platform fee) if you want gross and net side by side.
  • Don’t also create a second Paid invoice for the net payout. That double-counts the job.

Fifteen minutes on Friday

  1. Anyone new this week gets a client ID before an invoice number.
  2. Anything you sent is Status Sent, with a due date, the same day you send it. Waiting until month-end makes the sheet a story.
  3. Money that landed goes in Received. Status becomes Paid only when the balance is 0.
  4. Read the Overdue rows. One follow-up each. The invoice number goes in the subject, not a paragraph of apology.
  5. Receipts from the week go on Expenses. Billable rows with an empty invoice number get scheduled onto a bill.
  6. Glance at each currency block. If one outstanding invoice is more than half the total, that client gets the follow-up before you write a new proposal.

A follow-up can be short. Replace the brackets. The name here is a placeholder.

Subject: Invoice 2026-031 is due

Hi <name>,

Invoice 2026-031 for 800 USD was due on 15 October 2026.
500 USD is still unpaid.

Reply if the PDF needs to go to a different billing email.

Thank you,
<your name>

Send that once when it first becomes overdue, and once more if it is still open after another couple of weeks. Then stop new work if your agreement allows it. A third copy of the same email doesn’t become a collections process.

What this file will not do

It will not file taxes, collect a card payment, or replace bookkeeping software once several people need to edit the same books. It will not stop you mixing currencies if you type them into one total anyway.

It also won’t survive two people editing the same cloud file on a flaky connection. Keep one editor at a time, and once a month save a copy with the month in the name (invoices-2026-11.xlsx) so a bad sync doesn’t become your only history.

If you want this structure already built, the box below is a single .xlsx: a dashboard with invoiced, paid, outstanding, and an overdue count; clients with ID, contact, rate, currency, notes, and active or inactive; invoices with subtotal, tax, and total, and the statuses Draft, Sent, Paid, and Overdue; expenses with category, vendor, amount, a billable flag, and period totals; plus a one-page invoice you can print or export to PDF. No macros. It opens in Excel and in Google Sheets. It still isn’t tax advice, and it won’t collect the payment for you.

freelanceinvoicingspreadsheets