Blog · June 6, 2026 · ~10 min read
Freelance billing software: why general billing tools miss the retainer client visibility gap
Type “freelance billing software” into any search engine and you’ll get the same shortlist: FreshBooks, Wave, Bonsai, HoneyBook, QuickBooks Self-Employed. All of them are good at what they do. None of them solve the problem retainer freelancers actually spend the most time on: answering the question “how many hours do I have left this month?”
The gap isn’t in the billing itself. Invoices go out fine from any of these tools. The gap is in the period between invoices — the ongoing window when retainer clients wonder about their remaining capacity and the only way to find out is to email their freelancer and wait.
Understanding why every billing tool misses this — not just the bad ones, but the well-designed ones — explains what kind of tool actually fills it.
What freelance billing software does well
The core job of any billing tool is to turn work completed into a payment request. Every tool on the standard shortlist handles this job well, with different trade-offs on scope and price.
FreshBooks is the most mature option in the freelancer-first category. It supports time tracking tied directly to clients and projects, recurring invoice schedules, expense capture with receipt scanning, and a client-facing portal where clients can view and pay invoices. The time tracking and invoicing are tightly coupled: log time, click “create invoice,” and the hours populate automatically. At $17–$55/mo, it’s priced at the premium end of the category but is genuinely feature-complete for a solo practitioner who wants one tool for all billing.
Wave occupies the opposite end: free for core features (invoicing, payments, receipt scanning), paid only for payroll and payment processing. The trade-off is depth — Wave’s invoicing is clean and functional but the time tracking and client portal are thinner than FreshBooks. For freelancers who just need to generate professional invoices and don’t need integrated time tracking, Wave is hard to beat at $0.
Bonsai targets the all-in-one angle for solo freelancers specifically: contracts, proposals, time tracking, invoices, and a basic CRM in one subscription at $21–$66/mo. The value is coherence — a new contract can flow into a project, which generates time entries, which feed into an invoice, all in one place. Bonsai also has client-facing features for contract signatures and payment, though the client portal is billing-oriented rather than project-status-oriented.
HoneyBook takes a similar all-in-one approach but with stronger emphasis on the client-experience workflow: proposals, questionnaires, contracts, invoices, and automated payment reminder sequences. It’s priced at $36–$109/mo and targets creative freelancers (photographers, event planners, designers) who need polished client-facing documents as much as billing mechanics.
QuickBooks Self-Employed focuses primarily on expense categorization for quarterly estimated taxes, with basic invoicing included. It’s less a freelancer tool than a tax-planning tool that happens to have an invoicing function attached.
These are genuinely good tools. The criticism that follows isn’t that they’re poorly designed — it’s that they’re designed for a specific problem, and that problem isn’t the one retainer freelancers hit most often.
The retainer billing shape
Retainer billing has a distinctive structure that differs from project billing in three ways, and billing software handles two of the three fine.
The first difference is invoice timing: retainer invoices go out before the work happens. The client pays for future capacity, not past output. This is pre-cycle invoicing, and every billing tool on the list handles it through recurring invoice templates with a fixed send date. No problem here.
The second difference is invoice amount: the retainer fee is pre-agreed and fixed, not calculated from hours worked. The invoice says “20 hours at $X/hr = $Y” as a retainer fee, not as a tally of what was actually used. Billing software handles this fine too — set up a line item with the retainer amount, schedule it to recur, done.
The third difference is where billing software stops being useful: the hours are a running balance that changes continuously throughout the cycle, and the client needs to be able to see that balance without waiting for you to tell them.
The first two differences are billing events — things that happen at a specific moment (invoice sent, payment received). The third is a continuous state that updates every time you log an hour. Billing tools are built around events. Continuous state is outside their design.
Why the client portal doesn’t solve it
FreshBooks, HoneyBook, and Bonsai all have some form of client-facing access. It’s reasonable to assume the client portal would be where the client checks their retainer status. In practice it’s the wrong tool for the question.
Client portals in billing software are designed around billing visibility: outstanding invoices, payment history, contracts. The client logs in, sees their most recent invoice, sees whether it’s paid, possibly sees historical invoices. This is genuinely useful for the payment workflow.
What the portal doesn’t show: how many hours have been logged this cycle, how many remain, what specific tasks have been worked on this week, when the cycle resets. The portal answers “what do I owe?” and “what have I paid?” It doesn’t answer “how much capacity do I have left right now?”
These are structurally different questions. The first is backward-looking (what happened in billing terms). The second is forward-looking (what can I ask for today without triggering an overage). A billing portal, by design, shows billing events. It has no concept of retainer capacity as a live resource.
Even in FreshBooks, which has the most complete time tracking of any billing tool on the list, the time entries are your records, not the client’s dashboard. The client can see their invoices. They cannot see a real-time burn-down of their retainer hours.
The time tracking layer doesn’t solve it either
Some billing tools include time tracking, and some freelancers extend their time tracker directly to the client as an attempt to fill the visibility gap. Neither approach works as intended.
Billing-tool time tracking (FreshBooks, Bonsai, HoneyBook) generates records for the freelancer’s billing use: entries that roll up into invoices. The client can’t access these entries directly. They’re not designed for client-facing display.
Dedicated time trackers (Toggl, Harvest, Clockify) do have client-sharing features. Toggl lets you share a report link. Harvest has a project share URL. But these shared views are shaped for project billing, not retainer cycles. A shared Toggl report shows hours logged in a date range you specify; it doesn’t automatically show “hours used this billing cycle vs. monthly cap.” The client who wants to know their retainer balance has to know the right date range to look at, understand the cap, do the subtraction, and interpret the result. That’s not a glance — that’s a process. Clients don’t do it. They email instead.
Why billing software vendors haven’t built this
It’s worth understanding why the retainer visibility layer is absent from billing tools, because the absence isn’t an oversight — it’s a structural consequence of how these tools are built and who they’re designed for.
Billing software vendors think in billing events: invoice created, invoice sent, invoice viewed, payment received, invoice overdue. Their data model is built around financial transactions. The client-facing experience is optimized for payment: “here is your invoice, here is how to pay it.”
Adding a retainer hours dashboard would require a different data model: billing cycle with start and end dates, hours cap per cycle, hours consumed against that cap (updated continuously as time is logged), running balance, work log with task-level detail. This isn’t an extension of the billing model — it’s a separate layer with different update semantics (event-driven vs. continuous), different client access pattern (pay-action vs. status-glance), and a different purpose (authorization for future work vs. record of past billing).
Building this inside a billing tool means building a second product inside the first. The vendors who focus on doing billing exceptionally well haven’t done it, and that’s a rational choice. The freelancers who most need retainer visibility are often the same freelancers who are well-served by Wave for billing (simple, free, no time tracking needed). Adding retainer tracking to Wave would be scope creep from Wave’s perspective.
The three-layer framework
Retainer management breaks into three distinct layers, and most freelancers have two of the three covered without realizing it.
Layer 1 — time tracking: logging hours for your own records. This is where Toggl, Harvest, Clockify, and the time-tracking modules inside FreshBooks and Bonsai live. The output is a time log that says what you worked on and for how long.
Layer 2 — billing: turning logged hours (or pre-agreed retainer fees) into invoices. This is where all the tools in this article live. FreshBooks, Wave, Bonsai, HoneyBook, and QuickBooks Self-Employed all execute Layer 2 well.
Layer 3 — client visibility: making the retainer balance legible to the client in real time, so they can answer their own “how many hours left?” question without emailing you. This layer is almost entirely absent from the standard billing software market.
Most freelancers who run retainers have Layer 1 (time tracker) and Layer 2 (billing software) in place. The email loop — “how many hours do I have left?” — is a symptom of a missing Layer 3, not a failure of the other two layers.
Switching billing software doesn’t fix a Layer 3 problem. Neither does switching time trackers. The tools in the retainer management category are primarily project-management tools or all-in-one platforms that combine Layer 1 and 2 (and sometimes CRM) into a single product, but still leave Layer 3 unbuilt.
What client portals are actually optimized for
The “client portal” feature in billing software is worth examining in more detail, because it’s often cited as the answer to the retainer visibility question and consistently fails to be one in practice.
A billing-tool client portal is designed for the client as a payer, not the client as a consumer of your retainer capacity. The client interaction it’s built for is: receive invoice, review invoice, approve and pay invoice. The portal makes this flow smooth. It confirms payment success, stores the receipt, and shows past invoices on request.
None of that is the interaction a retainer client needs mid-cycle. The retainer client’s question isn’t “did my invoice go through?” It’s “if I ask my consultant to revise this deck, do we have hours left for it or will that trigger extra billing?” That question requires current-cycle hours used, hours remaining, and context about what the remaining hours represent — none of which a billing portal surfaces.
The interaction pattern is also wrong. A billing portal requires login (remembering a password, navigating to the portal URL, authenticating). The retainer balance question is usually a glance-before-a-meeting thought, not a planned task. The right tool for a glance thought is a bookmarked URL that shows the answer immediately, with no login required. A billing portal login flow is three steps too many for a 5-second question.
The practical implication for retainer freelancers
If you’re evaluating freelance billing software because your retainer clients keep emailing you about hours, switching billing tools won’t stop the emails. The emails are a Layer 3 problem. Billing software lives at Layer 2. The category doesn’t overlap.
The right approach is to keep using whichever billing software fits your invoicing workflow (any of the tools above will handle the billing job well), and add a purpose-built Layer 3 tool alongside it. What Layer 3 needs to provide:
- A public URL per retainer that the client can bookmark — no account, no password, no portal login
- Current-cycle hours used and hours remaining, updated each time you log
- Cycle reset date, so the client knows when the balance refreshes
- A work log showing what the hours were spent on — so the client understands the balance in context, not just as a number
This is a fundamentally different shape from a billing tool. It’s not an invoice generator. It’s a status page — the same way a Calendly link answers “when can we meet?” without requiring an email back-and-forth, a retainer hours URL answers “how many hours do I have left?” without requiring an email thread.
HourTab is built for this layer specifically. You import your time entries from any time tracker (CSV from Toggl, Harvest, Clockify, or any tool with export) and HourTab generates a public URL for each retainer — hours used, hours remaining, cycle reset date, work log. Your client bookmarks the URL at the start of the engagement. They check it before meetings, before new requests, whenever the question arises. No email. No wait. The question is answered the moment it’s asked.
The billing software you already use keeps invoicing on schedule. The retainer visibility layer sits alongside it, solving the problem billing software was never designed to solve.