WIP and accounting exports
Work in progress and job cost for one project or the whole company, and the reviewed CSV file that hands a month to accounting
Two things close a month: the WIP schedule, which says where the job stands, and the accounting export, which hands the month's records to whatever system keeps the books.
The WIP schedule
WIP Schedule in the Period Reports group reports one project: what it is worth, what it will cost, how far through it is on cost, and whether billing is ahead of or behind the revenue earned.
It renders as a statement in four groups rather than as a thirteen-column table, because a single row under thirteen headers is a lot of horizontal scrolling to read one job. The horizontal table is the portfolio.
Reading it needs Invoicing READ_ONLY. Individual figures also need READ_ONLY on Contracts, Budget or Direct Costs depending on where they come from.
Contract
| Line | What it is |
|---|---|
| Contract value | Original value plus executed owner change orders, across executed and complete prime contracts |
| Billed to date | Certified, on the figures the owner agreed rather than the ones applied for |
| Billed this period | |
| Retention held by the owner | From the latest certified application |
Contracts that are not counted, because they are unsigned or terminated, are counted back and named beside the figure.
Cost
| Line | What it is |
|---|---|
| Estimated cost at completion | The current budget's revised budget total, plus the certified adjustment |
| Costs incurred to date | Approved subcontract billing plus approved direct costs |
| Cost to complete | Estimated cost at completion less costs incurred to date |
Costs incurred is composed from two LEDGER registers, not from a general ledger. There is no payroll feed, no accounts-payable feed and no ERP import behind it. It is what your approved subcontractor invoices and approved direct costs say.
Earnings
Percent complete is on a cost basis: costs incurred divided by the estimate at completion. Earned revenue is the contract value at exactly that percent, so the printed percent is the operand and a controller checking by hand finds contract value times percent equals earned revenue.
| Line | What it is |
|---|---|
| Percent complete | Costs incurred divided by estimate at completion |
| Earned revenue | Contract value at that percent |
| Estimated gross profit | Contract value less estimate at completion |
| Estimated fee remaining | Estimated gross profit less the profit already earned |
Percent complete is not clamped: a job whose costs have run past its estimate reads above 100%. If the estimate at completion is zero or negative, the percent is Not stated rather than 0%.
Position
The billing position is one of two lines, whichever applies:
- Billings in excess of costs and estimated earnings, when billed to date exceeds earned revenue.
- Costs and estimated earnings in excess of billings, when earned revenue exceeds billed to date.
Backlog is contract value not yet earned.
Nothing on this page is coloured as good or bad, and no ratio is compared to a threshold. An overbilling is a financing position, not a finding.
The estimate adjustment
Exactly one figure on the WIP schedule is entered by hand: the estimate at completion adjustment. It rides on top of the live budget rather than replacing it, it is signed, and a written basis is required. Recording one needs Invoicing STANDARD plus the administer-invoicing permission.
The schedule warns when the estimate predates the period being reported, and when it has never been certified at all.
When a figure cannot be shown
Every figure resolves to a value or to one of three refusals, and they stay visually distinct because they send you three different places:
| Label | Cause | Where to go |
|---|---|---|
| Not shown | You lack the tool permission behind it | An administrator |
| Could not be read | The read failed | Support |
| Not stated | An input has not been entered | Whichever input is missing |
A refusal cascades: any figure computed from an unavailable one is unavailable
too. No figure is ever rendered as $0.00 because something could not be read.
Snapshots
Snapshot this period freezes what the schedule said, as a record. Snapshots are immutable, and a snapshot is re-masked when you read it, so a reader only sees the figures their own permissions allow.
A project can hold up to 500 snapshots.
The WIP portfolio
Settings → WIP portfolio under Account management reports the same schedule for every project in the company, on one table. It is the surety schedule.
This surface is gated on organization OWNER or ADMIN, not on project permissions, and that is a deliberate decision with a consequence worth stating plainly: an organization owner or admin reads contract values, cost plans and margins on projects whose per-project permission set would refuse them. A plain organization member is refused, and so is a project administrator with no organization role.
No project is filtered out. An archived or completed job is still under contract until it is closed out, so every project appears with its status.
The totals strip is all or nothing. If any row failed or is partial, the totals are withheld and the projects responsible are named, split by cause: a read that failed goes to support, and a figure that was never stated is usually a job with no cost plan entered.
There is no portfolio percent complete. A ratio of ratios is not a ratio.
The portfolio also reports how many projects have a stale estimate at completion, a current one, one never compared, one never certified, and how many are unknown.
Up to 250 projects are reported.
Accounting exports
Accounting Exports is the seam through which financial records leave for an accounting system: a file, in one direction, reviewed and accepted by an accounting approver before it exists.
The scope note on the surface says it outright:
Exports leave this platform as a file, in one direction. Nothing here connects to an accounting system, reads one, or learns what happened to a file after it was downloaded.
There is no integration, no push, no sync, and no inbound path. No accounting product is named anywhere, because the file is a generic CSV rather than a vendor-specific format.
What can be exported
Three object types, in dependency order:
| Object type | Label |
|---|---|
cost_code | Cost Codes |
vendor | Vendors |
sub_invoice | Subcontractor Invoices |
Commitments and commitment change orders are not in this version.
Vendor tax ids are not in the vendor file.
Batches
An export batch is an immutable staged snapshot of source records plus a review decision.
| Status | Label | Meaning |
|---|---|---|
draft | Draft | Being assembled |
ready | Ready to export | Submitted for review |
staged | Staged | Accepted. Terminal |
rejected | Rejected | Refused. Terminal |
Actions: Submit (Draft to Ready to export), Accept (Ready to Staged), Reject (Ready to Rejected). Neither terminal state has an edge out.
The word "staged" is load-bearing. A batch never reaches "posted", "synced" or "exported to", because the platform cannot know what the receiving system did with the file. Staged carries an information badge, never a success one.
Individual records within a batch carry their own verdict: Awaiting review, Staged or Rejected.
The file
Download the CSV from a batch. One file per object type, named for the object type and the batch.
- UTF-8, no byte-order mark, CRLF line endings, RFC 4180 quoting.
- One header row.
- Booleans are
YandN. Dates areYYYY-MM-DD. An absent value is an empty field, never the word "null". - The rows of one bill sum to the amount due.
Text that would otherwise be read as a formula by a spreadsheet is prefixed with an apostrophe. Amount columns are excluded from that treatment, so no figure is ever mangled.
The bytes are not stored. The file is rebuilt deterministically each time it is downloaded, and every download is audited, including a fingerprint of the exact bytes, because bytes leaving the platform is the event worth recording.
Records that have not changed since a previous batch stay in the file, flagged as unchanged rather than being filtered out. What you send is a complete picture, with the disclosure attached.
External ids are up to 10 characters of uppercase letters, digits and hyphens, derived deterministically. An id collision refuses the whole batch and names both sources rather than quietly disambiguating with a suffix.
A truncated source read refuses the batch. An export is the one place in LEDGER that refuses rather than degrading, because a partial file that looks complete is worse than no file.
Who can export
Reading the register needs Invoicing READ_ONLY. Creating, accepting, rejecting or downloading a batch needs the accounting approver capability: Invoicing ADMIN, or the administer-invoicing permission.
Creating a batch also needs READ_ONLY on every tool the object type reads from:
| Object type | Also needs |
|---|---|
| Cost Codes | nothing further |
| Vendors | Directory, Commitments |
| Subcontractor Invoices | Commitments, Directory |
A missing tool produces a refusal that names it.
Limits
| Limit | Value |
|---|---|
| Contracts read per WIP row | 250 |
| Snapshots per project | 500 |
| Estimate-adjustment basis text | 2,000 characters |
| Projects in the WIP portfolio | 250 |
| Records per export batch | 2,000 |
| Export batches per project | 500 |
| Rejections per batch | 200 |
| Rejection reason | 500 characters |
Troubleshooting
Percent complete says Not stated. The estimate at completion is zero or negative, usually because no budget has been entered. The product will not print 0% for an undefined ratio.
The WIP portfolio totals strip is missing. At least one project's row failed or is partial. The projects are named above the table, split by cause.
A figure says Not shown. You lack Contracts, Budget or Direct Costs READ_ONLY on that project. Ask an administrator.
Creating an export batch is refused with a list of tools. You need READ_ONLY on each of them for that object type.
An export batch is refused for an id collision. Two source records resolve to the same external id. The refusal names both. Rename one.