How to Track Profit Per Project as a Freelancer (Free Template Inside)

Building a profit-per-project tracker doesn't require accounting software. A Google Sheet with the right structure will do everything except read your receipts for you. Below is the exact structure I used for two years before building Hustlay — copy it, paste it into a sheet, and you're running.
The template has three tabs: Transactions (every row is one dollar in or out), Projects (the dimension table), and P&L (the pivot that reads the first two). You'll update the Transactions tab daily; the P&L tab updates itself.
Tab 1: Transactions
One row per payment received, expense paid, or hour logged:
| Date | Project | Type | Amount | Category | Notes |
|---|---|---|---|---|---|
| 2026-04-02 | Consulting — Acme | income | $1,800 | Services | Invoice #14 |
| 2026-04-03 | Consulting — Acme | expense | -$14 | Software | Figma monthly |
| 2026-04-04 | Shared | expense | -$55 | Internet | Comcast |
| 2026-04-05 | Etsy shop | income | $234 | Sales | Payout week 14 |
| 2026-04-05 | Etsy shop | expense | -$82 | Materials | Paper + ink |
| 2026-04-06 | Consulting — Acme | hours | 4 | Time | Strategy doc |
Keep it strict: every row must have a project. "Shared" counts as a project for the purposes of allocation, but never leave the column blank. Rows with blanks get dropped from the pivot.
The Type column takes one of three values: income, expense, hours. Amounts for income are positive; for expenses, negative; for hours, a count (no dollar sign).
Tab 2: Projects
One row per project. This is your dimension table — the P&L joins on project name, so the names must match exactly (including "Shared").
| Project | Type | Target hourly | Active |
|---|---|---|---|
| Consulting — Acme | Client | $150 | Yes |
| Etsy shop | Ecommerce | $40 | Yes |
| Newsletter | Content | $60 | Yes |
| Shared | Overhead | Yes | |
| Consulting — Old Client | Client | $120 | No |
The "Target hourly" column is what you want your profit per hour to be on this project. The P&L tab shows you the gap between target and actual. That gap is where all the useful conversations with yourself happen.
Tab 3: P&L — the math
Sort the Projects list, then for each row compute these formulas against the Transactions tab:
- Revenue:
=SUMIFS(Transactions!D:D, Transactions!B:B, A2, Transactions!C:C, "income") - Direct expenses:
=-SUMIFS(Transactions!D:D, Transactions!B:B, A2, Transactions!C:C, "expense") - Hours:
=SUMIFS(Transactions!D:D, Transactions!B:B, A2, Transactions!C:C, "hours")
That gives you per-project totals excluding shared overhead. Now the allocation step:
The shared cost allocator
Two cells at the top of the P&L sheet:
- Total shared overhead (pulled from the Shared row's "Direct expenses").
- Total hours across active projects (SUMIFS on hours, excluding Shared row).
Then add an "Allocated overhead" column per project:
= $TotalSharedOverhead * (ProjectHours / $TotalActiveHours)That's the hours-weighted split. If your overhead scales with revenue instead (merchant accounts, accountant fees), swap ProjectHours for ProjectRevenue and TotalActiveHours for TotalActiveRevenue.
Net profit per project is then Revenue − DirectExp − AllocatedOH. Profit per hour is NetProfit ÷ Hours. Margin is NetProfit ÷ Revenue.
A filled-in example
Month: April. Active projects from the Projects tab. Shared overhead for the month: $890. Total active hours: 148.
| Consulting | Etsy | Newsletter | |
|---|---|---|---|
| Revenue | $7,200 | $940 | $280 |
| Direct expenses | $58 | $410 | $0 |
| Hours | 60 | 72 | 16 |
| Allocated overhead | $361 | $433 | $96 |
| Net profit | $6,781 | $97 | $184 |
| Margin | 94% | 10% | 66% |
| Profit / hour | $113 | $1.35 | $12 |
| Target / hour | $150 | $40 | $60 |
| Gap | -$37 | -$39 | -$48 |
Three useful observations from the filled-in sheet:
- Consulting is the only profitable project in absolute terms, but even it's $37/hr short of the target rate. The client-work conversation: raise rates or move admin time out of billable scope.
- Etsy looks technically profitable ($97) but at $1.35/hr it's a hobby, not a business. Ignore the margin; look at the profit-per-hour.
- Newsletter is the closest to target and has a healthy margin. The problem is scale — 16 hours can't move the bottom line much. Worth examining whether to grow it or park it.
Habits that keep the template honest
- Enter transactions the day they happen. Not at end-of-month. Memory decay + receipt loss = your sheet lies to you.
- Log hours daily. Pick a time tracker (Toggl, Clockify, your phone's stopwatch app). Dump totals into the sheet once a week.
- Reconcile monthly. Total income in the sheet should match bank deposits minus platform fees. If it doesn't, something's miscategorized.
- Don't change the allocation method mid-year. Pick one (hours or revenue) in January, keep it through December. The comparability of month-over-month numbers is worth more than any minor precision gain from switching methods.
When to graduate from a spreadsheet
The spreadsheet version holds up well through maybe 5 active projects and 200 transactions/month. Past that, four things start to break:
- Receipt entry becomes the dominant time cost (20+ min/week)
- Multi-currency conversions require a lookup that won't stay current
- Shared cost allocation across 5+ projects means updating formulas in 15+ cells every month
- Sharing the sheet with an accountant requires hours of reformatting
If you're hitting any of those, it's time. Hustlay's 7-day Pro trial imports the same three tables from a CSV export of your sheet, so you don't lose history. Most freelancers cross this threshold between year 2 and year 3.
Related: if you want the theory behind why this is the right structure for multi-stream freelancers, read the pillar guide on profit per project.