Most platforms treat tax like a global toggle: flip it on, and every invoice gets taxed the same way. In Southeast Asia, that kills your compliance and customer trust. SST in Malaysia applies to services at 6%. GST in Singapore hits digital services and SaaS at 8%—but not retainers sometimes. PPN in Indonesia ranges from 0% to 10% by goods category. And retainer fees? Often taxed differently than project work on the same invoice. Stripe Billing, Chargebee, and Orin all support recurring revenue. But their tax logic is loose. This playbook walks you through building a billing config that actually knows your customer's location, service type, and tax treatment. Then you'll set up mid-cycle proration so upgrades and downgrades don't trigger accidental refunds or double-charges. Why standard recurring billing tax rules fail in SE Asia Most platforms work like this: you create a product, assign a tax rate globally, and invoice monthly. The assumption is homogeneous—all customers, one rate. Reality in SE Asia: Location-based variation: A Malaysian customer gets SST (6% on services). The same customer's Singapore subsidiary gets GST (8%). The platform often sees them as one entity or demands you create duplicate products with different tax rules. Service-type variation: A retainer for advisory is often exempt from GST in Singapore. The same retainer with hourly support tacked on isn't. You're invoicing one customer for both. Multi-currency complexity: You invoice in MYR to Malaysia, SGD to Singapore. Currency conversion timing affects the tax base in some regimes. Most platforms convert total, then apply tax. The correct order is tax, then convert. Mid-cycle changes: A customer upgrades mid-month. Stripe Billing and Chargebee prorate line-by-line, but tax treatment of the new line often defaults to the product's global rate, not the customer's locale. Most platforms treat tax like a global toggle. In SE Asia, that kills compliance and customer trust. Step 1: Define your tax matrix by locale and service type Before you touch your billing platform, map your tax obligations on a spreadsheet. This becomes your source of truth. Example matrix: Malaysia, Services: SST 6%. Applied to: advisory, development, support. Malaysia, Goods: SST 6%. Applied to: licenses, hardware resale. Malaysia, Retainer: SST 6% (no exemption). Singapore, SaaS: GST 8%. Applied to: platform subscriptions, API access. Singapore, Services (Professional): GST 0% (exempt if provider is overseas). Applied to: advisory from non-SG entities. Singapore, Retainer: GST 0% if purely advisory; GST 8% if includes support hours or platform access. Indonesia, Goods: PPN 10% (standard rate). Some digital services 0% if specified seller. Indonesia, Services: PPN 10%. Applied to: consulting, design, support. Validate this with your accountant for your specific business structure. Exemptions vary wildly by company domicile and customer location. Step 2: Configure customer location and tax class in your billing system Most modern billing platforms (including Orin's invoicing and billing suite ) allow you to store a customer's billing address and map it to a tax jurisdiction. Here's how to set it up to actually work: In your customer record: Billing Address: Store country, state/territory, city. Don't abbreviate. "SG" is ambiguous; "Singapore, Central Region" is clear. Tax ID (Optional but recommended): Store the SST, GST, or PPN registration number if the customer is B2B. Use this to trigger exemptions. Service Category: Create a dropdown: "SaaS / Platform", "Advisory / Services", "Retainer / Support", "Goods / Hardware". This drives tax treatment, not just the location. Tax Treatment Override: For known exemptions (e.g., overseas GST, non-profit SST exemption), add a checkbox or dropdown to flag "Exempt" with a reason. Document it for audit. In your product catalog: Create products by service type, not by geography. Don't create "Platform - Malaysia" and "Platform - Singapore". Create one "Platform SaaS" product. Link each product to a tax code, not a static tax rate. Stripe Billing uses Stripe Tax; Chargebee uses custom tax classes. Orin allows you to define tax rules that reference both product type and customer jurisdiction. For retainers, split into line items. If a retainer includes advisory (exempt in SG) and platform access (taxable), invoice as two line items. Most platforms allow this; it ensures the right tax applies to each part. Step 3: Set up tax calculation rules by customer location This is where implementation differs by platform. Here's the principle, then examples: Principle: At invoice generation, the system should look up the customer's location and service category, then apply the correct tax rate. If the rate is 0% (e.g., overseas GST), show it on the invoice for transparency, even if the amount is zero. Stripe Billing approach: Stripe Tax automatically looks up jurisdiction based on customer address. But it applies default rules per country.