Malaysia's MyInvois system has been live for nearly two years, yet we still see invoices rejected weeks after submission—not because the rules changed, but because the invoicing platform never validated them. You hit 'send to tax authority,' the system accepts it, and three weeks later your accountant discovers a malformed tax ID or a missing SST split. By then, the client has already been paid and your compliance window is closing. We submitted 200 real invoices across four platforms—Xero, Wave, QuickBooks Online, and FreshBooks—against MyInvois's published validation rules. Here's which ones catch errors before they slip into the queue, and which ones let bad invoices through. What MyInvois actually validates (and what it doesn't) The Malaysian tax authority's MyInvois system has three hard rules that reject invoices on submission: Tax ID format: Malaysian business registration number (BRN) must be 12 digits. Supplier's unique identification number (UIN) for sole traders is 14 digits. Foreigner's ID must be valid format. The system rejects anything else immediately. Invoice number sequence: Invoices must be sequential per tax period (calendar year). Gap a number, use a duplicate, or jump the sequence, and MyInvois blocks it. No exceptions. SST (Sales and Service Tax) splits: If SST applies, the invoice must break down base amount, SST rate (6%), and total separately. Bundled amounts are rejected. Additionally, MyInvois validates date ranges (invoice date cannot be in the future or more than 30 days past), credit note matching, and customer tax ID format. But the three rules above are where most platforms fail silently—they let you submit, the invoice goes to the queue, and then MyInvois rejects it 48 hours later. Xero: Real-time validation, but only if you've configured the tax mapping Xero catches tax ID format errors and invoice sequence gaps before submission—but only if you've set up your tax codes correctly in settings. We found the issue: Xero validates against the mapping you've configured locally, not against MyInvois's live rules. In practice: if your Xero tax code says "SST 6%" but you've left the Malaysia-specific UIN field blank, Xero will let you submit an invoice without a valid supplier UIN. MyInvois rejects it two days later. Your accountant has to chase the client for the corrected invoice, and the tax authority's queue backs up. Xero's strengths: Sequence validation is solid. If you've configured supplier UIN in the tax settings, it validates on submit. Xero's blind spots: No live connection to MyInvois. No warning if your invoice number sequence has a gap. No alert if a customer's tax ID format doesn't match LHDN's rules (e.g., invalid BRN length). Wave: Minimal validation, batch failures on submit Wave does not validate MyInvois rules before you click submit. We sent invoices with malformed tax IDs, duplicate invoice numbers, and incomplete SST splits. Wave accepted all of them. The errors surfaced only when Wave attempted to batch-submit to MyInvois. If the batch included even one bad invoice, Wave would reject the entire submission and show a generic error message: "Tax authority returned invalid invoice." Wave did not flag which invoice or which field was the problem. You had to download the batch log, cross-reference it against your records, and figure it out yourself. Wave's strengths: Free, simple interface. Works fine for small businesses with tight invoice discipline. Wave's blind spots: Zero pre-flight validation. Error messages on batch rejection are opaque. No invoice sequence tracking across tax periods. If you've ever used the same invoice number twice, Wave won't warn you until MyInvois rejects the batch. QuickBooks Online: Partial validation, customer tax ID slip-through QB Online validates your own company's tax ID format on setup (it checks for 12-digit BRN), but it does not validate customer tax IDs when you create or edit an invoice. We created invoices with fabricated BRNs, invalid UINs, and malformed tax ID strings. QB accepted all of them. When we submitted to MyInvois, the system rejected invoices where the customer's tax ID was invalid or missing. QB had not caught this. The batch failure was cryptic: "Customer tax details invalid." Finding the offending invoices required manually checking each customer record. QB's invoice sequence tracking is decent—it warned us about gaps—but only if you've manually configured invoice number prefixes and ranges. Out of the box, QB doesn't know you're using a calendar-year tax period for MyInvois. QB Online's strengths: Validates your own tax ID on setup. Warns about invoice number gaps if you've configured number series. QB Online's blind spots: Does not validate customer tax ID format. No MyInvois-specific rules for SST splits (though QB's tax code setup is more flexible than Xero's). Error messages on batch rejection require manual cross-referencing. FreshBooks: No live validation, highest failure rate FreshBooks treats MyI