LEDGER
Run the money on a job. Budgets, prime contracts, buy-out, change management, billing, retainage and WIP, all filed against one set of cost codes
LEDGER is the cost and contract side of Struxen. It is paid: not in the CORE free tier, and not bundled into the $500 organization fee. It holds what the job was sold for, what it was bought out for, what changed, what it has cost, what has been billed in both directions, and what is being held back. Every register is scoped to one project, and every register files its records against the same budget codes, so a dollar entered once shows up everywhere it belongs.
Open it from LEDGER in the left rail. The landing page is a tool tray, one card per module, grouped the way the rail groups them. Prime Contract, Commitments, Changes and Direct Costs carry a live count, and each of those asks the same route its register reads, so a number on a card can never disagree with the page it opens. A register that could not be read shows no number rather than a zero. Budget carries no count and says so: its read recomputes the whole column matrix and returns a matrix, not a total a card could name.
This is your money, not your Struxen bill
LEDGER accounts for the construction project's own costs: your owner contract, your subcontracts, your invoices, your retainage. What you pay Struxen for the platform is a completely separate thing and lives in Billing. The two use the same words ("invoice", "billing period", "credits") and share nothing else. Never read a figure from one as if it came from the other.
The money model
Three ideas hold LEDGER together.
Budget codes. A budget code is the filing key for every dollar in the
product. Your company defines the shape of a code as an ordered list of
segments (phase, cost type, contract item, and anything else you use), and each
segment carries the values it may take. A budget code is one value per segment
joined into a flat string like 000100-3-01-001. Budget lines, commitment
lines, change-order lines and direct costs all carry one. See
Cost codes.
One register per kind of record, one column engine over them. The Budget register is where the registers meet: each of its source columns is an aggregate pulled from another module, filtered by that module's own status rules, and landed on the budget line whose code the record carries. Committed Costs comes from executed commitments. Direct Costs comes from approved direct costs. Approved COs comes from the change chain and from executed prime-contract amendments.
Money is exact. Every amount in LEDGER is stored and computed as a whole number of cents. Nothing is held in a floating-point number and no total is produced by adding decimals. Rates are stated in basis points, so 5% is 500 and 5.5% is 550. Unit costs are the one exception to the cents rule: they carry four decimal places, because construction unit pricing is quoted finer than a cent.
What is in LEDGER
The rail groups the modules the way the money moves.
| Group | Modules | Read about it |
|---|---|---|
| Contracts | Prime Contract | Prime contracts |
| Contracts | Commitments, Commitment Change Orders | Commitments |
| Contracts | Changes, T&M Tickets | Change management |
| Contracts | Direct Costs | Direct costs |
| Budget & Cost | Budget | Budget |
| Billing | Billing Periods, Invoices | Billing periods and invoices |
| Billing | Pay Applications | Pay applications |
| Billing | Retainage, Lien Waivers | Retainage and lien waivers |
| Billing | Accounting Exports | WIP and accounting exports |
| Period Reports | WIP Schedule | WIP and accounting exports |
| Period Reports | Contingency Report | Change management |
| Period Reports | Equipment Report | Direct costs |
Two more surfaces sit in Settings rather than in the rail, because they are company-wide rather than per-project: the vendor directory and the cost-code structure.
A typical order of work
- Set up your company's cost-code structure once, in Settings → Cost codes.
- Record the prime contract and its schedule of values.
- Load the budget, then Lock budget at buy-out so the baseline stops moving.
- Buy the job out as commitments against vendors in the directory.
- Run change events as they arise, price them, and promote the approved ones into owner change orders.
- Enter direct costs and T&M tickets as the work happens.
- Open a billing period each month, take subcontractor invoices into it, and bill the owner with a pay application for the same month.
- Close the period. Read the WIP schedule. Hand the month to accounting.
Who can see what
Every LEDGER surface is gated by a project tool permission, and the financial tools default to NONE on every seed role except Project Manager. This is deliberate: the budget register puts revised budget beside committed costs line by line, which is the contractor's margin.
| Tool | Project Manager | Superintendent | Sub / Collaborator | Owner Read-Only |
|---|---|---|---|---|
| Contracts | ADMIN | NONE | NONE | NONE |
| Commitments | ADMIN | READ_ONLY | NONE | NONE |
| Changes | ADMIN | READ_ONLY | NONE | NONE |
| Direct Costs | ADMIN | STANDARD | NONE | NONE |
| Budget | ADMIN | NONE | NONE | NONE |
| Invoicing | ADMIN | NONE | NONE | NONE |
Sub / Collaborator is the default template for a new project member, so a newly added person sees no LEDGER data until someone grants it. An organization OWNER or ADMIN resolves to full access on every tool, on every project in their own organization, without being staffed on the job.
Rail rows stay visible regardless. Clicking one you have no permission for returns a refusal, not an empty register. See Permissions for how templates and granular permissions work.
Rules the whole product follows
Unavailable is never zero. If a register cannot be read, or a budget source
module fails, or you lack permission for one part of a composed view, that
figure renders as unavailable with a stated reason. A cell showing $0.00
always means a service answered zero.
Approved records are frozen. An approved change order, an approved pay application, an executed amendment, an approved direct cost: none of these can be edited. The correction is a new record that moves the money back, so both facts stay on the file.
A truncated read is a refused read. Where a register's scan window is cut, the count is reported as unavailable rather than as a smaller number, and composed reports refuse rather than sum a partial set.
Concurrency is checked. Every write that moves a total carries the version you loaded. If someone else saved first you get a conflict and nothing is written, rather than a silent overwrite.
AI in LEDGER
Eight affordances call a model, and every one of them produces a preview a human confirms. None writes a record on its own.
| Where | What it does |
|---|---|
| Cost codes | Maps a legacy code list onto one of your segments |
| Prime contract | Reads a schedule of values out of the executed PDF |
| Prime contract | Reads the commercial terms out of the executed PDF, with page citations |
| Commitments | Reads a subcontract or PO into a draft commitment |
| Changes | Drafts change-order lines from the event's evidence |
| Direct costs | Reads a receipt into a draft cost |
| Vendors | Reads a certificate of insurance into policy lines |
| Budget | Flags anomalies in the register and writes a cause sentence for each |
These are metered AI operations and they draw on the project's credit pool. Budget anomaly flagging is a special case worth knowing: the flags themselves are found by plain arithmetic and are correct whether or not the model answers. Only the explanatory sentence is generated.