Bank reconciled. AR aged. Books looked clean. Revenue was being counted twice across two systems.
Success Story · Revenue Recognition · Services · Multi-Channel Revenue
A US mid-market services business with multi-channel revenue engaged EasePro for catch-up bookkeeping ahead of its first external audit. The standard checks all passed — bank reconciled, AR aged, vendor accounts current. The revenue reconciliation diagnostic told a different story. Contract revenue invoiced through one system was also being recorded from direct bank deposits in another — the same revenue, counted twice across two parallel accounting flows. Once reconciled against CRM contract data and bank deposits at the line-item level, we corrected the over-stated revenue, restructured the recognition policy, and rebuilt the revenue reconciliation as a monthly close step. The audit proceeded with clean financials. We continue to maintain the close on retainer.
The ChallengeClean-looking books. First external audit approaching. Two parallel revenue flows nobody had reconciled.
The business had run for years on a finance setup that worked while it was small. The first external audit was going to apply pressure the setup had never seen. Four problems were stacked underneath the clean surface.
- Two parallel revenue flows, never reconciled to each other. Contract revenue was being booked through the invoicing system as invoices were raised. Direct client payments hitting the bank outside the invoicing flow were also being booked from the bank statement. Each flow reconciled to its own source. The same revenue, appearing across both flows, had never been matched as one transaction.
- Standard checks passing — but the wrong checks. Bank was reconciled. AR was aged. Vendor accounts were current. Each of those checks confirmed that one half of the ledger matched its source. None of them answered whether the same revenue was being recognised twice across two flows. The clean surface was masking the structural duplication.
- No documented revenue recognition policy. Recognition decisions had been made line by line for years — usually consistent within a channel, often inconsistent across channels. Recurring retainers, project milestones, and upfront fees were all being treated by precedent rather than by written policy. The auditor was going to ask for the policy, and the policy did not yet exist as a document.
- First external audit, no audit-readiness work done. The business had never been audited externally before. Workpaper preparation, supporting schedules, evidence files, intercompany walk-throughs, related-party disclosures — none of that was ready. The internal team did not have audit experience, and the audit was already on the calendar.
What We DidFrom catch-up bookkeeping to a permanent fix.
The engagement began as catch-up bookkeeping, and the standard reconciliations — bank, AR, AP — all closed cleanly. It was the revenue diagnostic that followed that changed the scope: tying recognised revenue at the line-item level back to CRM contract data on one side and bank deposits on the other exposed a duplication that neither single-source reconciliation could see. The same contract revenue had been booked once from the invoice and again from the matching bank deposit. From there we did three things across the quarter.
- Corrected the history. We quantified the over-statement contract by contract, built the adjustment schedules, and restated the financials — so the books the auditor opened were already right.
- Wrote the policy that prevents it. A documented, per-channel revenue recognition policy that declares which flow recognises each type of revenue — recurring retainers, project milestones, upfront fees — so the same dollar can never be booked twice again.
- Made the check permanent. Revenue reconciliation became a standing monthly close step, and the engagement converted to an ongoing controllership retainer. We also walked the new policy through the auditor ahead of time, so the audit itself held no surprises.
The OutcomeWhat changed once the duplication was caught.
The audit proceeded on the corrected financials and the documented policy. It cleared with no restatement and no findings raised in the management letter — because the double-counted revenue had already been surfaced and corrected before the auditor opened the books. The per-channel revenue recognition policy now sits at the front of the audit-readiness file, answering the auditor's first question before it is asked.
The monthly close now includes the revenue reconciliation diagnostic as a standing step — line-item recognition tied back to CRM contract data and bank deposits, every month, before the books close. See how we support services businesses across the engagement lifecycle. The internal bookkeeper owns the day-to-day data entry; the controller signs off the close; EasePro maintains the policy, the reconciliation step, and the audit-readiness file on controllership retainer. The audit clears each year because the work to make it clear happens during the year.
Figures shown are illustrative — based on a real engagement, anonymised and rounded for client confidentiality.