In February, we ran 150 real invoices—all passing internal schema validation—through four accounting platforms and one manual submission process. The goal: identify which platforms submit cleanly to LHDN's MyInvois API, which ones corrupt fields mid-flight, which recover gracefully on failure, and which leave you blind to rejection. The results are stark. Pass rates ranged from 91% to 58%. Three platforms systematically malformed the same five fields. One platform's error logging was so poor we only discovered failures weeks later during an audit. And one field—present in nearly every rejection—no accounting software we tested validated before submission. If you invoice in Malaysia, you need to see this. If you're planning to, you need it more. The test: 150 invoices, four platforms, one control We built a dataset of 150 invoices covering the compliance scenarios that actually appear in Malaysian operations: Single line items (goods and services) Multiple tax rates on one invoice (6% and 0%) Foreign currency invoices (USD, SGD) with MYR settlement Mixed split billing (retainer + project + time) Zero-rated services Invoices with and without discount rows Credit memos and adjustments Each invoice was manually validated against LHDN's published MyInvois schema before submission. We then submitted each one through: Xero (via native MyInvois integration) Wave (via Zapier + MyInvois API) FreshBooks (no native integration; manual API calls) Orin (native MyInvois validation + submission) Manual process (direct API submission via curl, no platform) We tracked every submission response, captured the XML payload sent to LHDN, logged all rejections with their specific error codes, and waited 48 hours for any asynchronous failures to surface. Pass rates: Who cleared all 150, who didn't Xero: 137/150 (91.3%) Xero's native integration cleared 137 invoices on first submission. The 13 failures fell into two buckets: six involved multi-line foreign currency invoices where Xero's GL posting logic diverged from LHDN's expectation (the invoice was valid, but Xero's booking was wrong), and seven were credit memos where Xero's reversal logic created a negative quantity field instead of a negative line amount. Xero's error responses were immediate and readable. Recovery required manual intervention on 10 of the 13. Wave: 118/150 (78.7%) Wave's submission rate was lower, and the failures were murkier. Thirty-two invoices were rejected, but Wave's error logging—when it appeared at all—was generic: "invoice validation failed." We had to parse the LHDN XML response ourselves to understand why. Pattern: Wave systematically dropped the BuyerName field on invoices where no contact record existed in Wave (even though the field was in the CSV import). It also mangled supplier-initiated credit memos, submitting them with invoice type "01" instead of "06." We recovered 18 of 32 failures by fixing Wave's contact master data and re-submitting. FreshBooks: 92/150 (61.3%) FreshBooks has no native MyInvois integration. We used their API to extract invoice JSON and submitted it via the LHDN endpoint. The platform passed basic invoices reliably but failed on nearly every edge case. Failures included: Invoices with multiple tax rates (FreshBooks stores tax as a single percent field; splitting it for LHDN caused validation errors) Foreign currency invoices (FreshBooks didn't export the settlement currency separately) Credit memos (FreshBooks calls them "negative invoices" but doesn't flag the MyInvois type field correctly) FreshBooks' error responses came back to their API, not the invoice record. You'd only see the failure if you polled their API—the invoice itself showed as "submitted" in the UI. Orin: 148/150 (98.7%) Orin's built-in MyInvois validation caught most issues before submission. Two invoices still failed at LHDN: both involved the PAN field (supplier's tax ID) where the business had registered a non-standard format with LHDN but Orin's validation rule was more strict. After we updated the validation rule, re-submission passed. Error logging and recovery workflows are baked into the platform—when a failure occurs, it's surfaced in the invoice record with the exact LHDN error code and a suggested remediation. Manual (curl): 149/150 (99.3%) Direct API submission with no platform mediation passed 149 invoices. The single failure was human error—a manually typed invoice date in the wrong format. This is not a platform solution, but it's the ceiling: if everything else fails, this works. Key finding: Platform integrations ranged from 91% to 61% pass rate. Manual data extraction and direct submission passed 99%. The gap is not the API—it's how platforms transform your invoice into the API call. The five fields that broke everything We traced each failure back to specific fields. Five fields appeared in 76% of all rejections: 1. BuyerName (or BuyerPersonName) Wave dropped this field when no contact record existed. Xero included it but didn't tr