Your accounts receivable report says customers owe you ā¹18.4 lakh. The debtors control account in your ledger says ā¹15.9 lakh. This is one of the most common month-end problems in Indian finance teams. It almost never means money has gone missing. It means the two numbers are counting different things. Here is how to find the difference, one cause at a time.
Check whether draft, cancelled and void invoices are in the total
The quickest win. Many AR reports are simply "invoice total minus amount paid" summed over every invoice in the system. That sum quietly includes drafts that were never sent, invoices that were cancelled or voided, and test or duplicate documents someone created and abandoned. None of these were ever posted to the ledger, so the AR report runs high.
Fix: define outstanding as issued invoices only (sent, overdue or partly paid) and exclude drafts, cancelled, void and archived records explicitly. If the gap shrinks a lot, your report logic was the problem, not your books.
Check how credit notes are being counted
A credit note posted in the ledger reduces what the customer owes. But if nobody applied it to the original invoice in the billing system, that invoice still shows its full balance in the AR report. The reverse also happens: a credit note raised in billing that never reached the ledger.
Under GST, an issued tax invoice can't simply be edited or deleted. Corrections go through a credit note under section 34 of the CGST Act, which has to be reported in GSTR-1.
Fix: list every credit note for the period and confirm two things for each one: it is posted in the ledger, and it is applied against a specific invoice in the AR system. A credit note settles the invoice without being a cash receipt, so it should reduce the balance due, not inflate "amount received".
Check for receipts that were never matched to an invoice
A customer pays ā¹2 lakh by NEFT with a narration that says nothing useful. The accountant credits the customer's account in the ledger, which is correct, but the receipt sits "on account" in the billing system, not applied to any invoice. The ledger shows the customer owing ā¹2 lakh less. The AR report shows every invoice still open.
Advances cause the same gap. Money received before the invoice is raised has to sit somewhere until the invoice exists. For services, GST is also payable on the advance when it is received, against a receipt voucher, which is one more reason it shouldn't be lost in a suspense account.
Fix: run a list of unapplied receipts and advances by customer. Apply each one to the invoice it actually pays, using the customer's payment advice where you have it. Where a receipt genuinely covers several invoices, split it only once the customer confirms the split. Guessing creates a second reconciliation problem later.
Check for TDS the customer deducted but nobody booked
This is the single biggest cause in Indian B2B businesses. A customer deducts TDS, typically 10% under section 194J for professional services, 2% under 194J for technical services, or 1ā2% under 194C for contracts. They pay you the net amount. The section numbers change under the Income-tax Act, 2025 from April 2026, but the mechanics do not.
If the receipt is recorded at the bank amount only, the invoice stays short by exactly the TDS, forever. Meanwhile the accountant may have booked the TDS receivable in the ledger, so the two sides disagree by the sum of every unbooked deduction.
A useful pattern check: a balance that is exactly 10% (or 2%, or 1%) of an invoice's taxable value is almost always TDS. TDS is normally deducted on the value before GST when GST is shown separately on the invoice.
Fix: record TDS receipts gross, as the bank amount plus the TDS, with the TDS booked as TDS receivable, so the invoice settles in full. Then confirm each deduction against Form 26AS or AIS once the customer has filed their quarterly TDS return. Until it shows there, treat it as unverified, not settled. If it never shows up, the customer deducted but didn't deposit, so raise it with them.
Check for GST the customer is holding back
Some customers pay the taxable value but hold back the GST until your invoice appears in their GSTR-2B, because they can only claim input tax credit once it does. The invoice is then part-paid with a balance exactly equal to its GST.
This isn't a ledger error, but it often gets "fixed" by someone writing off the balance or misclassifying it as TDS, and that is where the ledger and AR start to diverge.
Fix: tag these invoices as GST on hold, check that you actually filed them in GSTR-1, and chase the customer once the invoice is visible on their side. Keep them open in both places until the money arrives.
Check for overpayments netting against other customers' debt
When one customer overpays (duplicate payment, paid before a credit note was applied), a simple "total minus paid" calculation produces a negative balance for that invoice. Added into the total, it reduces the outstanding figure by money another customer owes. Duplicate receipts do the same thing: a bank credit recorded once from the bank feed and again manually.
Fix: clamp each invoice's balance at zero and report overpayments separately as customer credit. Then check whether each credit is genuine (refund it or apply it) or a duplicate receipt (reverse one of the two entries).
Check the opening balances from your old system
If you migrated from another accounting or billing tool, the ledger may carry one lump "opening balance" per customer, while the AR system imported individual invoices, or the other way round. Any receipt applied in the old system after the export, or any invoice exported in a different status, becomes a permanent difference dated to the cutover.
Fix: reconcile the cutover date first. Take the old system's customer-wise aging on the migration date and tie it, customer by customer, to both the ledger's opening balances and the open invoices you imported. Once that day agrees, every later difference is a current-period problem.
Check write-offs, dates and currencies
Three smaller causes that are easy to rule out:
- Write-offs posted in the ledger as bad debts, while the invoice stays open in AR (or closed in AR with no ledger entry). Write off in both places, with the same date and reference. GST already paid on the invoice generally isn't recoverable just because the debt went bad.
- Cut-off dates. The AR report runs "as of today" and the ledger "as of the 31st". A week of receipts is the gap.
- Foreign-currency invoices valued at the invoice-date rate in AR but revalued at month-end in the ledger. The difference is exchange gain or loss, not an unpaid amount.
Fix: run both reports to the same date, and keep exchange differences in their own account so they don't hide inside receivables.
A worked example
Hypothetical numbers for a fictional company, chosen to show how a gap breaks down. Not a real reconciliation.
Vindhya Network Services (fictional) found its AR report at ā¹18,40,000 and its debtors ledger at ā¹15,93,000. Every item below was correct in the ledger and wrong in the AR report:
| Item | Effect on AR report |
|---|---|
| AR report, total minus paid on every invoice | ā¹18,40,000 |
| A draft invoice included in the sum | āā¹1,18,000 |
| Credit note in the ledger, not applied to its invoice | āā¹59,000 |
| NEFT receipt sitting on account, not applied | āā¹50,000 |
| 10% TDS under 194J on a ā¹2,00,000 taxable invoice, receipt booked net | āā¹20,000 |
| Reconciled AR | ā¹15,93,000, equal to the ledger |
No money was missing. Four process gaps, each one a few minutes to fix once found.
Where this connects to system design
Most of these differences come from receivables and the ledger being kept in separate places by separate rules. In DexVee's finance and billing module, the outstanding figure is calculated per open invoice on the server. It counts only issued invoices (sent, overdue or part-paid), skips drafts, cancelled, void and archived records, subtracts applied credit notes, and never lets an invoice go below zero. Overpayments are reported separately as customer credit. A receipt can be split across several invoices, but each allocation is capped at the invoice's open balance, and whatever doesn't fit stays on the receipt as an unapplied advance.
TDS receipts are booked gross and matched against imported Form 26AS and AIS lines, so each customer statement shows TDS as verified or unverified. A short receipt that equals the GST is flagged as GST on hold, not mislabelled as TDS. Issued invoices can't be moved back to draft or have their number or discount changed. The correction path is a credit note or a void. And each invoice carries the GST registration that issued it, with its GSTIN printed on the document, so a business billing from more than one state never has to guess which branch a balance belongs to. More on that in multi-GSTIN invoicing.
If your receivables and ledger disagree, work through these checks in order. The difference is almost always a short list of explainable items, and once you can name them, you can stop them happening next month.