Nine days to two — what month-end close actually looks like
The Excel wasn't the problem. The meetings were.
A private oil & gas operator in West Texas closed their month in nine business days. Nine people, nine copies of an Excel workbook, reconciliation handled by meeting. The CFO wanted two days. Before we were brought in, two other firms had scoped a full Excel replacement — both at north of $1M, both on twelve-month timelines.
We quoted $240K and delivered in three months. Close ran in two days on the first month-end. Thirty-six hours by the third. Here’s what we actually built, and the decisions that made it work.
One source of truth, ownership enforced at the database
The problem wasn’t calculation — it was divergence. When nine people maintain nine copies of the month, any one of them can be authoritative, which means none of them are.
We built a single postgres-backed revenue run model with hard ownership boundaries. Division orders are editable only by accounting; the revenue team sees them read-only. Revenue calculations are derived, not stored — run against the division orders as of a specific timestamp. Disbursements lock once the CFO approves the run, and from that point the only path to a change is a reversing entry, which creates an audit trail.
The one new architectural idea is a posting_period table that makes “this month is closed” a state the database holds — not an email the CFO sends. Writes against a closed period fail at the constraint layer, not the application layer. That’s the whole move. Most of what followed was work that used to happen in email, now happening in a database that enforces the rules.
Keep Excel where Excel was earning its keep
Every time we’ve replaced a spreadsheet workflow, we’ve had the same conversation with the team two weeks in: “I could do this in Excel in thirty seconds.” Usually they’re right. Those workbooks had been honed over a decade by people who knew what they were doing.
So Excel stays in the workflow — as a view, not as a source of truth. Every screen in the app has a “download to xlsx” export that outputs the underlying revenue run in the exact column order the team used in their old workbooks. Analysts still pull data into Excel for ad-hoc work. They just can’t commit Excel back as the book of record.
That one design call — Excel as a thinking tool, database as the authority — is why the team actually adopted the system. Replacements that demand the team give up Excel entirely tend to quietly fail six months in, when the accountant who actually knows how the numbers work opens a new workbook in her downloads folder and starts maintaining the real version there.
Reconciliation as a continuous screen
The old workflow’s slowness lived in the reconciliation meetings. The first half of business day eight was always a three-person meeting: CFO, revenue accountant, division-order analyst, reconciling three versions of the month before anything could close.
We rebuilt that meeting as a screen. Each revenue run has a live reconciliation panel — variance against last month by owner, by well, by product. Unexplained variances of two percent or more get flagged, and the analyst has to either re-run with a correction or annotate the variance with a note before the run can be submitted for approval.
The panel is the thing that used to happen in the meetings. Same math, same people, same questions — now running continuously against the live data instead of on the morning of business day eight, against three competing copies.
What was actually hard
The architecture fit on a napkin. The posting-period lock, the ownership boundaries, the reconciliation panel — none of it was novel engineering. We’ve built variants of all three before.
What was hard was getting three stakeholders to agree on what a closed month meant. Specifically: at what timestamp is a division order “as of” a run? What happens to prior-period accruals when a disbursement is reversed? Who owns the decision to release a partial run when one owner’s wire hasn’t cleared? Each of those questions had three answers in the room, and the build couldn’t proceed until one of them was the answer.
That’s usually how these go. The architecture takes a napkin. The organizational agreements take a quarter.
The calculations were fine. The reconciliation was the product.