Almost every agency knows what it invoices. Considerably fewer know what they earn. And very few know which specific projects make money and which lose it while there is still time to act.
The pattern is so common it is almost a rite of passage: you close the year with solid revenue, the result does not match the feeling of having run flat out, and when you finally sit down to look, two or three projects ate the margin of all the others.
This is about how to compute the number that is actually true.
The base error: treating rate as margin
If you sell at €60/hour and pay someone €20/hour, it is tempting to think you make 40. You do not, for two compounding reasons.
A person’s cost is not their salary. On top of gross pay you have employer social security, equipment, software licences, training, and a proportional share of everything that does not bill: admin, management, sales, office, accounting. Depending on structure, the real employer cost usually sits between 1.4 and 1.8 times gross salary.
Not every hour of the year is billable. This is where most calculations break.
The denominator almost everyone gets wrong
Hourly cost is a division. The numerator — what the person costs — is usually roughly right. The denominator is almost always inflated.
Start from a typical working year: around 1,750-1,800 contract hours. From there you must subtract what will never be billed:
| Item | Approximate impact |
|---|---|
| Holidays and public days | Already excluded from contract hours |
| Sick leave and absences | 3-5% |
| Training and keeping current | 3-5% |
| Internal meetings, 1:1s, planning | 8-12% |
| Pre-sales, proposals, estimates | 5-10% |
| Internal work (own site, processes) | 3-8% |
Add it up: between 22% and 40% of the working day is non-billable, and much of it is necessary work there is no sense in eliminating. Healthy utilisation for delivery roles sits between 70% and 80%, which leaves roughly 1,250-1,400 billable hours a year, not 1,800.
That is the correct denominator. Divide annual cost by 1,800 instead of 1,300 and your hourly cost comes out 28% cheaper than it is. Every margin you compute from there is fiction.
The formula, tidied up
real hourly cost = annual employer cost / real billable hours per year
project gross margin = project revenue
- (logged hours × real hourly cost per role)
- direct costs (licences, infra, subcontracting)
Two details that change the outcome:
Use each role’s hourly cost, not an average. A project delivered mostly by senior people costs very differently from one computed on a weighted average of the whole team. The average hides exactly the projects going worst.
Log everything, not just development. Project management, client meetings, feedback rounds and post-delivery support are project hours. If you only log coding time, you are measuring something else.
Where the margin leaks
In order of frequency, from what we have seen:
Hours nobody logs
People do not record fifteen-minute calls, the “take a quick look at this”, the half hour spent researching a library. Individually it is noise; aggregated over a three-month project it is a double-digit overrun.
You do not fix that by insisting people log better: you fix it by making logging cost one gesture instead of three.
Extensions agreed verbally
The client asks for something “small” on a call, someone says yes to avoid friction, and it never reaches a quote. Repeated five times, the real scope no longer resembles what was signed — but the price does.
A system that shows logged hours against quoted hours turns that awkward conversation into an objective number you can put on screen.
Fixed price with no history
Quoting a fixed price without knowing what similar projects cost is gambling. Fixed price is not bad — it transfers risk, and can carry better margin — but it requires data from previous projects to estimate. With no history you are picking a number and crossing your fingers.
Finding out late
This one hurts most because it is the only entirely avoidable one. A project 40% over in week three is fixable: rescope, renegotiate, change the team. The same project detected at closure is a booked loss.
What to watch weekly
Three numbers per active project. You do not need more:
- Logged versus quoted hours, as a percentage. If you are at 60% of the hours with 30% of the scope delivered, you have a problem today, not in two months.
- Projected gross margin, recalculated with the real accumulated hours plus an estimate of what remains.
- Who is logging. A project quoted with mid-level roles that is absorbing your most expensive senior hours is getting more expensive even if the hour total looks fine.
Moving from spreadsheet to tool
A spreadsheet works while there are few projects and someone disciplined maintains it. It breaks in three places at once: it depends on one person, it arrives late, and — most importantly — nobody trusts it enough to make a hard decision based on what it says.
The leap is not technological, it is about trusting the number. When the team logs as they go and the figures come out on their own, the conversation stops being “is this right?” and becomes “what do we do about this?”.
That is precisely the problem we built Tenki for: time tracking that does not annoy the person doing it, project profitability computed in real time with each role’s hourly cost, and financial control connecting those hours to the P&L. We built it because we needed it ourselves.
If you are also deciding how to staff up, we have an analysis on agency versus in-house team that sits on the other side of this same equation.