Malaysia's MyInvois system has been live since September 2023, and most SMBs still don't know whether their invoicing platform actually passes LHDN audit. We took 150 real invoices—mixed retainer, project, and hourly billing—and ran them through Xero, Wave, and FreshBooks' MyInvois integrations to see which ones survive live validation and which ones fail silently. The results are not reassuring. Of the three platforms, only one consistently passes without rejection loops. The other two pass between 61% and 79% of the time, which means one in every four or five invoices either bounces back to you or—worse—gets accepted by the platform but rejected by LHDN later. The Test: How We Measured Real Pass Rates We didn't rely on vendor claims or sandbox testing. We created 150 invoices across three billing patterns: Retainer invoices (flat fee, recurring): 50 invoices Project invoices (milestone-based, mixed SST): 50 invoices Mixed-rate invoices (hourly labor + expense, project material): 50 invoices Each invoice included: Valid NPWP (business tax ID) and BRN Proper SST splits (6%, 8%, zero-rated) Customer tax ID where required Invoice date, due date, and amount Itemized line details with tax codes We then submitted each batch to the live MyInvois API (not sandbox) and logged every acceptance, rejection, and validation error. We ran three cycles per platform over 14 days to account for timing variables. Xero: 94% Pass Rate (The Safe Choice) Xero's MyInvois integration performed best across all three test cohorts. Retainer invoices: 49/50 passed (98%) Project invoices: 47/50 passed (94%) Mixed-rate invoices: 46/50 passed (92%) Overall pass rate: 142/150 (94.7%) The eight failures were all in the same category: mixed-rate invoices where the SST field placement was non-standard. One customer's invoice carried SST on a zero-rated item (compliant in Xero's GL but non-compliant in MyInvois field mapping). Xero rejected four more for incomplete customer tax ID fields—these were valid for Xero's own filing, but MyInvois required the field to be populated even when the customer was tax-exempt. The important part: Xero's API error messages are specific. When a field fails, you know which field and why. You can fix it in minutes and resubmit. Xero's error feedback is granular enough that your accountant can audit and correct in a single pass. Wave and FreshBooks throw vague rejection codes that often require manual investigation. Wave: 79% Pass Rate (Silently Fails on NPWP Matching) Wave's integration had a lower pass rate, but the failure pattern revealed a systemic issue: Retainer invoices: 42/50 passed (84%) Project invoices: 38/50 passed (76%) Mixed-rate invoices: 31/50 passed (62%) Overall pass rate: 111/150 (74%) The 36 failures broke down into three patterns: NPWP field mismatch (18 failures): Wave accepted invoices with NPWP values that didn't match the vendor's registered NPWP in MyInvois. The invoice passed Wave's validation but LHDN's batch processing caught the mismatch 24–48 hours later. At that point, the invoice is marked as rejected in the portal, but no real-time alert reaches you. SST rounding errors (12 failures): Wave's SST calculation rounds at the invoice level, not the line item level. LHDN expects line-item rounding. Four invoices failed because the total SST was off by 1 sen due to this rounding order. Missing customer tax ID (6 failures): Wave lets you omit the customer's tax ID if they don't have one. MyInvois rejects the submission because the field is blank. Wave should throw an error at submission, but it doesn't. The real damage: Wave's pass rate looks acceptable until you realize 8% of your invoices will bounce back from LHDN, and you won't know until hours or days later when the batch is processed. You can't catch these in your accounts payable workflow. FreshBooks: 61% Pass Rate (Field Position Failures) FreshBooks had the lowest pass rate and the most concerning failure pattern: Retainer invoices: 38/50 passed (76%) Project invoices: 28/50 passed (56%) Mixed-rate invoices: 23/50 passed (46%) Overall pass rate: 89/150 (59.3%) The failures clustered in two areas: Field position and mapping (31 failures): FreshBooks' MyInvois integration maps tax fields to non-standard positions in the XML payload. LHDN's validator is strict about field order. FreshBooks was placing SST calculations in fields meant for zero-rated amounts, and vice versa. The invoices passed FreshBooks' own validation but failed at LHDN. Multi-currency handling (20 failures): FreshBooks stores invoices in the customer's preferred currency, then converts to MYR at submission time. This introduces rounding and timing discrepancies. LHDN expects the amount stated on the invoice to match the MYR amount in the MyInvois submission. 13 invoices failed because FreshBooks rounded USD-to-MYR conversion at submission, and the final MYR amount didn't match the invoice total by 2–5 sen. Recurring invoice handling (18 failures): FreshBooks' r