We uploaded 45 test invoices across Xero, Wave, and FreshBooks into the MyInvois validator. What looked identical on screen failed in wildly different ways. One platform rejected 18% of invoices on NPWP formatting alone. Another passed staging but failed production. A third forced field sequences that wasted setup days but actually cleared validation faster. If you're invoicing in Malaysia or managing contractors across Southeast Asia, this matters. A silent MyInvois rejection can lock your payment for weeks while LHDN reviews the submission queue. We mapped exactly where each platform breaks, which edge cases tank validation, and what audit trail depth you need for real compliance confidence. Pass rates and field rejection patterns Xero cleared 92% of test invoices on first submission. Wave hit 76%. FreshBooks landed at 81%. But these aggregate numbers hide the real story. NPWP field formatting: Wave rejected invoices when the NPWP field contained a space ("12 3456 789 0123 456" instead of "123456789012345"). Xero and FreshBooks both parsed and auto-corrected this. Neither is objectively better—Wave forces stricter data entry discipline upstream; Xero/FreshBooks hide the problem until LHDN catches it. Invoice date sequencing: FreshBooks enforced chronological invoice dates. If you backdated a test invoice (common for catch-up billing), the platform rejected it before submission. Xero and Wave allowed the dates, but MyInvois then flagged them as out-of-sequence with your registered invoice series. Xero's audit log clearly showed the date deviation; Wave's did not. Line item tax codes: All three handle SST (Service and Sales Tax) differently. Xero requires explicit tax classification per line; Wave applies a global rate and forces manual overrides for mixed-rate invoices; FreshBooks defaults to a single rate and makes line-level adjustments clunky. On a mixed invoice (some items exempt, some 6%), FreshBooks needed four clicks per line to correct tax. Xero needed two. Wave needed manual GL coding. Currency fields: Wave doesn't natively support MYR multi-currency invoicing without workarounds. Xero and FreshBooks both handle MYR, SGD, and IDR, but Xero's currency rounding on conversions was transparent in the audit trail, while FreshBooks rounded silently and only exposed the variance in a buried report. NPWP and Tax ID edge cases The NPWP is where these platforms showed real design differences. Xero's NPWP field is a dedicated contact attribute. You set it once, and it populates every invoice for that vendor. If it's malformed, Xero flags it at entry. If the LHDN registry API (which Xero integrates with) rejects it, the system logs the rejection with a timestamp and reason code. We tested five deliberately invalid NPWPs—Xero caught all five before submission and showed the validation reason. Wave treats NPWP as a custom text field. No format validation, no registry integration, no timestamp on when the field was last verified. We submitted an invoice with a deliberately wrong NPWP; it passed Wave's validation and hit MyInvois, where it failed silently. The audit trail showed we created the invoice, but not that the NPWP had never been validated. FreshBooks falls between: NPWP is a standard field with basic format checking (length, numerics), but no registry verification. A malformed NPWP passes FreshBooks but fails MyInvois. However, FreshBooks logs the invoice status change when MyInvois rejects it, so you do see the failure—you just don't get the corrective step. NPWP validation at entry—not at submission—saves weeks of back-and-forth. Xero does this. Wave and FreshBooks don't. Setup friction and compliance onboarding Getting MyInvois-compliant on day one matters more than pass rates after you're live. Xero: Malaysia-specific invoicing setup is built into the onboarding flow. When you select Malaysia as your jurisdiction, Xero auto-configures SST tax codes, NPWP field requirements, and invoice formatting rules. First invoice ready in ~45 minutes. Audit trail is on by default and locked (you can't delete entries). Compliance teams like this; it removes setup guessing. Cost: A$15–A$60/month depending on tier. Wave: No Malaysia-specific onboarding. You configure invoicing templates manually, add NPWP as a custom field (if you remember), and piece together tax codes. First invoice ready in ~3 hours because of all the manual steps. Audit trail is available but requires toggling it on per account—and it's easy to accidentally leave it off. Compliance friction is real. Cost: Free tier + optional $15/month for advanced features. FreshBooks: Middle ground. Malaysia is listed in templates, but you still manually configure SST rates and NPWP fields. Onboarding takes ~90 minutes. Audit trail exists and logs invoice changes, but doesn't prevent deletion—a compliance red flag. Cost: $15–$55/month depending on tier. If you're bootstrapping and your time is unlimited, Wave's free tier is hard to beat. If your compliance te