Freelancer Profit Tracker
Monitor income, expenses, real profit month over month
monthly system
This workflow answers one question after the work is finished. Did the month actually pay what you thought it paid? Not the rate on the proposal. Not the total at the bottom of the invoices. The money that cleared, divided by every hour the work really consumed. That figure is your realized hourly rate, and it always comes in under the rate you quote. The gap is what this workflow measures.
One example runs through every step below. A solo designer, $85/hour quoted, twenty working days in the month, three clients.
| Client | Deal | Hours worked | Invoiced |
|---|---|---|---|
| Northline | Flat $4,250, estimated at 50 hrs | 64 | $4,250 |
| Halcyon | Hourly at $85 | 38 | $3,230 |
| Vela | Hourly at $85, 5 hrs written off in a scope argument | 23 | $1,530 |
Step 1: Log every hour, including the ones nobody pays for
Open the Time Card Calculator with Lunch Break and enter a real working day rather than an idealized one: in at 09:00, out at 17:30, 30 minutes for lunch, 20 days, rate $85.
8.0 hrs/day × 20 days = 160 hours worked
160 × $85 = $13,600 ← ceiling, not incomeThe dollar figure is a ceiling you will never touch. Keep the 160. Then split it: 125 hours on client files, 35 on proposals, invoicing, a discovery call that never converted, software wrangling and email. Both halves stay in the denominator.
The common mistake is tracking billable time only. Do that and the denominator is wrong by 20–25%, the realized rate comes out flattering, and you decide the pricing is fine. But the 35 hours do not disappear because nobody wrote them down. They get paid for out of the billable ones.
Step 2: Pull what you invoiced, then what actually cleared
List every invoice raised for the period. If you are not already working from numbered records, rebuild them with the Free Invoice Generator: one document per client, dated, with the hours or the flat fee on the line. The issue date matters as much as the amount, because aging drives the next number.
Invoiced 4,250 + 3,230 + 1,530 = $9,010
Collected 4,250 + 3,230 + 0 = $7,480 (Vela unpaid, day 74)For profit tracking, revenue means cash received. Vela's invoice has been sitting for 74 days, which makes it a loan you never agreed to make. Keep it at zero in the collected column until the payment clears. Step 3 will put a price on it.
Step 3: Divide, and watch the rate fall
Realized hourly rate is collected revenue over total hours worked. Do it in stages. Then you can see which stage costs the most.
$85.00 quoted rate
$72.08 9,010 invoiced / 125 client hours → -$12.92 scope overrun + write-off
$56.31 9,010 invoiced / 160 total hours → -$15.77 non-billable time
$46.75 7,480 collected / 160 total hours → -$9.56 unpaid invoiceThe month realized 55% of its quoted rate. Nothing about it felt like a disaster at the time. An estimate ran long, five hours were conceded to keep a client calm, one invoice sat. Split the same arithmetic by client, collected money over hours worked:
| Client | Collected ÷ hours | Realized rate |
|---|---|---|
| Halcyon | 3,230 ÷ 38 | $85.00 |
| Northline | 4,250 ÷ 64 | $66.41 |
| Vela | 0 ÷ 23 | $0.00 |
Now find the floor the rate has to clear. Run the Billable Hours Calculator with a $75,000 income target, $14,300 of business costs, and 5 billable hours a day, not 8. The whole calculation turns on that one field. It returns roughly $74.42 per billed hour. Put 8 in there instead and you get about $46.51, which is how freelancers talk themselves into a $50 rate. At $50 across the same 106 paid-equivalent hours a month, the year invoices $63,600, leaves $49,300 after costs, and misses the target by more than $25,000.
Step 4: Reprice the flat fee off actual hours
Northline was quoted off a 50-hour estimate and consumed 64. Feed the real figure into the Job Costing Calculator: 64 labor hours at $85, 15% overhead, 20% target margin. Bare labor on 64 hours is $5,440 before a cent of overhead. So the $4,250 charged covered 78% of that and none of the margin.
Two things change next time. The estimate for that job type starts at 64 hours, because that is what it takes. And the contract names the hour count that triggers a change order. At hour 50 the overrun is a routine email. At hour 64, with the work already delivered, it is unbillable.
Step 5: Reserve tax on profit, not on revenue
If this month is representative, the year collects about $89,760 against $14,300 of deductible costs (software, insurance, accounting, phone, mileage, home office) for a net profit near $75,460. Run it through the 1099 Tax Calculator with Deductions: collected revenue in the income field, expenses in the expenses field, then set your filing status and any W-2 income.
Self-employment tax applies at 15.3% to 92.35% of net profit. On $75,460 that is roughly $10,660, before federal income tax and before the deductible half. The usual rule of thumb holds back 25–30% of profit. At 28% that is about $21,130 a year, or $1,761 moved out on the first of each month.
Two ways this goes wrong. Reserve against revenue instead of profit and you over-hold roughly $4,000 a year here, money sitting idle that could have gone into the business. Reserving against invoiced revenue is worse. You set aside cash on Vela's $1,530, the $1,530 never arrives, and the reserve comes out of rent money.
Step 6: Make it a fifteen-minute monthly loop
Log three numbers each month: total hours worked, cash collected, realized rate. Two consecutive months of a falling rate mean some client is absorbing hours nobody pays for, and the per-client table in step 3 will name them in a couple of minutes. Any client under your floor rate gets repriced at renewal or released.
Any invoice past 45 days moves to the top of next week, because at day 74 it is already pulling the realized rate down by nearly $10 an hour.
Related: profit planning beyond hourly rates · monthly overhead planner · all freelancer tools
Catch the overrun before it's already delivered
Everything above measures what happened after the month closes, which is exactly right for pricing decisions and reserving tax. It doesn't help with the moment that actually causes the overrun, which is Step 4's Northline problem while it's still happening rather than after the invoice is already sent.
The fix is a simple trigger built into how you log hours, not a new calculator: flag it yourself when a project crosses 80% of its estimated hours, while there's still time to have the change-order conversation instead of absorbing the rest. At hour 40 of a 50-hour estimate, a quick message about scope costs nothing and often gets a client to either trim the ask or approve the extra hours upfront. At hour 64, with the work already done, the same conversation is just you explaining why the invoice doesn't match the quote.
Set the trigger a little earlier on fixed-fee work than hourly work, since a fixed-fee client has no visibility into hours ticking up until you tell them, and by the time you notice on your own it's often already past the point where a heads-up would have changed anything.
