Recurring revenue should be simple: bill the same customer the same amount every month. But across Southeast Asia—with Malaysia's SST, Indonesia's PPN, Singapore's GST, and three different currencies—that invoice becomes a compliance minefield. Add a mid-cycle upgrade, a refund, or an exchange rate swing, and most invoicing tools silently diverge from your general ledger. This guide walks through the real math: how to invoice hybrid SaaS + service models with accurate tax splits, handle currency fluctuation without rounding chaos, and prorate charges so your audit trail survives scrutiny from Malaysia's LHDN, Indonesia's DGT, or Singapore's ACRA. Why recurring revenue tax splits break most platforms A recurring invoice looks deceptively simple until you cross a border. Take a $1,000 SaaS subscription for a Malaysian reseller with an Indonesia-based end customer and a Singapore service add-on: Malaysia leg (SST 6%): $300 platform fee → $18 SST, GL code 2100 (revenue), 2150 (tax payable) Indonesia leg (PPN 11%): $500 managed services → $55 PPN, GL code 4000 (revenue), 2200 (tax payable) Singapore leg (GST 9%): $200 license → $18 GST, GL code 5000 (revenue), 2300 (tax payable) The invoice totals $1,091; the GL shows $1,073 revenue + $91 tax payable. Most platforms stop there. But the tax registers—your monthly SST return to LHDN, PPN return to DGT, GST return to ACRA—each require the full detail. Worse, if the invoice is prorated mid-cycle, rounding errors compound across three tax jurisdictions. At ₹50M revenue, a single-digit rounding error on each invoice becomes ₹500K+ in tax reconciliation drift by year-end. By month three, you cannot match your tax returns to your invoices without manual intervention. The proration trap: when mid-cycle changes explode tax logic A customer downgrades mid-cycle from $1,000 to $600 on day 15 of a 30-day month. Most platforms prorate naively: Days 1–15: $500 (half of $1,000), tax ~$30 Days 16–30: $300 (half of $600), tax ~$18 Credit issued: $200 (half of $400), tax credit ~$12 But SST rules in Malaysia, PPN in Indonesia, and GST in Singapore each have slightly different rounding rules. Apply Singapore's rounding rule and you owe ACRA an extra ₹2. Apply Malaysia's and you have a ₹1 debit to the SST account. Across 1,000 customers with mid-cycle changes, these rounding differences become ₹50K+ by month-end—and your tax authorities will flag it. The correct approach: Calculate proration before applying tax rates (not after) Apply tax rates per jurisdiction's rounding standard (always round tax itself, never net revenue) Create separate GL entries for original invoice, proration adjustment, and credit—never net them Log the rounding difference as a line item and tie it to a rounding variance GL account Currency fluctuation: FX hedging on the invoice itself A customer in Indonesia pays in IDR but your SaaS is priced in USD. On day 1, the exchange rate is 15,500 IDR/USD. By day 30 when they pay, it's 15,200 IDR/USD. Invoice issued: $1,000 @ 15,500 = 15,500,000 IDR Payment received: 15,200,000 IDR (actual rate on payment day) Shortfall: 300,000 IDR If you invoice in IDR and lock the rate on invoice date, you absorb FX risk. If you invoice in USD and the customer pays in IDR at the time-of-payment rate, they absorb it—but reconciliation becomes a nightmare because the invoice amount and payment amount diverge. The best practice for recurring revenue across SE Asia: Invoice in the customer's local currency (IDR for Indonesia, MYR for Malaysia, SGD for Singapore) Lock the FX rate on invoice date; do not update it when payment arrives Record the FX variance (favorable or unfavorable) in a dedicated GL account (8500 - Currency Gains/Losses) on the day payment is recorded For tax purposes, recognize the revenue in the customer's currency at the invoice-date rate; tax authorities in SE Asia expect this Report FX variance separately in your financial statements Tools like Orin's invoicing layer allow you to lock FX rates per invoice and track variance automatically. Most generic platforms (Wave, FreshBooks, even Xero for small teams) force you to reconcile FX manually each month. Real example: A SaaS + services hybrid across three countries GrowthLabs is a marketing automation platform used by resellers in Malaysia, Indonesia, and Singapore. Their customer Apex Media is a reseller in Kuala Lumpur who manages end-clients in Jakarta (PPN) and Singapore (GST). Here's Apex's monthly invoice: Component Amount (USD) Rate Tax GL Code Platform (Malaysia-based delivery) $800 6% SST $48 4000 / 2100 Consulting (Indonesia delivery) $400 11% PPN $44 4100 / 2110 Support (Singapore delivery) $300 9% GST $27 4200 / 2120 Total $1,500 $119 $1,619 Now, on day 15 of the month, Apex upgrades consulting from $400 to $600 (+$200 for remaining 15 days = +$100 prorated). The system must: Issue an adjustment invoice for +$100 consulting @ 11% PPN = +$111 total Post to GL: 4100 (revenue) +$100, 2110 (tax payable) +$