Indonesia's E-Faktur mandate enters enforcement phase in Q2 2025. The Directorate General of Taxes (DJP) no longer tolerates manual workarounds, fake serialization, or delayed validation. Your invoicing platform either passes real-time compliance gates or your invoices fail at the point of entry—costing you 72-hour resubmission cycles and audit liability. We audited Wave, FreshBooks, Xero, and five regional competitors against the 15 compliance checkpoints that DJP actually enforces. Most platforms pass on surface—they serialize invoices, they store XML. But when you dig into the real gates—real-time NPWP validation, accurate GL splitting, batch processing delays—the gaps become obvious. FreshBooks fails on GL splits for mixed-tax invoices. Wave does not validate NPWP in real time. Xero batches validation every 24 hours, creating audit risk if a fraudulent invoice slips through at 11 p.m. and sits in your system until the next morning batch. This guide walks you through the 15-point readiness checklist. It shows you exactly where each platform breaks, and how to audit your own setup in 90 minutes. The 15-point E-Faktur 2025 readiness scorecard DJP enforcement focuses on five areas: serialization integrity, tax ID validation, invoice data structure, GL accounting splits, and audit trail clarity. Here are the 15 gates: Serialization & Storage (Gates 1–4) Auto-serial numbering with DJP format. Your platform must generate serials matching DJP's [KodeJenisDokumen]-[KodeFaktur]-[Nomor] syntax. Manual entry, or deviation from this syntax, fails immediately. Wave and FreshBooks let users enter custom serials—dangerous. Unique serial per invoice, never reused. Batch exports sometimes recycle serials across batches. Verify your platform locks serials after submission. XML file storage with cryptographic hash. E-Faktur requires retention of the XML payload and a hash proof that the payload has not been altered after submission. FreshBooks stores PDF only; no XML. Failure on audit. Immutable invoice log. Once submitted, the invoice timestamp and serial cannot change. Xero allows invoice date edits up to 30 days; this violates E-Faktur immutability rules. NPWP Validation (Gates 5–7) Real-time NPWP format validation. Platform must check that the seller and buyer NPWP are syntactically valid (15 digits, numeric, correct checksum) before save. Wave does batch checks nightly. If you submit an invoice with a fake NPWP at 8 p.m., it sits in your system as 'valid' until the batch runs at 2 a.m. In that window, a user can accidentally mark it as submitted to DJP. Cross-reference against DJP registry. Real-time validation is not enough; you need live API calls to DJP's NPWP database. FreshBooks does not offer this. Xero offers it as an add-on, not a baseline feature. Reject non-numeric NPWP, auto-trim whitespace. Buyer entry forms should reject spaces or dashes. Most platforms store NPWP as entered, which creates submission failures when the space is still there. Invoice Data Structure (Gates 8–10) All mandatory E-Faktur fields present and non-empty. DJP requires 42 fields minimum. Missing reference_number , payment_method_code , or currency_code causes rejection. Most platforms default these, but custom invoice templates sometimes omit them. Audit your template before Q2. Line-item GL account mapping to E-Faktur classification. Each line must map to a DJP-approved GL classification. Mixed-tax invoices (one line at 10% PPN, another at 0% PPN) require separate GL accounts and separate line entries in the XML. FreshBooks collapses these into one GL line with a single tax rate; it will fail on mixed-tax invoices. Rounding consistency across tax calculations. If you have a ₹1,000,000 invoice split across two tax rates (7.5% PPN + 1.5% PPh), the platform must round each tax line identically or the XML checksum fails. Spreadsheet-based rounding (round-half-up vs. banker's rounding) causes mismatches. Most accounting platforms do not document their rounding method. GL Accounting & Audit Trail (Gates 11–15) Separate GL entries for tax collected vs. tax paid. PPN collected (liability) and PPh withheld (asset) must post to different GL accounts. If your platform bundles these, your balance sheet will be wrong by definition. Wave does this correctly; FreshBooks does not offer separate GL mapping for withheld tax. Audit trail: user, timestamp, action on every invoice change. DJP audits require proof of who changed what and when. Xero tracks this; Wave does not expose the audit log in exports. E-Faktur submission timestamp stored separately from invoice date. When you submit to DJP, the platform must record the submission timestamp, not overwrite the invoice date. Some platforms conflate these. If DJP asks 'when was this submitted?', you must answer with the submission timestamp, not the invoice date. Batch export integrity: all invoices in batch have same status post-submission. After you submit a batch to DJP, the entire batch is m