Skip to Content

Hour banks: prepaid billing without the spreadsheet

Sell blocks of hours, draw them down through timesheets: the balance computes itself and the client sees it in real time

TL;DR: our Hour Bank module automates the prepaid model used by service firms. Timesheets debit the bank, invoices credit it, and the balance recomputes itself. Clients follow their balance on their portal, a detailed report goes out by email at the frequency you set, alerts warn you before the tank runs dry, and a "To invoice" sheet tells you exactly what to bill this month.

"Hour bank - Client X - v7 - FINAL(2).xlsx". If that file name rings a bell, you already know how the spreadsheet ends up: with a broken formula, two versions in circulation, and a total that no longer matches the invoicing. And when the client asks "how many hours do I have left?", the honest answer takes half a day of reconciliation.

The hour bank model, short version

For a service firm, prepaid is one of the healthiest models there is. The client buys a block, 10, 20 or 40 hours, at a favourable rate. No monthly commitment, they use it at their own pace, and they know the next request won't trigger an invoice negotiation. On your side, the cash comes in before the work, and the relationship settles in for the long run.

The model has a single enemy: tracking. Every hour worked has to come off the right block, every top-up has to add in, and everyone has to agree on the balance. It's exactly the kind of parallel bookkeeping that ends up in a spreadsheet, and tracking spreadsheets all end the same way.

The real cost of loose tracking

The topic looks administrative. It's financial. SPI Research surveys 403 professional services organizations every year and measures something we rarely look at straight on: the share of earned revenue that never gets billed. In 2024 it reached 5.3%, up 13% from the year before. Among firms with fewer than ten employees, it climbs to 6.4%.

The most uncomfortable line in the report isn't a number. It's an observation: in many cases, organizations don't even realize revenue hasn't been billed. SPI calls it a "silent killer" of profitability, and notes that the firms losing the most revenue along the way are also the ones delivering worst on time.

Indicator (SPI Research, 2024 data) Value
Earned revenue that never gets billed 5.3% (6.4% among firms with fewer than 10 employees)
Billable utilization rate 68.9%, declining steadily from 73.2% in 2021
Invoices redone due to error or client rejection 2.1%
Firms running a professional services automation tool 71.3%, down from 78.4% in 2022

That last figure deserves a pause, because it runs against the current: tooling is going backwards, not forwards. The report explains why without hedging. A surprisingly large number of firms still rely on ageing homegrown applications and spreadsheets, and Excel remains the most-used business application in the sector.

Over on the U.S. law firm side, Clio measures the same leak from another angle with the notion of "lockup", meaning how long your work takes to become cash in the bank. The median value of work performed but not yet billed sits at 43 days of revenue. And their realization rate, the share of billable work that actually makes it onto an invoice, tops out at 88%. That data covers the American market only, but the mechanism has nothing to do with law specifically: what isn't tracked rigorously ends up not being billed.

A prepaid hour bank solves a good part of this by design, since the money comes in before the work. What it doesn't solve on its own is knowing where the balance stands.

What the module automates

The principle: the hour bank is computed from what already exists in your Odoo. Your team's timesheets debit the bank, invoices credit it, and the balance is a result, not a data entry. Nothing left to maintain by hand, no more v7 FINAL.

Around that calculation, the module adds what makes the model livable day to day.

The client portal. Clients check their balance in real time, browse the full ledger line by line with the date, project, task and running balance, and download their own reports as PDF or Excel. The "how many hours do I have left?" question disappears, because the client has the answer before asking. On the security side, access is read-only and walled off to their own organization.

Automatic reports. Every week, every two weeks or every month, depending on the client, a report goes out by email in your branding, with both the PDF and the Excel workbook attached. It carries the detail of debits and credits, the running balance, a summary by project, and a month-by-month synthesis showing the consumption curve. That last one heads off a lot of phone calls: a client who sees 12 hours in March, 31 in April and 44 in May works out on their own why the bank is going down.

The "To invoice" sheet. The Excel workbook includes a tab listing everything consumed since the last credit, with the total at the bottom. It's the invoice you haven't written yet, computed for you.

Threshold alerts. Three modes exist: hours accumulated since the last invoice, percentage of an allocated budget, or the balance dropping below a floor. You pick one per bank, with as many steps as you want. The "percentage of budget" mode is the most underrated one: on a fixed-fee mandate, it warns you at 50% and 75% of the budget, so before the overrun rather than after.

Manual adjustments. Real engagements have goodwill hours, a botched entry, a block sold outside the system, a commercial gesture after a rough month. The module ships an adjustments table: a date, a positive or negative number of hours, a description. The correction shows up in the ledger under its own name, so the client sees an owned adjustment rather than a balance that moved without explanation.

Three filters to set before you trust the balance

Here's the setting that matters more than a page of features. Out of the box, the module credits the quantity of every invoice line issued to the client. A line reading "Monthly hosting, quantity 1" therefore adds one hour to the bank, which is obviously not what you want. The first thing to set is the product filter, pointing the module at your hour products and those alone.

Two other filters exist for the same reason: real client files are messy. A company filter, and a billing partner filter for clients whose accounting contact changed along the way. If you invoice from several legal entities, know that the separation is not automatic: you have to switch that filter on bank by bank. We learned that the hard way on one of our own files, where invoices issued by a former entity added themselves to a client's balance. The company filter was added to the module precisely at that point.

One last setting not to forget: name your internal recipients for alerts. Without that list, the threshold warning follows the report recipients, which means it lands with the client instead of reaching you.

The discipline it takes

The module has one dependency it fully owns: timesheet discipline. If worked hours aren't logged, the balance lies, tool or no tool. We've already written about timesheets in Odoo Community : it's the foundation the hour bank rests on.

The module counts hours, not dollars. There is no rate, no currency and no rounding rule in the balance calculation. That's coherent with the prepaid model, where the rate was negotiated once when the block was bought, but a reader expecting revenue tracking should know it going in.

Credit notes aren't taken into account: only customer invoices feed the balance. Cancelling a block already sold therefore goes through a manual adjustment, which is explicit and traceable, but still an action someone has to take. Only one alert mode can be active at a time on a given bank, so "warn me under 5 hours and at 75% of budget" isn't possible today.

Finally, the client reads your timesheet descriptions exactly as you wrote them, task names included. That is precisely the value of the portal, and it's also a requirement: your internal shorthand becomes client-facing copy.

Logging discipline is something you build with the tool, not against it. If your hours get lost between tasks, emails and sticky notes, we can look at your whole billing chain.

At Blue Fox

All of our support mandates run as hour banks, tracked by this module. Our clients see their balance on their portal, receive their periodic report, and top-ups get discussed at the right moment because the alert lands before zero. The month-end discussions about "what was done" have pretty much disappeared: the detail is in the report, line by line, with the same numbers on both sides.

The module never creates the top-up invoice for you. It warns you, you confirm with the client, and you invoice after that, because a surprise invoice is the worst way to renew a block. Every send and every alert leaves a trace in the record, with the exact file that went out, which settles "I never received that" conversations in advance.

And since everything lives in the same system, the chain is complete: the timesheet logged on the task debits the bank, which feeds the report, which prepares the invoice. If your invoicing still runs in software separate from your projects, our comparison of Odoo with Sage 50, Acomba and QuickBooks gives the full picture.

If your hour banks live in a spreadsheet that's scary to open, let's simplify your invoicing.

Sources

Supplier invoices: AI does the data entry for you
Our OCR module reads your PDF invoices, fills in the supplier, the dates and the line details, applies your taxes, and leaves you the final say