The agency that knows what it actually earned on every job

Everyone knows the revenue on a project. Very few know the margin - because the hours logged and the amount invoiced live in different tools. How to join two numbers you already have, and why the result unsettles most firms.

Marek Raja

Ask around your agency what you made on the last big job. You'll get the number from the invoice. Ask what was left of it - and you'll get silence, or “I'd have to work that out.”

That silence isn't carelessness. It's what happens when two numbers that belong together sit in different tools.

Why profitability gets calculated after the fact

The invoice is in accounting. The hours are in a project tool or a spreadsheet. The internal rates for each role are known to the owner and nobody else. For a margin to exist, somebody has to put it together by hand.

And because that's work, it gets done either once a quarter or at the moment something goes wrong. Both are too late: the job is finished, the price was agreed, nothing can be changed.

Profitability you learn about after delivery is a statistic. Profitability you can see during delivery is management.

What you actually need to measure

Surprisingly little. Three things, and all three already exist in the business:

  • What we invoiced (or what price was agreed)
  • How many hours each person logged on this specific job
  • The internal rate for each role - not what you charge the client, but what that hour costs you

When those three live in one system, margin isn't a report. It's a column.

Everyone knows revenue. Very few know margin.

€7,200 on the invoice looks fine. After 214 logged hours, 17% of it is left.

A model example that fits most agencies

A website redesign, agreed price €7,200. The breakdown of work:

RoleHoursInternal rateCost
Creative62 h€28€1,736
Development104 h€32€3,328
Project management48 h€19€912
Total214 h€5,976

That leaves €1,224 - a margin of 17%. Before office overhead, sales time, and any hours nobody logged.

That isn't a catastrophe - it's a normal number. The catastrophe is finding it out in December, having quoted another twelve jobs off the same formula all year.

The most common cause of a negative margin

It isn't bad pricing, it's unlogged hours. Work nobody recorded shows up in the margin as profit - until somebody notices the team is at capacity while “everything is making money”.

What a live view looks like

When timesheets are attached to the job, margin can be watched as you go. In practice that means three views worth having:

Jobs below the line. A filter on every running job where the margin has already dropped under a set percentage. This is the view that should be opened once a week.

Estimate vs. actual. How many hours you planned against how many there really are. The gap tells you whether the problem started at quoting or at delivery.

Profitability by type of work. Margin summed across all jobs of the same kind. Almost every agency discovers from this view that one of its services has been quietly subsidising the others.

What to do when the number comes out badly

A negative or very thin margin usually has one of four causes, and each calls for a different response:

  1. Priced wrong. The fix is in the quote, not in delivery. Having previous comparable jobs with real hours helps.
  2. Scope creep. The client kept adding and nobody invoiced it. Fix: record extra work as separate line items.
  3. Inefficient delivery. It took longer than it should. That fix is inside the team.
  4. The wrong kind of job. Some work simply doesn't earn. The fix is to stop taking it, or price it differently.

Without the number you can do none of the four.

A practical guide to time tracking is in Logging time on projects without spreadsheets. What reporting on live data looks like is in Reporting with view columns and formulas. Details on measuring time are on the Time tracking feature page. The full life cycle of a job, from enquiry to review, is in the guide to managing jobs and profitability.

Common questions about job profitability

How do I set an internal rate for a role?

The simplest honest calculation: annual employment cost for that person (including contributions) divided by the hours they genuinely work in a year. The result is noticeably higher than the gross hourly wage - and that is precisely the amount a job has to cover.

What if the team refuses to log time?

Usually it isn't resistance to being measured, it's resistance to the tool. When a timesheet entry is one click on the task someone is already working on, the resistance tends to vanish. When it's a separate spreadsheet at month end, it never does.

Do we have to change how we invoice?

No. The accounting package stays where it is. To calculate margin, the system only needs to know the agreed or invoiced amount on the job - which is one field.

Describe how you measure jobs.

Apexloop builds the app around you