Blog · May 1, 2026 · ~9 min read
Harvest retainer report: why scheduled emails and project budgets don’t answer “how many hours do I have left?”
Harvest is one of the few mainstream time-trackers that takes retainers seriously. There’s a Retainers tab. There’s a project budget you can configure in hours. There’s a Scheduled Report you can send your client weekly. There’s even a Project Budget shareable URL. So if you bill a retainer through Harvest, the in-the-box answer to “how many hours do I have left?” is supposedly already built. And yet your client still emails you mid-month asking. The reason isn’t that the features are missing — they’re all there. Harvest’s retainer tooling is aimed at the freelancer’s tracking job, and the recurring email is a question from the client’s side of the table. Same data, different shape, different audience, different cadence.
What Harvest’s built-in retainer tooling actually shows
Worth being literal about it. Harvest’s Retainers tab gives you, the freelancer, a clean overview: each retainer is a row, each row has a budget (in hours or dollars), a billing frequency, and a fill bar showing how much of this period’s budget has been logged. Click into a retainer and you get the linked projects, the time entries roll-up, and the option to schedule a recurring invoice. The Project Budget view, separately, gives you a per-project burn-down with a horizontal bar and a percentage. The Scheduled Reports system lets you compose a Detailed Time or Time Summary report and have it emailed to the client every Monday morning. And the Project Budget link, once enabled, gives the client a read-only URL with the budget bar.
That’s a meaningful kit. Harvest’s product team built it for the situation it was built for: the freelancer wants to see, at a glance, whether each of their retainer clients is over or under budget for the period. An ops lead at a 5-person studio would love this view. So would a solo freelancer running their own books. The Retainers tab is the right page for the freelancer-facing job. It’s the wrong page for the client-facing question, and most of the field is the same on both sides — that’s why the loop is so easy to miss.
The retainer client opens their inbox with one specific question in mind: am I about to be on the hook for an overage? That question is answered by a single piece of information: hours remaining in the current cycle. Harvest’s tooling can produce that number — the data is right there in the time entries — but it doesn’t put it on a page the client opens at the moment they ask. The Retainers tab is behind the freelancer’s login. The Scheduled Report arrived last Monday and got buried. The Project Budget link, if enabled, shows budget percent but on the wrong cycle frame. So the client reaches for the email instead.
Three structural mismatches between Harvest’s built-ins and a retainer status page
The cosmetic gap is small — in theory Harvest could render “8 hours remain” on a public URL tomorrow if they wanted to — but the architectural gap is wider. Harvest’s retainer tooling and a retainer status page are different kinds of object. Three specific places where they diverge:
1. Push cadence vs. pull moment
Harvest’s primary client-facing flow is Scheduled Reports: you compose the report, set a recurrence (every Monday at 8am, or month-end, or whenever), pick a recipient, and Harvest mails it. That’s a push flow. The freelancer decides when the client gets the data, the client receives a PDF or a CSV in their inbox, and the data is a snapshot of the moment Harvest rendered the report. By Wednesday it’s a stale snapshot. By the 22nd of the month it’s last week’s reality.
The hours-remaining question doesn’t arrive on a schedule. It arrives whenever the client has scoped a piece of work and wants to check whether the retainer can absorb it — the 14th, the 22nd, the 28th, an irregular rhythm dictated by the client’s own project flow. None of those moments line up with the Monday-morning report. The client doesn’t want a snapshot of last week; they want the current number. So they email, because the email is the only pull surface in the equation: it asks the question now and gets an answer back when the freelancer reads it. The Scheduled Report and the email are competing in different categories — one is push at a fixed cadence, the other is pull at the question moment, and the question moment wins because that’s where the answer is actually needed.
2. Tabular shape vs. glance shape
Harvest’s Time Summary and Detailed Time reports are tabular. They have to be: every other reporting use case — invoicing, accountant audits, internal team reviews, payroll — needs the rows. The Detailed Time report is a list of entries with date, person, hours, notes, and project columns; the Time Summary report aggregates those rows into per-person or per-project totals. Both are correct shapes for a freelancer who needs to verify a billing claim or reconcile payroll. Both are wrong shapes for a 3-second client glance.
A glance product is one number, big, with one progress bar under it — 8 hours remain, with a fat horizontal fill, and a date stamp saying resets May 1. That’s the entire useful payload. A 47-row Detailed Time export carries the same information in principle, but the client has to do the arithmetic themselves: read the cap, sum the hours, do the subtraction, check whether they’ve hit the cycle reset since the last entry. Three of those steps are friction the email is an escape from. So even a perfectly-mailed Detailed Time report doesn’t replace the email loop — the work-shaped output asks the client to do the work the email was an escape from doing themselves.
3. Project budget vs. retainer cycle
Harvest’s Project Budget, the closest thing in the kit to a public retainer URL, is keyed on a project. A project has a fixed budget — e.g. 40 hours total, or $5,000 total — and the burn-down counts up against that fixed total. When the project ends, the budget is fully consumed (or not), and that’s the end of the bar. The Project Budget mental model is one-shot: a fixed cap, a single fill from zero to full, no automatic rollover.
A retainer doesn’t work that way. A retainer cycles. The cap is 20 hours this month; on the 1st, it resets to 20 hours next month; if the client used 18 of them in April they don’t carry the unused 2 forward (unless the agreement says otherwise). The status page has to show the right cycle — today’s burn-down against this month’s cap, not last cycle’s totals plus this cycle’s additions. Harvest’s Retainers tab does this internally for the freelancer’s view, but the Project Budget public link doesn’t share the cycle — it shares the project. Show that link to the client on May 5 and they see April-plus-May’s combined fill against a budget that’s longer than this month, and the answer they’re looking for isn’t legible from the bar.
What the client’s behaviour tells us
The signal is the email itself. If Harvest’s Scheduled Reports answered the hours-remaining question, retainer clients on Harvest-billed retainers wouldn’t email; they’d open the report. The fact that they email anyway — reliably, monthly, sometimes more than monthly — tells you the report isn’t in their decision tree for the question. They might glance at it on Monday morning when it lands. They might forward it to their accountant. They don’t pull it up on the 22nd to check hours remaining, because they’ve learned (correctly) that the file in their inbox doesn’t carry today’s number.
This is the same pattern as the underlying status-vs-billing confusion that makes the email recurring across all retainer setups, regardless of which tracking tool is upstream. It’s the same shape we saw in the FreshBooks portal mismatch at the billing end of the stack — a tool aimed at one job (billing) gets pressed into service for an adjacent one (status) and the client behaviour reveals the misfit faster than any feature spec would. And it’s the same pattern as the Toggl shared-report mismatch at the simpler end of the tracker spectrum, where the tool isn’t even pretending to model retainers but the same email loop appears anyway. Three different vendors, three different feature sets, the same client behaviour — because the question is on the status surface and the kit is on the tracking surface.
What a Harvest-shaped retainer status page should look like
Same Harvest data. Different render. Take the Detailed Time export — the same one you already pull for client invoicing, with Date, Notes, and Hours columns — and pass it to a layer that knows three things Harvest’s public Project Budget doesn’t:
- The cap — e.g. 20 hours / month. Now “remaining” is computable from the entries Harvest already exports.
- The cycle — e.g. resets the 1st of each month. Now “current” means today’s burn-down against this month’s cap, not last month’s leftover plus this month’s additions.
- The audience — the client, not your accountant. No Mondays-only schedule, no PDF in their inbox, no login. One page, one number, one progress bar, one cycle reset date, one work log.
That’s the whole spec. Harvest already has the time entries; the status page just reframes them into a shape the client opens at the question moment. The output is one URL per retainer, with a fat 8 hours remain at the top, a progress bar under it, the cycle reset date next to it, and the Detailed Time entries below the fold for the client who wants to see what those hours went into. No login. No portal. Not Monday morning — whenever they open it.
That’s the shape HourTab’s Harvest flow ships. You drag in the same Detailed Time CSV you already export for invoicing — the one Harvest produces in two clicks from Reports → Time → Export → CSV — we auto-map the three columns, you set the cap and the cycle once, and the URL goes to the client. From then on, re-importing a fresh CSV updates the same URL the client already bookmarked. Harvest keeps doing the tracking and budget job it’s good at; HourTab adds the public glance page that was missing.
When Harvest’s built-in tooling is the right answer
It’s worth being explicit about when the built-in Harvest retainer kit is in fact the right answer, because for some retainer shapes it is. If your retainer is a fixed-budget project (e.g. “buy 40 hours, work them down, then we re-up”) rather than a cycling cap, the Project Budget view models that exactly — one fixed total, one burn-down, one finish line — and the public Project Budget link can be pointed at the client without much ceremony. If your client is fine with a Monday-morning snapshot — some clients are, especially in steady ops retainers where the burn rate is predictable and the in-cycle question doesn’t spike — the Scheduled Report does the job.
The line is whether the question gets asked between the scheduled emails. If your client is asking the question on the 14th, the 22nd, the 28th — days that aren’t Monday morning — the Scheduled Report won’t answer them, the Project Budget link won’t resolve to the right cycle, and the email loop will resume. Knowing which retainer shape you’re running is the difference between a Harvest setup that retires the email and one that just adds another tab the client doesn’t open.
The takeaway in one line
Harvest’s built-in retainer tooling is shaped for the freelancer’s tracking job — budget bars on the Retainers tab, Scheduled Reports for ops review, Project Budgets for fixed-scope work — and that shape is correct for the job it was built for. The hours-remaining question is a different shape: it wants a cycling cap, a current burn-down, and a glance-friendly URL anyone can open at the question moment, not a tabular report on a Monday-morning push schedule. If your retainer has a cycling cap that gets pressed against, Harvest can’t answer the question your client keeps emailing about — not because Harvest is doing anything wrong, but because the question is on the client’s status surface and the kit is on the freelancer’s tracking surface. The fix is to add the status surface, not to wait for the tracking surface to grow into it.
If you bill retainers through Harvest and you recognize the loop this post is about, you can see how the Harvest-CSV-to-public-URL flow works on the integration page, or read the case for why a public URL beats a portal regardless of which tracking tool is upstream. The waitlist on the pricing section is open — free for the first retainer, no credit card — and the only email we’ll send is the one when your first share URL is ready.