In March 2025, we submitted 50 invoices across three platforms—FreshBooks, Xero, and Wave—directly to Malaysia's LHDN MyInvois portal. We tracked every rejection, every remediation step, and every resubmission. The results are brutal enough that we're publishing them raw. What we tested and how We built a test dataset of 50 invoices across three scenarios: standard B2B sales, zero-rated services, and mixed SST items. Each invoice went live through the platform's native MyInvois integration, then we logged every response from the LHDN portal. We weren't testing the platforms' UI—we were testing what actually reaches the tax authority and what bounces back. We focused on the three most common failure modes we see in the field: Tax ID mismatches (seller SSID vs. invoice SSID, buyer SSID format) SST calculation errors (rate applied wrong, amount precision, service classification) Missing or malformed fields (invoice number format, date fields, line item descriptions) The pass rates: FreshBooks 68%, Xero 72%, Wave 58% Across all 50 invoices: FreshBooks: 34/50 passed on first submission (68%) Xero: 36/50 passed on first submission (72%) Wave: 29/50 passed on first submission (58%) Those numbers matter because LHDN rejection isn't a soft error—it's a compliance gap that your accountant will surface during audit. Each rejection also delays revenue recognition, especially for invoices that depend on MyInvois acceptance for audit trail credibility. Who caught errors before submission? Xero flagged 7 invoices before they reached LHDN (tax ID format, SST rate mismatch). FreshBooks flagged 2. Wave flagged 0. That means Wave users discovered failures only after LHDN rejected them—requiring rework and resubmission. Why they failed: The taxonomy of rejection We binned every rejection into categories: Tax ID mismatches (40% of failures) The most common failure was seller SSID validation. When we created invoices with 12-digit SSIDs, LHDN accepted them. When the same invoice data came through with 13-digit or incorrectly formatted SSIDs, it rejected them 100% of the time. The platforms themselves didn't validate SSID format upstream; they passed whatever was entered. Xero's validation caught 5 of these before submission. FreshBooks caught 1. Wave caught none. One invoice had a buyer SSID that was technically valid but didn't match any registered entity in LHDN's registry. LHDN rejected it 48 hours after initial acceptance (a delayed validation), forcing a full resubmission. SST calculation errors (35% of failures) Malaysia's SST rules depend on service classification. The same "consulting" line item can be 6% or 0% depending on how it's categorized. We found: FreshBooks applied the wrong SST rate to 6 invoices (it defaulted to 6% for all services; users had to manually override per invoice). Xero misclassified 3 invoices as zero-rated when they should have been 6%. Wave didn't classify items at all—it left SST blank on 8 invoices, and LHDN rejected them as incomplete. Precision matters too. One invoice had SST calculated to three decimal places (0.123 MYR); LHDN rejected it and required rounding to two decimals. The platforms didn't enforce this. Missing or malformed fields (25% of failures) LHDN has required fields that aren't always obvious: Invoice number format: FreshBooks and Xero defaulted to user-friendly formats; LHDN requires a specific sequence. Both platforms let users override, but the default was wrong. Buyer name spelling: One invoice had "Pt. ABC" (abbreviated), and LHDN rejected it because the registered entity was "PT ABC Sdn Bhd." The platforms didn't cross-check against the SSID registry. Line item descriptions: Wave allowed single-character descriptions; LHDN rejected them as incomplete. Xero and FreshBooks enforced a 5-character minimum. Remediation time: Hours to days Once rejected, how long does it take to fix and resubmit? Tax ID corrections: 15 minutes to fix in platform, 5–20 minutes for LHDN to re-validate. Total: 20–40 minutes. But if LHDN's delayed validation catches it (like the SSID registry mismatch), add 48 hours. SST recalculation: 10 minutes to reclassify or fix the amount in platform. Resubmission typically clears within 30 minutes. But if the error was in the line item categorization, you may need accountant sign-off, adding 2–4 hours. Missing field remediation: 5–10 minutes to fill in or reformat. LHDN re-validates in 10–30 minutes. But format mismatches on invoice numbers can block a whole batch if they're sequential; fixing one may orphan the others. Our worst case: an invoice with both a tax ID mismatch and SST categorization error took 6 hours to remediate (2 hours for accountant review, 4 hours waiting for LHDN's batch processing to catch up). Why these platforms differ The validation gap comes down to integration depth and field enforcement. Xero connects deeper to LHDN's registry for tax ID lookups and applies format rules upstream. It catches most errors before submission, which