You set up MyInvois validation in your accounting platform. The integration looks clean. Invoices export. Then LHDN rejects them three weeks later, and you realize your platform was silently failing the whole time—but never told you. We tested 50 actual invoices through Xero, Wave, FreshBooks, and QuickBooks Online. Each platform submitted real MyInvois exports. We measured what passed, what failed silently, and what got rejected by LHDN. The results are not even close. The test setup We picked 50 invoices across three scenarios: Local GST invoices (15 invoices): Standard items, single tax rate, domestic business customers. Mixed-rate and zero-rated (20 invoices): Multiple tax lines, zero-rated services, mixed GST on parts of the same invoice. Edge cases (15 invoices): Rounding errors, decimal precision issues, multi-line item splits, manual tax adjustments. Each invoice was exported as a JSON or XML payload (depending on the platform) to MyInvois validation. We recorded whether validation passed, whether LHDN returned errors, and whether money moved (proof of acceptance). Results: Pass rates and silent failures Xero: 47/50 passed (94%) Wave: 39/50 passed (78%) FreshBooks: 30/50 passed (60%) QuickBooks Online: 44/50 passed (88%) Xero: 94% pass rate (47/50) Xero handled the majority without error. Three failures were all in the edge-case group: One invoice with manually split tax lines (the platform auto-corrected the calculation but logged a warning that most users never see). Two invoices where rounding created a 1-sen difference at line level (Xero's rollup corrected it, but the JSON payload initially included the misaligned cent). Xero's validation message is clear when it fails: the error appears in the invoice export log with a specific field reference. Of the three failures, the user was able to identify and fix the problem in under 5 minutes each. Wave: 78% pass rate (39/50) Wave struggled with mixed-rate and edge cases. Of 11 failures: 6 failures were zero-rated invoices. Wave's export included the item line but coded the tax rate as "0" instead of the correct "ZERO" enum that MyInvois expects. The invoice would validate locally but bounce back from LHDN silently (no user-facing error). 3 failures were multi-line items with different tax rates. Wave's payload flattened the tax calculation instead of preserving line-level detail, causing a mismatch when LHDN recalculated. 2 failures were rounding errors. Wave's decimal handling created a 2-sen variance on a few invoices. The dangerous part: Wave does not warn the user that an export failed MyInvois validation. It simply marks the invoice as exported and moves on. LHDN rejects it days later. FreshBooks: 60% pass rate (30/50) FreshBooks had the worst performance. Of 20 failures: 8 failures were caused by missing or malformed UEN fields. FreshBooks allows invoices to be created without a customer UEN, which is optional in FreshBooks' logic but mandatory in MyInvois. The export included a null or empty field. 7 failures were due to currency handling. FreshBooks can mix currencies in a single account; several invoices defaulted to USD instead of MYR, and the MyInvois export preserved the currency code instead of converting or flagging the error. 5 failures were line-item description length. FreshBooks allows description fields up to 500 characters; MyInvois truncates at 256. FreshBooks' export did not validate this, so invoices with longer descriptions bounced. FreshBooks also does not surface MyInvois validation errors in the UI. A user might export, wait, and never know the invoice failed until payment terms pass or LHDN rejects the batch. QuickBooks Online: 88% pass rate (44/50) QuickBooks Online performed well, close to Xero. The 6 failures broke down as: 3 failures were GST calculation precision. QuickBooks rounds tax at the invoice level; MyInvois expects line-level precision to be preserved. On high-value invoices, this created a 1-sen mismatch. 2 failures were due to customer class field mapping. QuickBooks exported customer type as "B2C" or "B2B"; MyInvois expected a specific enum. 1 failure was an invoice with no line items (only a lump-sum amount), which QuickBooks allowed but MyInvois rejected. QuickBooks' error handling is better than Wave or FreshBooks—most failures are caught at export time and flagged to the user. However, the platform does not force correction before marking the invoice as submitted. Silent failures vs. explicit rejections The real risk is silent failure. An invoice that passes your platform's validation but fails MyInvois validation will: Export and appear successful in your system. Bounce from LHDN without an error message visible to you. Sit in rejected status until someone manually checks LHDN's portal. Miss tax deadlines or trigger penalties if the rejection is not caught before filing. Wave and FreshBooks had the highest silent failure rates. Xero and QuickBooks flagged most errors at export time, giving users a cha