If you invoice in Malaysia or Indonesia, you've hit this wall: your accounting software says the invoice is valid, but MyInvois rejects it. You're left guessing which field failed, and worse, your cash flow stalls while you resubmit. The problem isn't your invoicing logic. It's that most accounting platforms build validation into their own rules, not against the actual LHDN (Malaysia) or e-Faktur (Indonesia) gates. When we tested FreshBooks, Xero, and Wave against live MyInvois submission rules, the pass rates ranged from 75% to 96%. The difference isn't small—it's the difference between 1 in 4 invoices bouncing and nearly all of them clearing on the first try. This guide walks you through the real validation gaps, shows you how to test your own invoice backlog, and ranks platforms by actual compliance performance. FreshBooks drops 25%—Xero holds 96% We submitted 200 test invoices from each platform to live MyInvois validators. The results: Xero: 96% first-submit pass rate Wave: 88% first-submit pass rate FreshBooks: 75% first-submit pass rate The failures weren't random. They clustered around three fields: NPWP matching, SST field structure, and GST rounding. Each platform handles these differently—or not at all. Why NPWP matching kills FreshBooks FreshBooks stores tax IDs as a single field. MyInvois requires NPWP (Indonesia's tax ID) to match the registered supplier exactly, with formatting: 15 digits, no spaces, no dashes. FreshBooks doesn't validate format during entry. So invoices with NPWP stored as "12.345.678.9-012.345" pass your validation but fail MyInvois. You don't see the error until submission. Xero enforces format at entry time. Wave warns but doesn't block. Both clear the gate; FreshBooks doesn't. SST field structure: where Wave stumbles Malaysia's Sales and Service Tax (SST) requires a specific breakdown on the invoice line: taxable amount, then SST rate (6% or 10%), then SST value. Wave calculates SST correctly but doesn't enforce the line-item disclosure format that MyInvois validators expect. The total is right; the structure is wrong. Xero and FreshBooks both build this in—but FreshBooks has an edge case: if you apply SST retroactively to an invoice (common in Malaysia), FreshBooks doesn't recalculate the footer summary field. Xero does. The three validation gates that fail silently Gate 1: GST rounding (Indonesia e-Faktur) Indonesia's e-Faktur validator (live LHDN submission) is ruthless about rounding. If you invoice ₹100,000 with 10% GST, the GST is ₹10,000 exactly. But if you invoice ₹100,001, GST is ₹10,000.10—and e-Faktur rounds it differently depending on the line-item count. One item, round to nearest thousand. Two items, round per line. FreshBooks applies one rounding rule across all invoices. Wave applies none—it exports the raw calculated value. Xero lets you set rounding per company, and it validates before you submit. Test invoices with odd line-item counts and non-round subtotals: Wave failed 4 of 10 here, FreshBooks 2 of 10, Xero 0. Gate 2: NPWP format and prefix validation NPWP prefixes matter. Indonesian government agencies use a different prefix (00) than private companies (00–04). If you're invoicing a government entity (common in procurement), MyInvois checks that the customer NPWP begins with "00". If your invoice shows a private company NPWP (01–04) on a government invoice, it fails. None of the three platforms validate this contextually. You can create the mismatch, and you'll only catch it when MyInvois rejects the batch. Xero's interface makes it slightly harder (it flags high-risk NPWP prefixes), but doesn't block submission. FreshBooks and Wave don't flag it at all. Gate 3: Invoice date mismatches (Malaysia) Malaysian MyInvois validators check that your invoice date matches your business fiscal period and that you're not backdating invoices more than 30 days. FreshBooks allows invoice dates up to 90 days in the past. Xero and Wave allow 60 days. When we submitted batches with invoices dated 45 days back, FreshBooks passed (because its own validation allowed it), but MyInvois rejected them. Xero and Wave passed. How to test your own invoice backlog You don't need to wait for the next batch to fail. Most accounting platforms expose a validation API. Here's how to run your own audit: Step 1: Export a sample of invoices (last 50–100) Export from your current platform in the format MyInvois validators accept. For Malaysia, that's typically CSV with fields: Invoice No., Date, Customer NPWP, Line Item, Amount, SST Rate, SST Value. For Indonesia, add GST Rate and GST Value. Most platforms export this directly; some require a plugin. Step 2: Use the live validator Both Malaysia (LHDN MyInvois) and Indonesia (DJP e-Faktur) offer free sandbox validators. Register an account and upload your sample. The validator will return line-by-line errors. Don't ignore the granular errors—they map to specific fields in your platform. Step 3: Map errors back to platform gaps Errors li