A SaaS founder based in Singapore sells monthly subscriptions to customers across Malaysia, Indonesia, and Singapore. The August invoice ships 20% of units to Kuala Lumpur (SST 10%), 30% to Jakarta (PPN 11%), and 50% to Singapore (GST-exempt). When the October promo applies a mid-cycle credit, the tax splits must adjust line-by-line—not as a lump adjustment on the GL. This is not theoretical. It's also not something most invoicing platforms handle cleanly. Xero, QuickBooks, Wave, Zoho, and Orin all claim multi-tax support. But the difference between "we support multiple tax rates" and "we auto-code by delivery address and survive a MyInvois audit" is everything. The tax-per-line problem no platform admits Standard invoicing logic treats tax as a customer property: you tag a customer as Malaysia or Indonesia, and all their invoices inherit that rate. This breaks the moment a customer orders from multiple jurisdictions in a single billing cycle. The correct approach is line-item coding: each line inherits tax from its delivery address, not the bill-to. And when a mid-cycle proration happens—a plan downgrade, a one-time credit, a currency revaluation—the tax must recalculate only on the affected lines. Here's what goes wrong: Xero codes tax per customer contact address. When one customer has a Singapore office and a Kuala Lumpur warehouse, Xero defaults to the contact record's primary address. Moving inventory between them requires a manual tax-code override on each line—and Xero's audit trail records this as a user edit, not a system-driven calculation. QuickBooks Online applies tax based on the invoice header's ship-to address. This works for single-destination orders but fails for recurring subscriptions where the customer may consume services across zones. The platform lacks a native way to code individual line items to different tax jurisdictions on the same invoice. Wave supports custom tax rates per line, but these are manual additions. There's no logic to auto-populate tax codes based on delivery geolocation. Building this in Wave requires external integration or spreadsheet work. Zoho Books allows you to assign tax classes to line items, but tax assignment is not automated by address. You must either create separate customer records per jurisdiction (chaos at scale) or manually override tax on each invoice line. Orin ties tax coding to the line-item's delivery address field, not the customer header. This means a single invoice can carry multiple tax jurisdictions, and proration logic recalculates only the affected lines. More on this below. The mid-cycle proration test: where GL splits break In September, a customer downgrades mid-cycle. They owe a credit of ₹50,000 across three jurisdictions: ₹20,000 shipped to Malaysia, ₹15,000 to Indonesia, ₹15,000 to Singapore. The GL impact should be clean: Malaysia: Revenue -₹20,000, SST Payable -₹2,000 (10%) Indonesia: Revenue -₹15,000, PPN Payable -₹1,650 (11%) Singapore: Revenue -₹15,000, GST Payable -₹0 (exempt) Now test each platform: Xero: Applies the credit as a single line item with the customer's primary tax rate. You get one GL debit to a tax account, not three. Fixing this requires a manual journal entry, which breaks audit trails. The auditor sees the original invoice invoice, the credit memo, and then a hand-written GL adjustment—three separate records for one logical transaction. QuickBooks Online: The credit memo inherits the invoice's ship-to address. If the original invoice was coded to Singapore (because that's the primary ship-to), the credit applies Singapore's GST—even though the credit only applies to Malaysia and Indonesia shipments. The GL posts as a single tax reversal, not three. Wave: Requires you to create three separate line items on the credit memo (one per jurisdiction, with manual tax overrides) to get the GL right. This is not a bug; it's the intended workflow. But it means Wave users spend 15 minutes per proration manually coding tax. Zoho Books: Similar to Wave—you can code each credit line to a different tax class, but there's no automation. At 50+ customers across three zones, this becomes a data-entry nightmare. Orin: The system reads the delivery address from the line item. When you create a credit, it auto-populates the tax code for each affected jurisdiction and splits the GL accordingly. No manual override needed unless you're correcting an address error. Address-to-tax auto-coding: Which platform delivers The efficiency gain from auto-coding is non-trivial. Assume 100 recurring invoices monthly, 30% of which involve multi-zone shipments, and 20% of those require proration: Wave + manual tax coding: 100 × 0.3 × 0.2 × 0.25 hours (15 min) = 1.5 hours/month, or 18 hours/year Xero + correction journal entries: 100 × 0.3 × 0.2 × 0.5 hours (30 min, to create + reconcile JE) = 3 hours/month, or 36 hours/year Orin + auto-coding: 100 × 0.3 × 0.2 × 0.03 hours (2 min, to verify address) = 0.12 hours/month, or 1.4 hours/year At bill