Skip to content
e. eZacto.
Our storyThe priceHostedSelf-hostRelease notes
Explore the sample demo ↗

What changed

Release notes.

We build eZacto for the engagements we actually run. When one of them will not fit the software, that is the next thing we fix.

Newest first · Updated September 14, 2026

September 14, 2026

Banded engagements, end to end.

A banded engagement is one where a client buys the team for a period at a flat rate. The amount does not move with the hours, and the hours are not billed — they are covered. Most time trackers have no way to say that, so the work either gets billed twice or sits forever in a column that reads “not yet invoiced”. This release makes the whole shape expressible.

A band can cover work up to a limit

Some bands cover whatever the team does. Others cover a capacity — four hundred hours — or a budget — work worth up to a figure at list — and anything past that is ordinary time and materials on the same project. You now say which, in hours or in money, and the overflow stays billable instead of being quietly absorbed.

Work that cannot be priced stops a budget rather than passing through it. An hour with no rate is not a free hour, and a limit that treated it as one would let a project of unpriced work be swallowed whole.

A band can count every tracked hour, not only the billable ones

Under a flat amount the client bought the period, so an hour nobody ticked billable was still covered by it. Counting only the billable ones makes the engagement look cheaper to deliver than it was. This is a setting, because both readings are somebody's real practice: teams that log internal work against the client's project want it counted, and teams that keep it elsewhere do not.

Claimed against unclaimed, at the grain you are asking at

An unclaimed hour on a banded project used to be ambiguous. It could be work the band will absorb at the next invoice, work a limit left over that ought to be billed, or work nobody will ever bill. Three different situations, one signal, on no screen.

Claimed-ness is now a dimension of the detailed time report: group by it, filter to it, and open any total to see the entries behind it with their notes and the invoice that took them. A total nobody can open is a total nobody can check.

Billing cycles that do not follow the calendar

An engagement that starts mid-month invoices on that day. Reports grouped by calendar month split the work a single invoice covered across two buckets and mixed two invoices into each. Every figure describing that engagement was then a real number describing a period nobody was billed for.

Report periods now follow the engagement's own cycle, and a period carries its own start and end rather than a month name that cannot describe it.

A cost guardrail that refuses to guess

Under a flat amount, what decides whether the deal is priced right is cost against what was charged. You can set that threshold per engagement, with a default across the organisation.

The part we care most about: a period containing an hour with no cost rate reports no ratio at all, and says how many hours it could not price. A missing rate contributes nothing to the total, so a ratio computed over incomplete cost comes out lower — the deal looks healthier exactly where the data is least trustworthy. That is worse than no number, because nobody checks a figure that looks reasonable.

Filling in a band that was set up after it was invoiced

If an engagement was configured as banded after some of its invoices had already gone out, those invoices covered work they never recorded covering. The hours read as uninvoiced forever, though they were paid for.

There is now a way to correct that. It rehearses first and writes nothing — you read what it would claim, invoice by invoice, before approving it — running it twice does nothing the second time, and every claim is recorded with who made it and when. Invoice totals do not move: a band prices the period, not the hours.

Rates you can take back

Rate history is append-only, because a rate is what priced somebody's work. That is the right rule for a rate that has done its job and the wrong one for a rate thirty seconds old — particularly since adding a rate ends the one before it, so a misclick on the wrong section of the screen quietly replaces a live rate with a different number.

The current rate can now be removed while nothing has been priced from it, and removing it puts back the rate it replaced. A rate that has priced work still stays, and everything else about rate history is still unchangeable.

eZacto.

Time, exactly.

Powered byC[]NFLICT

Release notesPrivacy policy

Free guide · no signup required