If you run a service business—digital agency, consulting firm, development shop—you've probably hit this wall: one client, three billing models in the same month. A $5,000 retainer for baseline support. A $500 project charge for the custom work they asked for mid-month. Hourly time at $150/hour for emergency fixes. One invoice. Three math problems. Most invoicing platforms either force you into a single billing model or leave you manually adjusting line items and hoping the totals land right. We tested Xero, FreshBooks, Zoho, and Wave on their handling of mixed billing, retainer offset logic, and what actually requires a spreadsheet workaround. The problem: retainer offset isn't standardized Here's where teams get stuck. You bill a $5,000 retainer upfront. By month-end, you've logged 8 hours of work at $150/hour—that's $1,200 in additional charges. Some platforms handle this cleanly: they deduct the retainer from the hourly total automatically. Others require you to manually create a negative line item or worse—they don't support the concept at all. The stakes matter. If your invoicing platform doesn't handle offset logic correctly, you either: Overcharge the client (and damage trust) Undercharge and leave money on the table Spend 15 minutes per invoice adjusting line items manually Build a spreadsheet parallel to your invoicing tool At scale—if you invoice 50+ clients monthly with mixed billing—this becomes a reconciliation nightmare. Your accounting team spends time auditing invoice logic that the software should handle. Worse, mistakes compound across months if retainer rollover isn't tracked cleanly. How retainer + project + hourly actually breaks down Let's use a real scenario. A client engages you for: Retainer: $5,000/month for 10 hours of availability Project work: A one-off feature build at $500 Hourly overages: 12 hours logged at $150/hour = $1,800 Your math should work like this: Retainer covers 10 hours at $150/hour = $1,500 of the $5,000 That leaves $3,500 as your baseline service fee (the value-add, not just time) Project work: $500 (separate line, doesn't touch retainer) Overages: 12 hours × $150 = $1,800. Retainer covers 10 hours already, so you bill 2 additional hours = $300 Total invoice: $5,000 (retainer) + $500 (project) + $300 (overage) = $5,800 That's the logic that makes sense. Now let's see which platforms actually implement it. Xero: Clean retainer handling, but offset requires setup Xero handles retainers through recurring invoices and a subscription framework. You can set up a retainer as a line item that recurs monthly, and Xero will auto-generate that invoice each cycle. Where it shines: tracking retainer credits and applying them against additional charges is possible , but it's not automatic. The workflow: Create a retainer invoice for $5,000 on the 1st of each month Log project and hourly charges as separate line items on the same draft invoice Manually create a credit note if hourly time falls within retainer hours Finalize when math checks out This works, but it's manual. Xero doesn't have a "deduct retainer from hourly" toggle. For teams with 20+ mixed-billing clients, this becomes tedious. Your accountant will build a reconciliation sheet to verify that retainer offsets were applied correctly. Best for: Teams comfortable with manual invoice assembly; businesses with FreshBooks: Project-first design, hourly weak FreshBooks is built for projects and retainers, but it treats hourly billing as an afterthought. You can track time and bill hourly rates, but mixing all three in a single invoice requires workarounds. The FreshBooks approach: Create a retainer project with a fixed monthly fee Create a separate project for the $500 add-on work Time tracking feeds into hourly billing, but it's a separate invoice The problem: retainer and project merge cleanly, but hourly time doesn't offset against the retainer. If you log 12 hours in a retainer project, FreshBooks will bill all 12 hours plus the retainer—it doesn't understand that some hours were already included. You have to manually adjust or create a separate invoice line with a negative value. Best for: Agencies billing mostly project-based work with occasional hourly; not ideal for time-heavy teams. Zoho: Retainer offset works, but requires explicit configuration Zoho has the cleanest retainer logic we tested. You can set up a retainer with a specified number of included hours. When you log time against that retainer, Zoho tracks consumed hours. When you exceed the retainer, it automatically calculates overage charges. The Zoho workflow: Create a retainer: $5,000/month, 10 included hours at $150/hour Log all time against the retainer project Add project charges as separate line items Zoho generates one invoice with: $5,000 retainer + $500 project + overage hours at $150/hour This is the closest to automatic. The caveat: you have to configure the retainer correctly upfront. If you mis-set the included hours or hourly rate, the