Budget Ledger
Every dollar that lands on a project's budget shows up here as a dated line: who or what it came from, which project and cost code it's tagged to, and — if it was later corrected — the full before/after trail. You don't create entries on this page; the system posts them automatically as timesheets are approved and other cost events happen, and this is where you go to check, filter, and explain them.
Who can use it — You need "View Budget Ledger" permission to open the page at all. The ledger itself is fully read-only: there's no create, edit, or delete action anywhere on it, for anyone. See Roles & Permissions for how access is set.
Where to find it — Costs & Budget → Budget Ledger in the sidebar. It's also one click away from Budget Overview via the Open Budget Ledger quick action.
How to use it
The table lists one row per posted cost entry, newest first:
- Date — the transaction date the cost belongs to (not the date it was posted).
- Type — a badge: Overhead, Labor, or Asset (subcontractor, material, and float rows also appear here tagged with their own type).
- Adjusted — a tick if this entry has since been corrected by an adjustment.
- Cost Code — the cost code the entry is tagged to, if any.
- Project — hidden by default (toggle it on); shows "Untagged" for entries with no project.
- Effective Cost — the amount that actually counts today (after any adjustment).
- Original Cost, Adjustment Δ, Batch ID, and Posted are hidden by default — toggle them on from the column picker for a deeper look.
Use the filters to narrow down: Type (Overhead / Labor / Asset), Project, Adjusted rows (adjusted only / no adjustments only), and a Date Range.
Two row actions give you the detail behind a number:
- Explain Calculation — opens the inputs and outputs the system used to price that row (hours, hourly cost, rate breakdown, fuel pricing, etc.), plus the raw snapshot payload for a full audit trail. If you don't hold "View pay rates" permission, hourly rate figures are redacted here rather than shown.
- Adjustment History (only shown once a row has been adjusted) — lists every reversal/replacement pair posted against that entry, with the date, kind, cost change, reason, and batch ID. Adjustments are never edited or deleted — the chain is kept in full, and the ledger row always reflects the latest replacement amount.
How entries get posted
Nothing on this page is typed in by hand — every row is posted automatically by the budget engine, triggered by an approval or completion elsewhere in the app:
- Labor — from approved timesheet entries, priced against the worker's pay rate for that date (including penalty hours, allowances, and travel time). Workers marked "exclude from payroll" don't get a labour row — their cost is captured in a combined overhead entry instead.
- Asset — from the machine or vehicle hours on the same approved timesheet entries, priced against the asset's cost profile and fuel rate (using actual prestart litres when recorded, otherwise a per-hour estimate). Hours-based plant lines on a Signed or Distributed day-works docket also post here as their own asset row on the day the docket was signed or distributed.
- Overhead — one company-wide row per day, built from your active overhead cost entries amortised down to a daily figure.
- Subcontract — posted when a subcontract claim or a subcontractor work-log invoice (RCTI) is approved.
- Material — posted from approved supplier invoice lines.
- Float — posted when a float booking is marked completed.
Posting runs automatically — fired the moment a timesheet is approved, and again on an hourly schedule to catch everything else and reconcile any drift. If an underlying input changes after a row has posted (a worker's pay rate is corrected retroactively, or an asset's cost profile is updated), the system re-prices the affected historical rows itself and posts a reversal + replacement pair rather than editing the original — that's what shows up under Adjustment History. There's no manual "add an adjustment" action on this page.
If posting for a date fails (commonly missing pay or asset cost setup) it shows up as a readiness item on Budget Overview, with a Retry failed batches action for whoever holds "Manage budget period locks".
What feeds the ledger
The ledger only prices correctly if these are kept current. None of them live as tabs on this page — they're separate setup screens, reached from Budget Overview's quick actions or their own hub pages. Viewing any of them needs "View Budget Tracking" permission; editing needs the specific manage permission noted below.
Cost Codes
Short identifiers (e.g. OH-PLANT-DOZER) used to tag and group ledger rows — up to two levels deep (a parent code and children under it), with an optional default project. A handful of system codes are seeded and locked (you can rename the label but not the code or grouping); codes you add yourself can be fully edited or deactivated. Lives on the Overhead page. Requires "Manage Cost Codes" to create or edit.
Overhead Categories & Overhead Entries
Overhead Categories group your fixed costs (e.g. insurance, rent, admin wages). Overhead Entries are the actual dollar figures — a label, a category, a Period Type (daily/weekly/monthly/annual/one-off), a net amount, tax rate, and an effective date range. The system amortises each entry down to a daily rate and rolls every active entry up into the single company-wide Overhead row posted each day. Overlapping date ranges for the same category are rejected. Both live on the Overhead page. Requires "Manage Overhead Settings" to create or edit.
Fuel Rates
Price per litre by fuel type (diesel, diesel w/ AdBlue, unleaded, 2-stroke), or a blank fuel type as a fallback rate — each with an effective date range. Adding a new open-ended rate automatically closes out the previous open-ended rate for that fuel type the day before, so ranges never silently overlap. Lives on the Asset Costs page. Requires "Manage Asset Cost Profiles" to create or edit.
Asset Cost Profiles
Per-asset daily ownership cost and hourly service cost, each effective-dated. Ownership can be entered manually or calculated from the asset's compliance records (registration, insurance, finance, lease); service cost can be manual or calculated from the asset's service records. A "Already Included in Ownership Cost" checklist lets you suppress operator wages, fuel, or servicing from that asset's budget rows where they're already baked into the ownership figure, to avoid double-counting. Lives on the Asset Costs page. Requires "Manage Asset Cost Profiles" to create or edit.
Connected pages
- Budget Overview — the dashboard view of everything this ledger feeds: daily burn, trends, composition, and readiness issues, plus quick links out to every setup screen listed above.
- Overhead — manage Cost Codes and Overhead Categories/Entries.
- Asset Costs — manage Fuel Rates and Asset Cost Profiles.
- Projects — the projects ledger rows are tagged against.
- Day Works Dockets — signed/distributed dockets whose hours-based equipment lines post as asset entries here.
Tips & common mistakes
- Can't find a create/edit button — there isn't one. The ledger is a system-generated record; fix the underlying source (timesheet, cost profile, overhead entry) instead of trying to edit a row directly.
- A number looks wrong — use Explain Calculation first. It shows exactly what hours, rates, and formula produced the figure, so you can tell whether the source data or the setup is off before assuming a bug.
- A row is marked Adjusted — that's normal, not an error. It means an underlying input (a pay rate, an asset cost profile) changed after the fact and the system re-priced it. Open Adjustment History to see the reason and the batch it belongs to.
- Rates showing as redacted — that's the pay-rate visibility gate, not missing data. You need "View pay rates" permission to see raw hourly figures in Explain Calculation.
- Missing labour cost for a worker — check whether they're flagged "exclude from payroll"; their cost is folded into the overhead entry instead of a per-person labour row.
- A day-works docket's plant hours aren't showing up — they only post once the docket reaches Signed or Distributed status, and only for equipment lines billed in hours.