Phu Luong Hoang's Work | ContraWork by Phu Luong Hoang
Phu Luong Hoang

Phu Luong Hoang

Automation — systems that run themselves

New to Contra

Phu is ready for their next project!

Cover image for A client's report had a
A client's report had a total that didn't match its own detail. Nobody had caught it. Not because anyone was careless - checking it by hand meant re-adding hundreds of lines, so nobody ever did. I re-added them. The gap was ~$83K. Large enough to distort every pricing decision downstream. Small enough, next to a total that size, that it would never announce itself. It sat among six other lines that reconciled perfectly. But the finding isn't the point. Findings are one-time. What I built was the layer that catches that class of error automatically, every period: every stated total re-added from its own underlying detail, and only the mismatches surfaced. 512 lines checked in 4 seconds. One needed a human. Screenshot below is that layer, running on sample data. This is the honest case for reconciliation automation. Not tidier spreadsheets. Catching the number that would have cost real money. What's the most expensive error you've found hiding in a spreadsheet?
0
7
Cover image for Forms That Block Bad Data
Forms That Block Bad Data Before It Enters Most teams clean their data after the fact. That's the expensive way - by the time a bad record surfaces in reconciliation, someone has already acted on it. I moved the checking to the point of entry. Every field validates live against a real source: record IDs against the live register, partner names against an approved whitelist, hour limits against the signed agreement, dates against the term calendar. The form won't submit until it's clean, and the error message says exactly what to fix rather than just going red. Result: 47 bad entries stopped at source in a single term. Each one is an email chain that never had to happen, and a correction that never had to be made downstream. The economics are simple. Catching an error at entry: 0 minutes. At reconciliation three weeks later: 25 minutes. After the partner has acted on it: hours.
0
12
Cover image for The Reconciliation Layer That Caught
The Reconciliation Layer That Caught an $83K Error A client's reporting had a summary total that didn't reconcile against its own underlying detail. Nobody had caught it, because checking it by hand meant re-adding hundreds of lines — so nobody ever did. I re-added them. The gap was roughly $83K: large enough to distort pricing decisions downstream, small enough relative to the total that it would never have announced itself. The same pass surfaced two things the existing reports had never made visible: margin was sitting barely above break-even, meaning protecting margin mattered more than chasing volume; and the business was profitable while operating cash flow ran negative. What I delivered wasn't the finding — it was the layer that catches it automatically from now on: totals validated against their own detail every period, with only the exceptions surfaced. This is the honest argument for reconciliation automation. Not tidier spreadsheets. Catching the number that would have cost real money.
0
16
Cover image for Automated Sales Reporting Engine —
Automated Sales Reporting Engine — 4 Deliverables From One Run A manufacturing and trading company (~$8M annual revenue) tracked sales plans and results in ISO-standard Excel forms, consolidated by hand every month. Slow, and easy to get wrong. I built a reporting engine that reads those same forms — no process change for their staff — cross-checks the figures against each other, and produces four things in a single run: an Excel dashboard, a formatted report, a one-page decision summary, and a chart pack. Two design choices did most of the work: It reads the forms the team already fills in. Most automation projects fail at adoption rather than engineering — if people have to change how they work, they quietly don't. It surfaces exceptions, not everything. Each run flags what actually needs a decision: orders past their promised date, invoices unpaid beyond 45 days, customers who stopped ordering, prices below the agreed floor. The written commentary is AI-assisted but constrained — it may only interpret figures that have already passed the validation layer. It cannot invent a number. Result: validated against six months of live ledger data with zero variance. What took multiple days of manual consolidation now takes one click. The reconciliation layer also surfaced that two customers accounted for 71% of revenue — a concentration risk the monthly reports had never made visible.
0
21