Blog · April 30, 2026 · ~9 min read
The “how many hours do I have left?” email is a billing problem disguised as a status problem
Freelance consultants and 2–5 person studios who run monthly retainers spend two to four hours every month answering one client email. That email is some variant of: “hey, quick one — how many hours do I have left this cycle?” The email is annoying. It interrupts. It makes the freelancer feel like a vending machine. The instinct is to fix it editorially — write a better mid-month status email, build a tidier spreadsheet, send a calendar reminder. None of that works for very long. The reason none of it works is that the question isn’t about status. It’s about billing.
The misclassification
Status problems are problems of information transfer: the answer exists, the asker doesn’t have it, you transfer it across. If “how many hours left?” were a status problem, then any reliable answer-delivery channel would close it. A weekly email. A shared Google Sheet. A line at the top of every invoice. The reason these all decay within two months is that the question isn’t actually “please tell me the number.” The question is “am I about to be on the hook for an overage I didn’t see coming?”
That’s a billing question. The client is asking, in client-language, for a real-time risk readout: am I within budget? am I about to blow through it? if I send you that one extra request next Tuesday, will it cost me? When the freelancer treats it as a status problem and replies with a number (“you have 8.5 hours left”), the client now has the number, but they don’t have a way to keep that number current without asking again next week. So they ask again next week. Forever.
The chronic email is the rational response to a one-off answer. The freelancer hasn’t given the client a way to see the number themselves — they’ve given them a way to request the number. So the client’s only tool is the request, and the request gets used.
Why “just build a client portal” doesn’t fix it
The standard SaaS instinct, when a recurring client question becomes a tax on a service business, is to ship a portal. Account creation, password reset, an inbox-style thing on a dashboard with sections for Files, Hours, Invoices, Messages. Retainerkit and Plutio and Bonsai all do this in some form. The trouble is the portal makes the original problem worse in two specific ways.
First, account creation is the new churn point. Roughly four out of every five people abandon a software signup at the password screen on the first try. If your client is a busy CMO who already has 80 logins, asking her to create the 81st — for the explicit purpose of seeing how many hours her freelancer has left — is a battle you will lose. She will close the tab. Two weeks later she will email you and ask how many hours she has left, because the portal didn’t happen for her, and she has no other tool.
Second, even when the client does set up the account, the portal moves a piece of the freelancer’s ops surface into a place the client has to actively go visit. Email is push. A portal is pull. Pull surfaces lose to push surfaces in every category of busy-knowledge-worker behaviour. The client doesn’t check the portal. The client emails you. The portal is now a thing you maintain that nobody opens, which is the worst kind of software.
There’s a reason the right shape here looks more like Calendly than like a CRM. Calendly didn’t replace your scheduling email by giving the other person an account — it replaced it by giving you a URL you paste into the same email thread. The other person clicks it once. They never sign up for anything. The thing that was an email loop becomes a one-shot URL handoff. Retainer dashboards should work the same way: not a place the client logs into, but a thing the client opens.
The structural fix
The structural fix is to give the client the answer, kept current, on a URL they can bookmark. One link, no password, no signup. Not “eight and a half hours left” in plaintext mid-month, but a tiny page that always says 12 of 20 hours used · 8 hours remain · resets May 1 at whatever moment the client happens to open it. Below the headline number, a list of what was actually done this cycle — API sync debug, 3h. Onboarding call, 1h. Landing copy revisions, 2h. So the client doesn’t just see the number. They see the number plus the work behind it.
That second part is what turns the URL from a status display into a billing readout. The client isn’t just asking how many hours left; they’re also asking, implicitly, are the hours that got burned the right hours? Listing the work answers both questions on the same page. If the client opens the URL on the 12th and sees that 14 of 20 hours went to one debugging epic, they have the data to either accept that pace or push back on scope. They don’t have to write you an email to figure that out.
The URL has the further property of being a shared object rather than a private one. The client can bookmark it. A junior at the client’s shop can be sent the same URL without you provisioning a second account. If the client’s ops person wants to check the URL on Monday morning before the standup, they can. The same URL is good for everyone on the client side, because there’s no per-user state on it. (You rotate the slug if you want to revoke access. The slug is unguessable; you don’t need a password.) That’s a property a portal cannot give you, because portals exist precisely to track per-user state.
What this leaves out, on purpose
A lot of things that look like they belong on a retainer page don’t. Some examples worth being explicit about:
- Invoicing. The client already has an invoicing flow with you (Stripe, Wise, manual). A retainer dashboard that tries to also be the invoice replaces something that already works. Don’t.
- Project management. Tasks, Gantts, status flags. Notion or Basecamp owns this for the client. Tacking it on to a retainer page muddles what the page is for.
- Time approval workflows. Enterprises do this; retainer freelancers don’t. The retainer is closed-loop — the freelancer is trusted to log accurately. The dashboard reports trust, it doesn’t replace it.
- Client messaging. Slack, email, and the occasional Loom already cover this. A messaging widget on a retainer page would only be a duplicate channel that nobody opens.
- OAuth into the time tracker. Tempting, because you could pull hours live. But OAuth means setting up an integration, which means a configuration page, which means another reason for the URL to require a login. CSV paste-in stays at zero ceremony.
Each one of those, individually, sounds like a reasonable extension. Together they reproduce the full client portal you started by avoiding. The discipline of the URL is the discipline to keep saying no.
Why no purpose-built tool does this yet
The market structure for retainer tools is upside-down. The closest purpose-built competitor, Retainerkit, starts at $49/mo and assumes a 10+ seat agency — which is precisely the segment that already has ops headcount and doesn’t feel the “how many hours” tax acutely. The freelancer who feels the tax most cannot justify $49/mo on a single retainer. So they reach for an all-in-one bundle (Plutio at $19/mo, Bonsai at $25/mo, Scoro further up) which gives them a retainer view inside a tool they have to learn wholesale, including parts they’ll never use. Retainer-agreement tracking as a stand-alone, single-purpose tool sized at solo-budget pricing isn’t a category yet, even though it’s the obvious shape for the underlying problem.
There’s also a category-naming problem. Freelancers don’t search for “retainer dashboard.” They search for “how to track retainer hours” and “Toggl retainer report” and “client visibility into hours,” and end up on twelve scattered Reddit threads each prescribing a slightly different spreadsheet. Nobody has named the wedge cleanly: no client login, just a URL. The right name for the category is the wedge, not the feature list.
The two-line summary
If the “how many hours do I have left” email is a billing question, not a status question, then the fix is to give the client the answer on a URL that’s always current — not to write a better email or build a portal nobody opens. The URL replaces the loop. Once the client has the URL bookmarked, the question stops, because the answer is one tap away from where they already are. The right-shaped tool for this fits on a share button and looks more like Calendly than like Salesforce.
That’s the wedge HourTab is built around. The whole product fits on the share button. If you run retainers and recognize the email this post is about, you can join the waitlist for $0 and we’ll send one note when the share URL goes live for your first retainer. Free for the first one. Common questions are answered separately.