Every freelancer has a spreadsheet. It has tabs. The tabs have formulas. Some of the formulas are broken. The “outstanding invoices” tab hasn’t been updated since March.
The spreadsheet is a tool for data analysis. It’s not a tool for running a business. When you use a spreadsheet to track your income, you’re doing data entry instead of building a system — and data entry stops happening the moment it feels like a chore.
Notion solves this differently. Instead of a grid of cells you update manually, you build a linked database system where income tracking happens as a side effect of the work you’re already doing. Create a job. Mark the invoice sent. Mark it paid. The revenue dashboard updates automatically.
Here’s how to do it.
The core concept: linked databases
The foundation of a good freelance income tracker in Notion is three linked databases:
- Clients — who you work with
- Projects / Jobs — the work you do for them
- Invoices — the money owed and paid
These three databases connect to each other. An invoice links to a project. A project links to a client. When you look at a client record, you can see every project and every invoice in one place. When you open an invoice, you can see which project it’s for and who the client is without hunting through tabs.
This is what spreadsheets can’t do cleanly. In a spreadsheet, you either maintain the same information in multiple places (and it drifts out of sync) or you build complex lookup formulas that break when you add a row.
Setting up your Clients database
Start here. Every other database links back to this one.
Minimum fields:
- Name (title field)
- Industry or niche
- Default rate (number — hourly or per-project)
- Notes (text — for anything that doesn’t fit elsewhere)
Optional but useful:
- Referral source (where did this client come from?)
- Last contact date (formula linked to most recent project date)
- Total billed to date (rollup — sums all invoice amounts)
That last one — total billed — is where the magic starts. Once your invoices database is linked to clients, Notion can calculate the lifetime value of each client automatically. You’ll see immediately who your most valuable relationships are.
Setting up your Projects database
One row per engagement. If a client hires you for three separate blog posts, those might be one project with three deliverables, or three projects — your call, based on how you invoice.
Minimum fields:
- Project name (title field)
- Client (relation — links to Clients database)
- Status (select: Brief received, In progress, Delivered, Invoiced, Paid)
- Start date, Deadline
- Rate (number — overrides the client default if the rate varies)
Optional but useful:
- Brief (text or page — capture the scope, goal, and deliverables)
- Revision count (number — track how many revision rounds this project is using)
- Notes for next time (text — what you’d do differently)
Setting up your Invoices database
One row per invoice. Link each invoice to a project and, through that project, to a client.
Minimum fields:
- Invoice number or name (title field)
- Project (relation — links to Projects database)
- Amount (number)
- Invoice date
- Due date
- Status (select: Draft, Sent, Overdue, Paid)
The status field does the heavy lifting. Filter your invoice database to show only “Sent” and “Overdue” rows and you’ve got your follow-up list. Filter to “Paid” and sum the Amount field and you’ve got your month’s income. No formulas to build — just filters.
The revenue dashboard: three views you need
Once your three databases are linked, create a dedicated revenue page with these filtered views:
Outstanding invoices — filter Invoices by Status = Sent or Overdue. This is your weekly follow-up list. If a row has been sitting here for more than 14 days past the due date, it’s time to send a reminder.
Monthly income — filter Invoices by Status = Paid and Date within the current month. Sum the Amount column. Done. Your revenue number for the month, always current.
Year to date — filter Invoices by Status = Paid and Date within the current year. Useful for estimating taxes and tracking growth.
The tax estimate problem
Most freelancers think about taxes quarterly, when estimated payments are due, and then scramble to figure out how much to send. A simple addition to your income tracker eliminates this.
Add a formula field to your Invoices database:
Tax estimate = Amount × 0.25
Adjust the 0.25 to match your effective rate. Now add a view that sums this field for all “Paid” invoices in the current quarter. That’s your estimated tax payment — always current, requires no manual calculation.
Why not just use a spreadsheet for this?
Two reasons.
Maintenance. A spreadsheet-based system requires you to update it consistently. When you forget to update it for three weeks, the data becomes stale and you stop trusting it. A Notion system that’s integrated with your actual workflow — where creating a project record is step one of every engagement — stays accurate because you’re using it, not maintaining it.
Navigation. In a spreadsheet, you navigate by scrolling and filtering. In Notion, you click through linked records. Click on a client and see their projects. Click on a project and see its invoices. Click on an invoice and see the project details. The data is the same; the experience of working with it is completely different.
Start with a free template
If building this from scratch sounds like a project, start with the Freelystack Freelance Finance Starter — a free Notion template with the three-database structure already built, sample data included so you can see how it works, and a revenue dashboard ready to go.
Download it free here — works on the free Notion plan, instant access via email.
Once you’ve got the income tracking working, the next step is adding profession-specific workflows: a shoot scheduler if you’re a photographer, a content calendar if you’re a copywriter, a deliverable tracker if you’re a designer. Those live in the full Freelystack profession packs.