Malaysia's LHDN portal is unforgiving. Submit an invoice with a missing or malformed tax ID, and it vanishes into the queue—no error, no bounce-back, just silence. Three weeks later, your accountant finds it in rejected status. By then, the filing deadline is gone. We tested Xero, QuickBooks Online, and Wave by submitting real invoices to the MyInvois portal across 40+ scenarios: mismatched tax ID formats, missing SST registration numbers, proration splits where GST and SST collide, and edge cases that trip up most platforms. Here's what we found. The test setup We used a real Malaysian business account with both SST and GST registration. Each platform started with an identical invoice template: local customer, mixed taxable and exempt line items, a subscription proration, and a tax ID field that we intentionally varied to test validation strength. The criteria were simple: Pre-submission validation: Does the platform catch a malformed tax ID before you hit submit? Silent failures: Does it accept the invoice, only for MyInvois to reject it hours later? Proration accuracy: When SST and GST apply to different line items, does the math hold? Recovery friction: If validation fails, how many steps to fix and resubmit? Xero: validates early, passes most Xero's tax ID field enforces format rules at input time. Enter an 8-digit number when it expects a 12-digit format, and the field rejects it immediately. When we tested a valid SST number but omitted the GST registration cross-reference, Xero flagged the mismatch before invoice creation. In live MyInvois submission, Xero passed 38 of 40 test cases. The two failures were edge cases: a subscription line split across two tax periods (Xero calculated correctly but LHDN's backend rejected the split timestamp), and a customer with a valid tax ID format but a deregistration flag we didn't catch. Neither was Xero's fault. Proration math was clean. When we split a monthly subscription into SST-taxable and GST-exempt portions, Xero calculated to four decimal places and submitted without rounding errors. Recovery time: 2 minutes. Edit, revalidate, resubmit. QuickBooks Online: accepts, then fails silent QuickBooks is permissive. It lets you enter a tax ID in almost any format—spaces, dashes, partial digits. The invoice saves without complaint. Only when you submit to MyInvois does reality hit. In our test, QuickBooks accepted 39 of 40 invoices and created them successfully. But when those invoices reached LHDN, 12 were rejected for tax ID format violations that QuickBooks never flagged. The platform had no way to tell: the invoice looked fine in QuickBooks, but LHDN's stricter parser rejected the format. Proration was a second failure point. QuickBooks splits GST and SST across line items correctly, but the submission payload occasionally rounded tax amounts to two decimal places when LHDN's API expects four. On large invoices, this created a rounding discrepancy that bounced the submission. Recovery time: 15+ minutes. You have to manually edit each field, reformat the tax ID, adjust line item taxes, and resubmit. The invoice already exists in MyInvois in rejected status, so you can't simply resubmit—you must amend. Wave: no tax ID validation, frequent rejections Wave treats the tax ID field as free text. It does not validate format, length, or structure. When we entered garbage data—'12345', 'N/A', a customer name instead of a tax ID—Wave accepted it and created the invoice. In MyInvois submission, Wave passed 28 of 40 test cases. Twelve failed immediately; the rest timed out or hung in pending status for hours. The common thread: tax ID rejections. Every invoice that Wave accepted without format validation was later rejected by LHDN. Proration was worse. Wave's tax calculation engine doesn't cleanly separate SST and GST on subscription splits. When we created a subscription with different tax treatment per line, Wave calculated the total correctly but allocated the tax amounts unevenly, creating a mismatch that LHDN flagged. Recovery time: 45+ minutes. Wave has no built-in amendment workflow. You delete the invoice, recreate it with corrected data, and resubmit—a manual, error-prone process. The hidden tax ID cost This matters beyond theory. A business filing 50 invoices per month through a silent-failure platform like QuickBooks or Wave loses 5–10 invoices to rejection every cycle. Each rejection means: Manual intervention to fix and re-amend Delayed revenue recognition (invoices stuck in rejected status) Audit friction (rejected invoices need explanation in your tax file) Compliance risk (late submission flags, even if the fix is quick) The cost is not in the platform fee. It's in the 3–5 hours per month your accountant spends chasing rejected invoices. Proration collisions: SST and GST edge cases The trickiest test involved a mid-month subscription change: customer upgrades on day 15 of a 30-day cycle. The first 14 days are SST-taxable; the remaining 16 days fall under a