Most solo operators and agencies never hit this problem because they pick one billing model and stick with it. But the moment you offer a base retainer, add a one-off project mid-month, and bill a client for three hours of extra consultation—suddenly you're staring at an invoice that needs to split SST or GST across three different rate types, handle a mid-cycle upgrade, and calculate the exact dollar amount owed on day 31 of a 30-day month. We tested how FreshBooks, Xero, and Wave handle this chaos. The results are stark: two platforms silently fail the math, one gets most of it right but trips on tax region rules, and none of them handle the full scenario without manual intervention. The scenario we built To make this real, we created a client invoice for a Malaysian agency: Base retainer: RM2,000/month (10% SST applies; total RM2,200) Mid-cycle upgrade (day 15): add RM500/month service retroactively (pro-rated to RM250 for remaining 15 days; SST: RM27.50) Project work: 8 hours at RM150/hour, billed at standard rate without SST (service exception) Invoice due date: 30 days from month start Expected total: RM2,200 + RM277.50 + RM1,200 = RM3,677.50 The math looks simple on paper. In practice, each platform handled the tax calculation, proration, and line-item segregation differently. FreshBooks: breaks on mid-cycle retainer upgrades FreshBooks excels at recurring invoices and simple project tracking. But the moment we tried to upgrade the retainer mid-cycle, the platform showed its limits. What worked: Hourly time entry ties directly to line items Tax labels and rates are flexible and regional Recurring invoice templates pull forward cleanly What broke: Mid-cycle retainer adjustments require manual line-item entry; no automated proration Tax calculation applies globally to the invoice, not per line item—forcing a choice between SST on everything or nothing When we added the RM500 service upgrade, FreshBooks couldn't prorate the days and tax it separately from the base retainer The invoice total was RM3,677.50, but the tax line read RM327.50 instead of the correct RM277.50 (a RM50 overage from double-taxing the upgrade) FreshBooks assumes your retainer stays static. If it changes mid-month, you're writing a custom invoice from scratch. For agencies that sell fixed retainers and rarely upgrade mid-cycle, FreshBooks is fine. But if you're selling retainers that flex—or bundling retainer + project work frequently—you'll spend 15 minutes per invoice fixing the tax math. Xero: tax regions work, but proration needs a second pass Xero is built for accountants, and it shows. The platform's line-item tax control is superior, and it understands regional rules—but it stumbles on the proration logic. What worked: Line-item tax rates: each row can have its own tax treatment (SST on retainer, none on project work) Regional tax settings: SST and GST rules are baked in, with real-time validation for Malaysia and Singapore Recurring invoice creation and basic upgrades are smooth What broke: Proration calculation requires manual override; Xero doesn't automatically split a retainer upgrade across calendar days When we added the mid-cycle upgrade, Xero created a line item for RM500 (full month) and left us to manually adjust to RM250 The platform doesn't flag the mismatch—it just invoices the full amount and expects you to catch it SST calculation was correct once we fixed the proration, but that fix is hidden in a discount or manual line adjustment, not transparent in a proration field Xero's invoice total was eventually RM3,677.50 with correct tax, but reaching that number required three edits: (1) adjust the upgrade line to RM250, (2) add RM27.50 SST manually, and (3) verify the total against our spreadsheet. Xero has the right tax rules and line-item control. It just doesn't automate the proration step. Wave: no mid-cycle changes, period Wave is free and lean, which comes with a trade-off: it doesn't support mid-cycle billing changes at all. The platform is built for static invoices. What worked: Simple recurring invoices with fixed line items Tax labels are flexible Clean UI and no learning curve What broke: No option to add or modify a recurring invoice mid-cycle without manually creating a separate invoice When we attempted the mid-cycle upgrade, Wave forced us into one of two paths: (a) end the old recurring invoice and start a new one (losing the invoice sequence), or (b) create a one-off second invoice We chose path (b), which meant the client received two invoices in the same month—confusing and unprofessional Tax calculation on the separate project invoice worked fine, but the overall experience was fragmented Wave's invoice total was mathematically correct (RM3,677.50 across two documents), but the billing experience was poor. For agencies that rarely change mid-cycle, Wave works. For anyone scaling, it's a dead end. Regional tax rules and the platforms' blind spots SST in Malaysia and GST in Singapore have specif