Recurring revenue in Southeast Asia looks simple until you invoice across borders. A customer in Kuala Lumpur on a ₹15,000/month subscription should cost you one line item. A customer in Jakarta on the same plan costs three: the base charge in IDR, an e-Faktur audit trail, and currency conversion slippage on the invoice date. Add a midcycle downgrade and you're proration-calculating in three tax regimes simultaneously. Most invoicing platforms handle recurring billing well within a country. Almost none handle it well across Malaysia, Singapore, and Indonesia together. We've tested FreshBooks, Xero, QuickBooks, and Wave against real subscriptions, real tax thresholds, and real proration math. One platform nails it. The others leave gaps that cost you reconciliation time and tax audit risk. Tax thresholds that trigger invoicing rules Your threshold matters because it determines whether you invoice at all, whether you charge tax, and whether your customer needs to register for tax reporting themselves. Malaysia: SST at ₹50K annual threshold Service and Sales Tax (SST) applies to supplies of goods and services. Most software services are taxed at 6%. A customer paying ₹15,000/month crosses ₹50K/year quickly—usually in month 4. Once they're over, you charge 6% on every invoice going forward. The gap: Most platforms don't automatically apply retroactive SST once a customer crosses the threshold mid-year. You'll invoice months 1–3 without SST, then hit month 4 and either: Manually recalculate months 1–3 and issue credit notes (messy, error-prone) Start charging from month 4 onward (leaves a compliance hole) Use a platform that tracks cumulative annual revenue and applies SST retroactively to the first invoice of the triggering month The third option exists but isn't common. Xero handles this if you manually flag the threshold date. FreshBooks and QuickBooks default to per-invoice tax calculation, which means you'll need a process to catch threshold crossings. Singapore: GST at SGD 1M annual threshold Goods and Services Tax (GST) is 9% for suppliers above SGD 1M annual turnover. A SaaS company with 20 customers at SGD 500/month (roughly ₹300K) crosses this threshold around month 7. The gap: Singapore's IRAS requires you to register for GST retroactively from the month you crossed the threshold, not the month you noticed. If you're invoicing in SGD and your customer base spans three countries, currency conversion timing matters. Xero calculates GST on SGD invoices at the time of invoice, not the date of supply—a compliance risk if your invoice date drifts from delivery date. Indonesia: e-Faktur registration and real-time LHDN sync Indonesia's Ministry of Finance (LHDN) requires e-Faktur invoices for B2B supplies over IDR 5M (roughly ₹25K). But the real threshold that matters is the NPWP (tax ID). Most SMBs register for NPWP at roughly IDR 4.8B annual revenue, but freelancers and smaller firms under that threshold can still invoice without e-Faktur. The gap: If your customer has an NPWP, you must issue e-Faktur invoices. If they don't, you can issue a standard invoice. Most invoicing platforms don't natively validate NPWP or generate e-Faktur XML. FreshBooks and Wave do not support real-time LHDN submission. Xero submits e-Faktur to LHDN but only once per day, which means if an invoice is rejected (bad NPWP, missing PPN), you won't know for 24 hours. If you're billing B2B in Indonesia and don't validate NPWP at customer signup, you'll issue invoices that LHDN rejects. That's not a tax audit risk—that's an invoice that your customer legally cannot use. Proration: where midcycle changes break SST and GST Proration is math: old_daily_rate × remaining_days − new_daily_rate × remaining_days = credit or charge. Most platforms do this correctly. But when you mix proration with tax thresholds, things fracture. Scenario: customer downgrades midcycle in Malaysia A customer on ₹20,000/month downgrades to ₹8,000/month on day 15 of their 30-day cycle. The prorated charge is: Old rate: ₹20,000 ÷ 30 days = ₹667/day New rate: ₹8,000 ÷ 30 days = ₹267/day Charge for remaining 15 days: (₹667 − ₹267) × 15 = ₹6,000 If this customer is under the SST threshold before the downgrade but you're applying SST in month 4 (because the original subscription rate crossed the threshold), the proration credit needs to carry the same tax treatment as the original invoice. Xero splits the prorated amount and applies SST based on the date of the proration, not the original invoice date. That's a reconciliation error waiting to happen. Scenario: currency conversion and proration in Singapore You bill a Singapore customer in SGD at SGD 500/month. They downgrade midcycle on day 15. The prorated amount is SGD 250. Your accounting system is in INR. You're recording the original invoice at the spot rate on invoice day 1 (SGD 1 = ₹53.2, so SGD 500 = ₹26,600). The prorated credit posts on day 15 at the spot rate on that day (SGD 1 = ₹53.4, so SGD 250 = ₹13,350)