A service business in Kuala Lumpur invoices a client every month. Half the work is a flat retainer (₱15,000, no tax). A quarter is billable project work (₱8,000, subject to 6% GST). The rest is hourly time-and-materials tracked to the minute (₱2,400, also 6% GST, but prorated if the client disputes hours). One invoice. Three billing models. Three tax treatments. This is not exotic. It is routine for agencies, consultancies, fractional CFOs, and managed service providers. Yet most invoicing platforms—even expensive ones—force workarounds: manual line-item adjustments, separate invoices reconciled by hand, or tax codes that don't map to the mixed structure. We tested Xero, QuickBooks Online, Zoho Invoice, and FreshBooks on the exact scenario above, across line-item tax rules, proration logic, and GST application. The real problem: tax codes don't nest Most invoicing platforms store a single tax code per line item. Retainers are often non-taxable. Projects may be taxable. Hourly work may be taxable but prorated by day. That's not three line items—that's three different business rules applied to the same invoice. Here's what happens in practice: Xero. Supports line-level tax codes and conditional exemptions. You can mark the retainer as tax-exempt and the projects as taxable. But prorating hourly work by actual hours—especially if you bill in bulk and need to adjust for scope creep—requires a manual adjustment line. Xero doesn't auto-prorate within a billing period; you post a separate line for the partial week or day. That works, but it clutters the invoice and your accounting export. QuickBooks Online. Tax code assignment is line-level. You can exempt retainers and tax project/hourly. But QuickBooks doesn't have a native proration rule—if you bill ₱100/hour for 47.5 hours, you must manually enter 47.5. There's no "bill up to this cap" or "prorate if hours exceed X." For recurring or variable hourly invoices, this becomes a data-entry nightmare at scale. Zoho Invoice. Allows line-level tax configuration and has time-tracking integration. You can log hours in Zoho's time tracker, and they auto-populate the invoice. Tax is applied per line. Zoho's strength: the time tracker and invoice are coupled, so prorating is visible. Weakness: if your time log crosses billing periods or needs adjustment after logging, the invoice doesn't recalculate tax automatically—you adjust the line, but the tax recalculation is manual. FreshBooks. Native time tracking and invoice generation. Hours logged automatically create invoice line items. Tax applied per line. FreshBooks' advantage: if you adjust billable hours after invoicing, it recalculates tax on that line. Disadvantage: if you bill hourly and on retainer to the same client in the same month, the retainer line and hourly line are separate—FreshBooks doesn't collapse them into a single invoice by default. You have to manually group them. Proration: where platforms stumble hardest Proration is the silent killer. You invoice a client on the 15th for a monthly retainer + project hours logged so far. The project isn't finished; you'll bill more hours next month. Some clients pay on net-30 and will dispute hours after invoicing. You need to prorate the hourly amount, apply the correct tax rate to that portion, and keep a clean audit trail. Proration without native rules forces spreadsheet exports and manual line adjustments. At 10+ mixed-billing clients, this becomes ₱40–60K in annual admin friction. Xero's approach: You create a partial invoice via the API or manually add a line item for "partial hours, ₱X, tax Y%". No proration rule. You calculate it offline and type it in. Audit trail exists, but the logic doesn't live in the system. QuickBooks Online: Similar. No proration rule. You must decide the amount and tax before posting the line. If the client later disputes 5 hours, you post a separate credit memo—clean in the accounting sense, messy operationally. Zoho Invoice: Time tracker logs hours daily. You can set an invoice to include hours from day 1 to day 15 of the month. Zoho calculates the line amount and applies tax. If you need to exclude disputed hours, you can remove them from the invoice before posting. After posting, you'd issue a credit memo. The proration is visible—Zoho shows which hours are on which invoice—but it's not automated across billing periods. FreshBooks: Strongest here. Time entries logged in FreshBooks' time app auto-populate invoices. You can set an invoice to include hours from a specific date range. FreshBooks sums the hours, calculates the line amount, and applies tax. If hours are disputed after invoicing, you can create an adjustment invoice (partial credit). The recalculation is automatic within that invoice. GST, SST, and cross-border complications In Malaysia and Singapore, GST (now called SST in Malaysia) applies differently to services. A retainer for "general business consulting" might be exempt (if the client is GST-registered) or taxabl