Case study · Construction billing
LiveAn AIA pay application engine that matches the contractor's own file to the cent
Pearl Street Systems bills progress on multi-million dollar electrical jobs using AIA forms, where every invoice depends on the last one and the spreadsheet holding the chain lives with one person. We built the engine that produces those invoices, and proved it at 0.0000% drift against their real file.
Live in production
This is a live system at Pearl Street Systems, an electrical and lighting contractor. Every number below was measured against their real project files before the engine touched a live pay application. Contract values and job names that identify their customers are not published.
0.0000%
Drift between our export and their file
33/33
Schedule of values lines to the cent
$4.1M
Real contract it was proven against
About the company
Pearl Street Systems is an electrical and lighting contractor running multi-building commercial jobs. Their work is billed the way most of commercial construction is billed: on AIA forms, which are the American Institute of Architects pay application documents. The G702 is the summary page. The G703 is the line-by-line continuation sheet behind it.
The money on a job like this moves in draws. You bill a percentage of each line as the work gets done, the general contractor holds back retainage, which is a percentage kept back until the job is finished, and every invoice reconciles against the one before it. Line 7 of this application is line 6 of the last one. It is a chain, and it runs the length of the project.
The problem
The owner did not describe an AI problem. He described an invoice control problem. On a large multi-building job the company might send ten to twenty invoices over the life of the project, each one depending on the last. The workbook holding that chain is a spreadsheet, and the spreadsheet is maintained by hand, by whoever has been doing it.
That creates two failures that have nothing to do with technology. The last spreadsheet gets lost or gets hard to reconstruct, and rebuilding months of billing history from PDFs is a bad week. And the person who can do it is one person, so the company's ability to bill is bounded by their availability.
There was a second problem underneath it, and it is the one that decides whether any software is usable here. The general contractor has been accepting Pearl Street's billing file for years. Hand them something that looks different and you have created a conversation about your software instead of about your invoice. So the constraint was not just correct numbers. It was an identical document.
The pain was never AI. It was that ten to twenty invoices depend on each other and the last spreadsheet is the only thing holding the chain.
The solution
We built the pay application engine. It imports the export from SnapCount, which is the estimating and takeoff software the money actually lives in, builds the schedule of values from it, and generates each pay application as a draw against the contract, reconciled to the previous application.
The rule underneath the whole build: every dollar is computed by code, never by a model. A language model is genuinely good at reading a messy field note into a structured line item. It has no business adding up a schedule of values, and it has less business computing retainage. So the model reads and organizes, the arithmetic runs in tested functions, and a person signs the application before it reaches the general contractor.
Then we proved the document. Not the numbers, the document. Two renders of the same pay application, ours and theirs, compared cell by cell: 1,290 printed cells checked for value across the G702, the G703, and the schedule of values, and 2,816 cells checked for style, meaning fonts, borders, number formats, and conditional formatting. The parity gate is part of the build, so a change that breaks the format fails before it ships.
Before it touched a live invoice, we ran five simulated months of a real job through it, a full lifecycle from notice to proceed forward. That exercise found a real change-order bug. It found it in a sandbox, in front of us, rather than on a pay application in front of the client.
The impact
The engine reconciled 33 out of 33 schedule-of-values lines to the cent against a real $4,104,700 contract, and the exported workbook matched the company's own file at 0.0000% drift. You can put the two documents side by side and the only thing that differs is nothing.
What that buys is not really speed, although it is faster. It is that the invoice chain now lives in a system instead of in a spreadsheet and a person's head. The chain can be reconstructed, the draws reconcile automatically, and a second person can produce a pay application without reconstructing months of history first.
The next module is the one the owner actually asked for first: a command center across every active job that red-flags when billing and installed progress drift apart. Billed 50 percent against installed 90 percent is a conversation worth having before the general contractor has it with you. The cross-reference agent that does this passed 44 out of 44 checks, and the part we were most pleased with is that it correctly stayed quiet at 93 percent billed against 92 percent installed, because that is noise and a system that cries wolf gets ignored.
What he wanted was a red flag when billing and installed progress drift apart. Billed 50 percent, installed 90 percent, and nobody said anything.
Under the hood
How the system actually runs.
The engine takes the estimating export, builds the schedule of values, and generates each pay application against the one before it. Every dollar is computed in code, never by a model. The invoice is drafted, and a person signs it before it reaches the general contractor, because a wrong number at that point is not a bug report, it is a phone call.
What goes in
- The estimating export, where the money lives in one tab of a seven tab workbook
- The contract value, the retainage rate, and any change orders since the last draw
- The prior pay application, because line 7 of this one is line 6 of the last one
What the system does
01
Build the schedule of values
The contract broken into billable lines: material, labor, mobilization, recycling. Structured once, reconciled against the source to the cent.
02
Compute the draw
Percent complete, previously billed, balance to finish, and retainage. All of it in tested code. No model touches an arithmetic operation.
03
Render the workbook
G702 summary and G703 continuation sheet, in the exact format the general contractor already accepts. Fonts, borders, and number formats included.
04
Gate on parity
Every printed cell checked for value, every cell checked for style, against the company's own file. The build does not pass if anything differs.
Human checkpoint
A person reviews and signs the pay application before it leaves the building. The system never sends an invoice to a general contractor on its own.
What comes out
A G702 and G703 workbook that is screenshot-identical to the file Pearl Street has been sending for years, produced in minutes instead of an afternoon.
Results
The numbers, plainly.
- 0.0000% drift between the generated pay application and the company's own file.
- 1,290 printed cells value-verified across the G702, the G703, and the schedule of values.
- 2,816 cells checked for style with zero differences: fonts, borders, number formats, conditional formatting.
- 33 of 33 schedule-of-values lines reconciled to the cent against a real $4,104,700 contract.
- 44 of 44 checks passed by the cross-reference agent, including correctly staying quiet at 93% billed against 92% installed.
- 30 of 30 on a five-month simulated job lifecycle, which found a real change-order bug before a client ever saw it.
- Every dollar on every invoice computed by code, not by a model. That is a design rule, not a result, but it is why the results above exist.
More work
Other systems we built.
Read next
The thinking behind the work.
Get started
Talk through your billing workflow
Book a 30 minute call. We find the one place your work waits on you, and you get a straight answer about whether AI is the fix. No pitch, no deck.