Blog
Billing

Fixed-Price vs. Time & Material vs. Retainer: Picking the Right Billing Mode Per Project, Not Per Agency

SparkyMinis Team 26 Aug 2026

Picture a small dev agency with three client engagements running at once: a fixed-scope website rebuild quoted at a flat number, an ongoing feature-development contract billed by the hour, and a maintenance retainer where the client pays a set monthly amount for up to a certain number of hours. Three completely different ways of being paid, running in parallel, inside the same four-person team.

If your project tool assumes every client gets billed the same way, you end up tracking two of those three engagements in spreadsheets on the side, because the "real" system only understands one billing style. That's a common failure mode for small teams — not because anyone chose it, but because the tooling forced a single model and the spreadsheet crept in to cover the gap.

Billing mode as a property of the project, not the agency

SparkyProjects treats billing mode as something you set per project, at creation, alongside the project's own budget, hourly rate, and currency. The options are Internal, Fixed Price, Time & Material, or Retainer — the last two requiring a Plus or Max plan. Nothing about picking Fixed Price for one client locks you into Fixed Price for the next. The agency running all three engagement types above just sets each project up the way that project actually gets billed, and none of them affect each other.

That sounds obvious written down, but it's the exact thing a lot of general-purpose project tools get wrong — they treat "how do we bill this" as an account-level setting rather than a project-level one, which works fine until an agency (basically all of them, eventually) needs to run more than one billing style at a time.

What each mode is actually tracking

Fixed Price tracks a budget — you agreed to a number, and the project tracks against it. Time logged on a fixed-price project still matters (it's telling you about margin — are you spending more hours than the fixed number was actually worth?), but it isn't the invoice. The invoice was already decided.

Time & Material tracks an hourly rate, and billable time logged against the project is, more or less directly, what gets invoiced. This is the mode where the billable flag on each time entry does the most obvious work — every hour marked billable is revenue, every hour marked not-billable isn't, and that distinction has to be made correctly as the work happens, not reconstructed later.

Retainer needs something neither of the other two modes does: a monthly hour allowance as a first-class number, not a budget you eyeball. A retainer client isn't paying per hour and isn't paying a lump sum for defined scope — they're paying a set amount for access to up to a certain number of hours a month, and the number that actually matters is utilization against that allowance, visible on Reports. A retainer running at 40% utilization in week three of the month is a very different conversation than one running at 95%, and that's not something a generic "logged hours" view tells you on its own — it has to be tracked against the allowance specifically.

Internal is the fourth option, for work that isn't billed to a client at all — the agency's own website, an internal tool, R&D time. It exists so that not every project has to pretend to have a billing relationship it doesn't have.

Currency comes along for the ride

Each project also carries its own currency, which matters the moment an agency has even one client outside its home country — increasingly the default for small dev shops, not the exception. A project can run entirely in a client's local currency, and reports roll everything back up to your organization's base currency for the aggregate view. Nobody has to run a side conversion spreadsheet to know what a foreign-currency retainer actually adds up to in the currency the agency itself reports in.

Why keeping these separate on reports matters

A fixed-price total and a retainer's utilization percentage are answering two different questions, and putting them on the same chart tells you neither. One is "did we come in under the number we quoted." The other is "is this client using what they're paying for, or leaving hours on the table." SparkyProjects' Reports break down by billing mode specifically so those numbers don't get blended into something that looks precise but means nothing.

How to do this in SparkyProjects

When creating a new project, pick a billing mode up front — Internal, Fixed Price, Time & Material, or Retainer (Time & Material and Retainer need Plus or Max). Set the budget, hourly rate, or monthly hour allowance that matches whichever mode you picked, along with the project's currency. You can change billing mode later from the project's detail page if a client relationship's terms change. Check Reports to see utilization, margin, or billable totals broken out by mode rather than lumped together.

See which billing modes and reporting features are included at each plan tier on the features page.

Running three billing styles at once isn't an edge case for a small agency — it's closer to the median week. The tool that assumes otherwise is the one that eventually loses to a spreadsheet.