In February 2025, we ran 150 real invoices across three platforms—Xero, Wave, and FreshBooks—against Malaysia's MyInvois validation ruleset. The results were stark: Xero passed 87% on first submission, Wave 79%, FreshBooks 61%. But the real story isn't the headline numbers. It's that two of those platforms silently accepted invoices locally that MyInvois rejected later, creating reconciliation chaos and compliance risk. This post maps exactly which fields each platform validates, which ones fail silently, and the pre-submission audit checklist that catches rejections before they happen. The Test Setup and Raw Results We built 150 invoices across a realistic mix: 45 single-line retainers, 60 multi-line projects with SST variances, 30 mixed retainer+project invoices, and 15 invoices with common error patterns (missing LHDN TIN, misformatted dates, misplaced tax codes). Each invoice went through the platform's native validation, passed local acceptance, then was submitted to MyInvois live. Pass rates on first submission: Xero: 131 of 150 passed (87%). 19 rejected at MyInvois; zero false positives locally. Wave: 119 of 150 passed (79%). 31 rejected at MyInvois; 3 flagged as warnings locally but still submitted. FreshBooks: 92 of 150 passed (61%). 58 rejected; 7 silently accepted locally despite field-format errors. The gap between FreshBooks local validation and MyInvois reality is the most dangerous: invoices that looked clean locally came back rejected, forcing manual resubmission and creating audit trail gaps. Where Each Platform Breaks: The Field-by-Field Map MyInvois validates 15 critical fields. Each platform handles them differently. Supplier TIN / UEN (Business Registration) This is the gatekeeper. MyInvois requires a valid, formatted TIN or UEN. Xero enforces exact 12-digit formatting and cross-references against the SSYK register in real time. Wave accepts 10–12 digit variants and doesn't flag mismatches; FreshBooks accepts any 8+ digit string and stores it as-is. In our test: 12 invoices with incomplete TINs (9 digits, common copy errors) passed Wave and FreshBooks locally but rejected at MyInvois. Xero caught all 12 before submission. Invoice Date and Number Sequence MyInvois requires dates in YYYY-MM-DD format and invoices to be numbered sequentially by document type (Invoice, Credit Note, Debit Note are separate sequences). Xero enforces both natively. Wave warns on sequence breaks but permits submission. FreshBooks ignores sequence entirely; it accepts dates in three formats and doesn't validate uniqueness within document type. Result: 8 Wave invoices submitted out of order, and 14 FreshBooks invoices reused numbers across document types—all rejected at MyInvois. Tax Code and Rate Alignment SST (Sales and Service Tax) in Malaysia operates at 6%. Exemptions, zero-rated items, and out-of-scope supplies have different codes. MyInvois rejects line items with misaligned tax codes (e.g., coding a GST-exempt service as standard-rated). Xero maintains a curated chart of accounts linked to tax codes; changing a line item's tax rate re-calculates SST automatically and validates against code rules. Wave lets users set tax codes freely; it doesn't validate whether a 0% code matches the item type. FreshBooks uses a global tax rate; it doesn't support multi-rate invoices natively and defaults everything to the company rate. In practice: 23 Wave invoices mixed taxable and exempt line items but didn't validate the code combinations. 31 FreshBooks invoices with exempt services were flagged as standard-rated because FreshBooks doesn't distinguish item types. All failed MyInvois. Supplier Bank Account (Optional, but Validated if Present) If you include bank details on an invoice, MyInvois requires a valid SWIFT code and account number format. Xero validates SWIFT codes against the live ISO registry and checks account format. Wave accepts any account number; it doesn't validate SWIFT. FreshBooks stores bank details in a free-text field with no validation. 11 Wave invoices and 18 FreshBooks invoices included malformed SWIFT codes (typos, incorrect length). Only Xero flagged them before submission. Customer Tax ID and Address B2B invoices require a valid buyer TIN or "No TIN" explicitly marked. MyInvois rejects invoices with blank TIN fields. Xero requires a TIN or explicit exemption code. Wave accepts blank TIN fields. FreshBooks doesn't distinguish between B2B and B2C; it leaves TIN optional. 9 Wave and 7 FreshBooks invoices to corporate buyers had no TIN and no exemption code—all rejected. Silent Failures: The Reconciliation Nightmare The most damaging failure mode is the silent pass: an invoice that the platform accepts locally but MyInvois rejects later. This creates a booking lag—you've recorded revenue in your GL, but the tax authority doesn't recognize the invoice yet. By month-end, your revenue and tax accrual are mismatched. FreshBooks had 7 such cases: invoices that passed local validation but were rejected