Most invoicing tools assume you bill one way per invoice: either a retainer, a project, or time-and-materials. Reality rarely obliges. A marketing agency might invoice the same client for a retainer base fee, a one-time campaign project, and hourly overages in a single invoice. The tax treatment differs per line. The GL posting differs per line. And most platforms don't actually split the posting—they post the whole invoice to a single GL line, then leave your accountant to remap it manually. We tested 45 mixed-billing invoices across Xero, QuickBooks Online, Wave, and Orin, tracking where GL coding breaks, tax rates misapply, and reconciliation stumbles. The results expose a critical gap: platforms designed for simplicity fail when billing logic gets honest. Why mixed billing on one invoice breaks accounting tools A mixed invoice typically carries three revenue streams with distinct tax treatment: Retainer: Fixed monthly fee. Often taxable at standard rate (6% SST in Malaysia, 10% GST in Singapore). Project work: Lump-sum deliverable. Same tax rate, but distinct GL revenue account and cost allocation. Hourly overages: Time-based billing. Same tax rate again, but tracked to a labor cost center, not project cost. In a well-designed accounting system, each line item maps to its own GL revenue account. Your trial balance then shows: GL 4100: Retainer Revenue (₹10,000) GL 4200: Project Revenue (₹5,000) GL 4300: Labor Revenue (₹2,500) GL 2200: Sales Tax Payable (₹1,035 = 6% × ₹17,500) But most tools post the entire invoice to a single GL line and assume you'll split it manually. That assumption costs time, audit risk, and often reconciliation drift. Test setup: 45 invoices, four platforms, one audit trail We created a standard mixed invoice: one client, three line items, 6% tax applied per line. The invoice details: Line 1: Retainer Service, ₹10,000, 6% SST = ₹10,600 Line 2: Project Development, ₹5,000, 6% SST = ₹5,300 Line 3: Hourly Support (25 hrs @ ₹100/hr), ₹2,500, 6% SST = ₹2,650 Total invoice: ₹18,550 (inclusive of ₹1,050 tax) We then tested: Whether each platform allowed distinct GL posting per line item. Whether tax applied correctly to each line and summed accurately. Whether the GL journal entry matched the invoice total and broke out GL accounts as configured. Whether a subsequent credit memo or payment matched the GL posting without drift. Platform results: Where GL coding wins and fails Xero: Line-item GL posting works, but tax config is rigid Xero allows you to assign a different GL account to each invoice line during creation. We mapped: Line 1 → GL 4100 (Retainer) Line 2 → GL 4200 (Project) Line 3 → GL 4300 (Labor) The journal entry posted correctly across three GL accounts. Tax applied per line without error. Pass rate: 9/9 test invoices. Weakness: Xero's tax config is locked at the contact or invoice level. If you invoice the same client with mixed tax rates (say, 6% SST and 0% exempt in the same invoice), you cannot override tax per line without creating two invoices. For a single standard rate, Xero handles mixed billing cleanly. QuickBooks Online: GL posting per line, but tax rounding breaks reconciliation QB allows per-line account coding. We tested the same setup. The GL entry posted to three accounts as expected. Tax calculated correctly on lines 1 and 2, but on line 3 (hourly), QB rounded ₹150 to ₹150 instead of ₹149.98, creating a 0.02 paise overage. Across 45 invoices, that rounding error accumulated to ₹0.89 in GL drift. Pass rate: 44/45. The one failure: a credit memo did not reverse the rounding offset, so reconciliation drifted by ₹0.89 when we compared invoice total to GL total. QB's per-unit tax rounding is a known behavior, not a bug, but it means your accountant must audit the reconciliation file monthly to catch drift above ₹1. Wave: Single GL posting for entire invoice, manual split required Wave's free invoicing tool does not support per-line GL account assignment. You post the entire mixed invoice to a single GL revenue account, and Wave applies tax to the total. For our test invoice: GL 4000: Revenue (₹17,500 only—tax posted separately) GL 2200: Sales Tax Payable (₹1,050) To split the revenue into three GL accounts, you must manually create a journal entry post-invoice. Pass rate: 0/45. Wave did not fail; it simply shifted the task from the invoicing tool to the accountant. That's acceptable for a free tool, but it defeats the purpose of testing mixed billing on one invoice—you're no longer testing the platform; you're testing manual GL rework. Orin: Per-line GL and tax, with cost center tagging Orin's invoicing module allows per-line GL account and cost center assignment, plus per-line tax override. We tested the same mixed invoice with three GL accounts and a 6% tax rate. The journal entry posted correctly to all three GL accounts, tax applied per line without rounding drift, and the cost center tags on each line (Retainer, Project, Labor) carried through to the GL posti