Blog · June 1, 2026 · ~9 min read
How to track client hours as a freelancer (without a spreadsheet that’s always wrong)
There are two jobs in client hour tracking, and they have almost nothing to do with each other. The first job is tracking your time so you know what to bill. The second is making that time visible to the client so they know what they’ve used. Most freelancers have a tool for the first job. Almost none have a proper setup for the second — which is why the “how many hours do I have left?” emails never stop.
The two jobs, and why confusing them matters
When a freelancer says “I need to track client hours,” they almost always mean job one: logging time against client work so they can produce an accurate invoice. Toggl, Harvest, Clockify, and Hubstaff all do this well. Start a timer, assign it to a client, export a report at billing time. The tooling for job one is mature, affordable, and widely used.
Job two is different in shape and purpose. The client isn’t waiting on an invoice — they’re wondering, mid-cycle, whether they have enough hours left to submit a new request. They want to know whether they’re at 6 hours used or 14. They want to see what those hours went toward. They want to know when the retainer resets. They are not asking billing questions. They are asking trust questions. Is my money being used the way I expect? Do I have room to ask for more this month?
The tools that solve job one don’t solve job two — not because they lack the data, but because they weren’t built for it. The hours-remaining question is actually a billing-trust problem, and the mismatch between what time trackers show and what clients need to see is what produces the recurring inbox clutter. The client can’t self-serve from your Toggl report. So they email.
Method 1: Spreadsheet (free, and usually wrong by Tuesday)
Most freelancers who decide to “properly” track client hours start with a spreadsheet. The spreadsheet gets a tab per client, columns for date, task, and duration, and a sum formula that shows hours used. The first week it’s clean. By week three it’s behind. By month two it hasn’t been updated in ten days and the client is asking about a number that was accurate a week and a half ago.
Spreadsheets break down for a predictable structural reason: they require active maintenance by a person who has other things to do. Every session of logged time requires a manual entry. Every time the freelancer forgets to update the sheet before the client checks it, the number is wrong. The client who checks the sheet and finds it inconsistent with the email they got last time learns, quickly, that the sheet isn’t reliable — and goes back to emailing.
The spreadsheet approach also fails at scale. Managing five or more retainer clients with a spreadsheet per client means five separate maintenance tasks, each with its own lag, each prone to the same staleness problem. The overhead compounds in a way that makes the whole setup feel more like a liability than a solution.
Method 2: Time tracker only (your side is solved; the client’s isn’t)
Adding a time tracker solves job one cleanly. You log every session, assign it to the right client, and the tracker builds a running total automatically. No manual entry. No forgetting. The data is accurate to the last timer stop.
The problem is that the data is accurate for you, not for the client. Your Toggl dashboard shows a clear picture of every client’s hours this cycle. The client, however, is on the outside of that dashboard. They don’t have your login. They can’t see what you see. The tracker produces the right data but delivers it to the wrong person.
Each major time tracker has a workaround that seems like it might bridge this gap. Toggl’s public report share URL is a date-range spreadsheet, not a cycle-aware retainer view. Harvest has scheduled report emails and project budgets. Clockify has shared report links. Hubstaff has Client Hub. All of these move the data one step closer to the client. None of them answer the question the client is actually asking — not because the data is wrong, but because the format is wrong. A date-range report is not the same as “12 of 20 hours used, resets August 1.”
Method 3: Scheduled report emails (better, but aging by design)
Scheduled report emails are one step up from the time-tracker-only approach. You configure Harvest or Toggl to send the client a summary every two weeks. The client gets a snapshot on a known cadence. The first few clients appreciate this. It feels professional and systematic.
The structural problem is that a scheduled report is always aging. A report sent on the 15th is stale by the 22nd. The client who wants to know their hours balance on the 23rd before they submit a new request gets the same answer regardless: they check the email from the 15th, see they had 8 hours remaining, and then wonder how many of those they’ve used since. If they’ve had work done between the 15th and the 23rd — which is likely — the report is wrong. And they email you to ask.
Scheduled reports also increase client anxiety rather than reducing it. A client who knows reports come every two weeks starts counting down to the next one. When they want a number before the next report, they have no self-service option. The report cadence creates a dependency on your schedule rather than eliminating the need for back-and-forth.
Method 4: A live URL per client retainer
The approach that actually solves both jobs — your tracking and client visibility — is a dedicated URL per retainer that the client can open any time and see the current state: hours used, hours remaining, reset date, and a work log with recent entries.
The workflow looks like this. You log time in your existing tracker as usual — nothing changes on your side. At the end of a work session, or once a day, or whenever you want the client view updated, you export a CSV from your tracker (Toggl, Harvest, Clockify, or any tracker with CSV export) and paste it into the retainer dashboard. The dashboard processes the CSV and updates the client’s URL automatically. The URL shows the current balance. The client bookmarks it once and checks it whenever they’re curious. They stop emailing.
This is the shape a retainer dashboard needs to actually make the client-visibility problem go away: live data, no client login, one URL that’s the complete answer to the in-cycle hours question. The client doesn’t need to learn your time tracker. They don’t need an account. They don’t need to understand how your billing works. They open the URL, see the number, and make their decision.
The freelancer side of this workflow is also lower-friction than it appears. The CSV export step adds roughly thirty seconds to an existing time-logging habit that most freelancers already have. The result — a client who self-serves their hours question instead of emailing — is worth far more than thirty seconds in recovered inbox time.
What to look for in a client hour tracking setup
If you’re evaluating how to set up client hour tracking for your retainer practice, here are the properties that distinguish approaches that actually work from those that seem to work until they don’t.
The client side requires no login. Any approach that asks the client to create an account, accept an invitation, or install anything is introducing friction that will reduce usage over time. Clients who need to remember a password to check their hours don’t use the system when they’re in a rush — which is exactly when they’re most likely to email you instead. The zero-login property is what separates a tool the client actually uses from one they use once and forget.
The data is current, not scheduled. A client visibility system that relies on you manually triggering an update — or on a scheduled report job — will always be at risk of showing a stale number. The best systems update as close to real-time as possible, ideally from the same data source you use for your own tracking. A CSV paste that takes thirty seconds is better than a scheduled report that the client can’t trust the day before their deadline.
The format answers the retainer question, not the time-tracker question. A date-range report shows time entries between two dates. A retainer view shows hours used against a cycle budget with a reset date. These are different formats because they answer different questions. The client asking “how many hours do I have left?” needs the retainer view, not the time-tracker report. Even the best time trackers don’t provide this natively — their client-facing reports are built around billing periods, not retainer cycles.
It fits alongside your existing workflow, not instead of it. If the tracking setup requires you to abandon your existing time tracker, it won’t stick. A good client hour tracking approach sits on top of whatever you already use: Toggl, Harvest, Clockify, Hubstaff, or even a manual spreadsheet. You continue logging time the way you already do. The new piece is the translation layer that converts your logs into the client-facing view.
It scales to multiple clients without proportional overhead. A setup that works for one client but requires duplicated effort for each additional client will break around client three or four. The right shape is: one configuration per client at setup time, then the same workflow regardless of how many clients are active. The tools that fail at scale are the ones that require per-client maintenance steps that don’t automate.
The practical workflow for most freelancers
For a solo freelancer running two to eight retainer clients, the setup that covers both jobs with the least overhead looks like this:
Job one (your tracking): Continue using whatever time tracker you already use. If you don’t have one, Toggl’s free tier is sufficient for basic retainer tracking. The goal is a consistent log that you can export as a CSV at any time. Log time per client, per session. That’s it.
Job two (client visibility): Set up one retainer dashboard URL per client. Give each client their URL once — in the welcome email, in the initial onboarding message, or in the first invoice. Tell them this is where they can always check their hours balance. Then, on whatever cadence makes sense for your clients (daily, after each session, or a few times a week), export a CSV from your tracker and paste it in. The URL updates. No email required.
The first time a client checks their URL instead of emailing you, the setup has paid for itself. The tenth time it happens in a month across three clients is when you notice that a category of inbox traffic has simply stopped.
When the spreadsheet isn’t the problem you think it is
A common mistake is diagnosing the problem as “I need a better spreadsheet.” The spreadsheet is usually a symptom, not the cause. The underlying problem is that no part of your current setup is designed to answer the client’s question without your involvement. The spreadsheet is the current attempt at that — but it fails because it requires the same active maintenance from you that a reply email would.
The question worth asking is: if my client wanted to know their hours balance right now, at 9pm on a Tuesday, could they find out without involving me? If the answer is no — because the spreadsheet is stale, because the time tracker requires a login they don’t have, because the last scheduled report was five days ago — then the problem isn’t the format of your spreadsheet. It’s that the entire setup requires you as an intermediary for every answer.
Removing yourself as the intermediary for the hours question is what makes the status emails stop. The approach that does this is a live URL the client controls, not a document you maintain.
Putting it together
Tracking client hours as a freelancer is two separate jobs with two separate tooling needs. Most freelancers have solved job one (logging time for billing) but haven’t solved job two (making that time visible to the client on demand). The result is a recurring inbox tax — the “how many hours do I have left?” email that no time tracker configuration fully eliminates.
The setup that solves both jobs: a time tracker for your side, a live retainer URL per client for their side, and a thirty-second CSV export linking the two. No portal to build. No spreadsheet to maintain. No report cadence to configure. One URL per client, current data, zero client friction.
HourTab is the retainer dashboard layer that makes job two easy: paste in your time-tracker CSV and your client gets a live, no-login URL that always shows their current hours balance. See how it works →