You run a nightly batch check on 200 invoices. Twenty-three pass. The other 177 pile up in error logs—and you find out when LHDN rejects them 48 hours later. By then, your clients have already been chasing you for payment confirmation, your accountant has flagged them as unreconciled, and your invoice sequence has gaps that trigger compliance audits. Batch validation (Wave, FreshBooks, Xero's basic tier) catches syntax errors. Real-time validation—the kind tied directly to LHDN's e-Invoicing rules—catches the five gaps that batch misses entirely: NPWP format mismatches, SST classification failures, invoice sequence breaks, multi-currency mixing, and GL account posting errors. The cost of missing any one of these is not a retry; it's a compliance violation, a frozen payment, and a manual reconciliation audit. This playbook walks through each gap, shows you exactly where batch checks fail, and gives you a 30-minute staging checklist to validate before go-live. Gap 1: NPWP Format validation—batch accepts malformed IDs Your batch validator checks that the NPWP field is not empty and contains numbers. Done. Real-time LHDN validation checks four things: Format: 15 digits, no spaces, no hyphens (batch often accepts XX-XXX-XXX-X-XXX-X) Check digit: The 15th digit is a modulo-11 checksum. Batch never validates this. A typo in position 14 will pass your batch check and fail LHDN's live submission. Registration date: NPWP must be issued before the invoice date. Batch validators don't cross-reference this. Entity type alignment: Individual NPWPs (format 00.XXX.XXX.X-XXX.000) cannot be paired with company invoice headers. Batch checks don't validate this relationship. Wave and FreshBooks will accept NPWP XX-XXX-XXX-X-XXX-X (with hyphens). LHDN rejects it silently—the invoice goes to a pending state, not a rejection queue, so you don't know it failed for 24 hours. A 15-digit NPWP with the wrong check digit will pass your batch validator and fail LHDN's live submission without logging a visible error. Gap 2: SST classification mismatch—silent category failures You assign SST codes (Service Sales Tax categories: 01–14) at the item level. Your batch check ensures the field is populated. LHDN's real-time validator checks: Code-to-item alignment: Food items cannot use SST code 14 (professional services). Batch validators don't know your inventory. Rate matching: SST code 01 (standard goods) defaults to 6%. If you pair it with an 8% rate line, real-time validation catches it. Batch checks don't. Exemption legitimacy: Code 00 (exempt) requires documented exemption status from LHDN. Real-time validation flags invoices that use exemption codes for non-exempt customers. B2B vs B2C rules: Some SST codes apply only to business-to-business sales. If you invoice a consumer with a B2B-only code, batch passes it, real-time fails it. FreshBooks batch checks for SST code presence only. It doesn't validate that the code matches the item type or that the tax rate aligns. You'll discover the mismatch when LHDN queues the invoice for manual review—usually 36–72 hours after submission. Gap 3: Invoice sequence gaps and numbering discontinuities You issue invoice 001, 002, 003, then a cancelled invoice 004, so you jump to 005. Batch validators pass this. LHDN's real-time validation: Tracks sequence continuity: If invoice 004 is not marked cancelled (status code 03) in LHDN's system, real-time validation flags 005 as out of sequence. Validates date order: Invoice 006 cannot have an issue date before 005. Batch checks don't cross-reference invoice dates with sequence numbers. Enforces submission order: If you submit invoice 007 before 006, real-time validation holds 007 until 006 clears. Batch validation lets you queue both without error. Prevents retroactive renumbering: Once an invoice is submitted and acknowledged by LHDN, you cannot reissue it with a different sequence number. Batch validators don't track LHDN's acknowledgment state. Wave's batch check verifies that your internal sequence is unbroken; it has no connection to LHDN's live state. If you skip sequence 004 and submit 005 directly, Wave passes it. LHDN rejects it because sequence 004 is still missing from their audit trail. Gap 4: Multi-currency mixing and exchange rate mismatches You issue an invoice to a Singapore client in SGD, but your base currency is MYR. Batch checks ensure both currencies are ISO-standard codes. Real-time validation: Validates currency on item lines: All line items must be in the same currency as the invoice header. Batch validators allow mixed-currency invoices. Cross-checks FX rates: LHDN's system references Bank Negara Malaysia daily rates. If your invoice shows 1 SGD = 3.10 MYR and BNM's rate is 3.05, real-time validation flags the discrepancy. Batch checks don't. Enforces currency consistency: If you issue invoice 001 in SGD at 3.10 and invoice 002 in SGD at 3.15, real-time validation requires you to document the rate change or accept the variance. Batc