Revenue recognition restatement, cleaned up before close
Diagnosed a systematic mis-posting across a full year of contracts, built the correction, and got it through statutory close on time.
Context
A high-growth manufacturer with project-based, milestone-billed contracts recognised revenue using a method baked into an outdated SOP. Advance and initiation invoices were being routed through the P&L instead of held as a contract liability, and over-time (percentage-of-completion) revenue was fully reversed and re-recognised every quarter instead of using an incremental catch-up. Net effect: revenue and profit overstated, balance-sheet classification wrong. The problem surfaced weeks before year-end close.
Challenge
Hundreds of journal entries across the year, all posted the wrong way. A material, multi-crore overstatement of profit. Auditor exposure on a contentious standard. A hard, immovable deadline — no option to "fix it next quarter."
What I built
I re-derived the correct IND AS 115 treatment from first principles, then wrote a Python tool that read the entire year's journal register and:
1. Found that the issue is at the stage of agreement hence built a claude based tool to convert the agreement into a agreement metadata, extracting all key commercial elements. saved into a machine readable format like JSON.
2. from this info built a invoicing schedule on what to be invoiced when which solves the future.
3. for present:
- Classified every entry by error type — P&L overstatement, balance-sheet-only misclassification, or related-party entries needing separate review.
- Quantified the impact by quarter, so the correction could be tied cleanly to each reporting period.
- Generated a restatement workbook with a CFO-facing summary sheet, a contract-by-contract detail sheet (as-posted vs. should-be vs. net correction), and a pre-filled correcting journal entry for every affected transaction — ready to post.
- Produced a 15-step close checklist with owners and dates running to the close deadline.
Before anything posted, I verified the contract-asset and contract-liability GLs existed and sat on the correct side of the balance sheet — closing the one gap that would have stalled the whole fix.
Outcome
Every mis-posted entry was identified and corrected with a clean audit trail, before close. The overstatement reversed; revenue and balance sheet restated correctly. The root cause was fixed at the SOP and system level so it could not recur — not patched for one period.