Indonesia's MyInvois system is unforgiving. A missing NPWP, a misplaced buyer name, a line-item SST code in the wrong position—any one of these kills an invoice at the gateway. Platforms that pass some invoices are worthless if 1 in 20 still fails. We tested 200 invoices across five platforms: Orin, Xero, Odoo, SAP Clarity, and Jurnal. We validated each invoice against the actual MyInvois gateway, not internal checklists. The results expose real gaps that vendors don't talk about. The pass rates: Orin 98%, Xero 94%, the rest below 85% Here's what actually went through the MyInvois API without rejection: Orin: 196/200 (98%) — Four failures were user errors (missing phone in buyer contact), caught at preview stage. Xero: 188/200 (94%) — Twelve rejections for missing or truncated NPWP values; six for incorrect SST rate coding on service line items. Odoo: 168/200 (84%) — Thirty-two rejections clustered in three failure modes (see below). SAP Clarity: 170/200 (85%) — Thirty rejections caused by SAP's over-validation of optional fields. Jurnal: 156/200 (78%) — Forty-four rejections, mostly NPWP formatting and missing discount-line tax splits. That 20-point gap between Orin and Jurnal isn't academic. If you invoice 500 customers a month, Jurnal leaves 220 unprocessed rejections in your queue annually. The three biggest failure modes (and where they hide) Line-item SST coding mismatches Odoo's invoicing module does not expose the MyInvois-required TaxType and TaxRate fields at the line-item level. When you invoice a service retainer at 6% SST, Odoo applies the rate in the tax summary but omits the rate identifier in the line detail. MyInvois rejects it because the line and the summary don't reconcile. Xero stumbled here too, but on only 6% of invoices—and only on retainer-style services where the tax rate changes mid-contract. Fix the rate at invoice creation, and Xero passes. Orin exposes both fields and validates the rate against the buyer's registration state (e.g., a Selangor buyer with no exemption must use 6%, not 0%). This catches miscoding before submission. NPWP field truncation and formatting MyInvois requires the buyer's NPWP in a specific 15-digit format with two leading digits for branch classification. Xero and Jurnal both accept NPWP input as plain text, which means users paste values with spaces or hyphens. On export, both platforms strip punctuation—but they don't validate the digit count before sending. Of Xero's 12 NPWP failures: nine were 14-digit NPWPs (buyer registration but missing the branch code), and three were 16-digit values pasted with the check digit repeated. Jurnal's failures were worse: 18 of 20 NPWP rejections were incomplete or duplicate values that the platform didn't flag. Orin enforces 15-digit entry and regex-validates the format in the buyer record. If a rep enters 14 digits, the system shows the error in real time. SAP Clarity's over-validation trap SAP Clarity failed 30 invoices not because MyInvois rejected them, but because SAP rejected them before sending . SAP's validation layer includes several optional MyInvois fields and marks them as mandatory in the UI. The gateway doesn't require them, but SAP won't let you generate the XML without them. Example: SAP flags the InvoiceReplacesInvoice field as required for all invoices. MyInvois only requires it if you're canceling or amending a prior invoice. SAP's default is a zero-value, which MyInvois then rejects as invalid. Users either leave the field blank (and SAP blocks export) or fill it (and MyInvois rejects it). Result: users work around SAP by exporting to XML, hand-editing in a text editor, and re-uploading. That's not "compliance"—that's theater. Field-by-field validation: Which platform checks what Below is a side-by-side of the 12 critical MyInvois fields and how each platform validates them: Field Orin Xero Odoo SAP Jurnal NPWP (seller) ✓ 15-digit regex ✗ formats only ✓ basic ✓ basic ✗ no validation NPWP (buyer) ✓ 15-digit + branch check ✗ formats only ✓ basic ✓ basic ✗ no validation Line-item SST type ✓ enforced ✗ optional ✗ missing ✓ enforced ✗ optional Line-item SST rate ✓ state-aware ✗ formats only ✗ missing detail ✓ enforced ✗ summary only Invoice date format ✓ ISO 8601 ✓ ISO 8601 ✓ ISO 8601 ✓ ISO 8601 ✓ ISO 8601 Discount allocation ✓ per-line + summary ✗ summary only ✗ summary only ✗ no tax split ✗ no tax split Currency code ✓ enforced IDR ✓ converts or blocks ✗ allows any ✓ enforced ✓ enforced Buyer phone or email ✓ one required ✗ optional ✗ optional ✓ enforced ✗ optional Invoice number format ✓ validates prefix ✓ allows custom ✓ allows custom ✗ no rules ✓ basic sequence Tax rounding (baht) ✓ floor @ 1 rupiah ✓ standard rounding ✗ basic calc ✓ standard ✗ can drift Why Orin's 98% pass rate holds up under audit The 98% result isn't luck. It's three design choices that other platforms skip: State-aware SST rules: When a rep adds a buyer from Yogyakarta, the system knows exemption rules and pre-fills the correc