Proper Spreadsheets

Templates › Business and freelance

Side Hustle Income Tracker

Made for people earning on the side of a day job.

Record income, costs and hours for each side hustle to see which ones are worth it, with totals for this month and this tax year and a tax pot based on your chosen rate. The summary carries a chart that redraws itself as you type.

Tabs
5
Columns
23
Fill themselves in
19

£4.99one payment, yours to keep

  • Opens in Excel, Google Sheets and Numbers
  • Delivered straight away
  • No macros, nothing to install
  • Change it free before you buy

Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.

The workbook's summary and the table behind it
A row typed into the real file. Every figure that changes is the spreadsheet's own arithmetic.
The summary page, every figure calculated from the tables
The chart, drawn from the totals in the table beside it
What is inside: the tabs, the columns and what fills itself in
Where you type, and the shaded columns that work themselves out
The guide sheet that opens first and explains the file
Everything included in the download

Everything inside, before you pay

This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 1,420 rows.

Hustles

One row per side hustle. Set the tax rate you want to put aside for each; the totals fill in from the other tabs. Room for 20 rows.

ColumnTypeWorked out as
Hustletext
Statuschoice (list)
Tax Ratepercent
Total IncomecurrencyIF(ISBLANK([name]), "", SUMIF([Income!hustle], [name], [Income!amount]))
Total CostscurrencyIF(ISBLANK([name]), "", SUMIF([Costs!hustle], [name], [Costs!amount]))
ProfitcurrencyIF(ISBLANK([name]), "", [income]-[costs])
HoursnumberIF(ISBLANK([name]), "", SUMIF([Hours!hustle], [name], [Hours!hours]))
Profit per HourcurrencyIF(ISBLANK([name]), "", IFERROR([profit]/[hours], 0))
Tax Year ProfitcurrencyIF(ISBLANK([name]), "", SUMIFS([Income!amount], [Income!hustle], [name], [Income!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6)) - SUMIFS([Costs!amount], [Costs!hustle], [name], [Costs!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6)))
Tax to Set AsidecurrencyIF(ISBLANK([name]), "", ROUND(MAX([ty_profit], 0)*[tax_rate], 2))

Income

One row for each payment you receive from a hustle. Room for 400 rows.

ColumnType
Datedate
Hustlechoice (from Hustles › name)
Descriptiontext
Amountcurrency

Costs

One row for each thing you spend on a hustle. Room for 400 rows.

ColumnType
Datedate
Hustlechoice (from Hustles › name)
Categorychoice (list)
Descriptiontext
Amountcurrency

Hours

One row for each session of work on a hustle. Room for 600 rows.

ColumnType
Datedate
Hustlechoice (from Hustles › name)
Hoursnumber
Notestext

Summary

Your totals for this month and this tax year, and how much to put aside for tax.

MeasureWorked out as
Income this monthSUMIFS([Income!amount], [Income!date], ">="&(EOMONTH(TODAY(),-1)+1), [Income!date], "<="&EOMONTH(TODAY(),0))
Costs this monthSUMIFS([Costs!amount], [Costs!date], ">="&(EOMONTH(TODAY(),-1)+1), [Costs!date], "<="&EOMONTH(TODAY(),0))
Profit this monthSUMIFS([Income!amount], [Income!date], ">="&(EOMONTH(TODAY(),-1)+1), [Income!date], "<="&EOMONTH(TODAY(),0)) - SUMIFS([Costs!amount], [Costs!date], ">="&(EOMONTH(TODAY(),-1)+1), [Costs!date], "<="&EOMONTH(TODAY(),0))
Hours this monthSUMIFS([Hours!hours], [Hours!date], ">="&(EOMONTH(TODAY(),-1)+1), [Hours!date], "<="&EOMONTH(TODAY(),0))
Profit per hour this monthIFERROR((SUMIFS([Income!amount], [Income!date], ">="&(EOMONTH(TODAY(),-1)+1), [Income!date], "<="&EOMONTH(TODAY(),0)) - SUMIFS([Costs!amount], [Costs!date], ">="&(EOMONTH(TODAY(),-1)+1), [Costs!date], "<="&EOMONTH(TODAY(),0))) / SUMIFS([Hours!hours], [Hours!date], ">="&(EOMONTH(TODAY(),-1)+1), [Hours!date], "<="&EOMONTH(TODAY(),0)), 0)
Income this tax yearSUMIFS([Income!amount], [Income!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6))
Costs this tax yearSUMIFS([Costs!amount], [Costs!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6))
Profit this tax yearSUM([Hustles!ty_profit])
Hours this tax yearSUMIFS([Hours!hours], [Hours!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6))
Profit per hour this tax yearIFERROR(SUM([Hustles!ty_profit]) / SUMIFS([Hours!hours], [Hours!date], ">="&DATE(YEAR(TODAY())-IF(TODAY()<DATE(YEAR(TODAY()),4,6),1,0),4,6)), 0)
Tax to put asideSUM([Hustles!tax_set_aside])
Profit all timeSUM([Income!amount]) - SUM([Costs!amount])