How to Estimate Hours for a QBO Cleanup (Without Underquoting)
The hardest question in cleanup pricing is not "what should I charge per hour." It's "how many hours will this take." Get the hours wrong and even a great hourly rate or a beautifully structured fixed fee turns into a money-losing project. This piece is about how to actually arrive at the hour number, not the rate.
Most cleanup-pricing advice skips this step. You read a guide that says "fixed-fee pricing is better" and "don't underquote," but nobody walks you through how to look at a QBO file and say with confidence: this is 18 hours, not 30, not 12. That's the missing skill, and it's the one that makes fixed-fee pricing actually work.
Why hourly intuition is wrong
Three patterns ruin hour estimates:
Anchoring on the worst thing you see. You spot 200 uncategorized transactions and quote 20 hours. But the uncategorized list is the easy part. The hard parts (forced reconciliations, phantom Undeposited Funds balances, mis-tracked owner draws) hide in places you didn't look.
Underweighting communication time. A cleanup is not a solo coding task. Every category has client questions: "Are these personal or business?" "Do you have receipts for these?" "Which of these is the real bank account?" Those minutes add up to hours.
Ignoring the second-order work. You fix duplicate deposits and now reconciliations don't tie. You fix Chart of Accounts and now reports look different and the client wants an explanation. Each fix creates downstream work.
The way out is to estimate by category, with realistic time bands, and then apply multipliers that catch the second-order effects.
The category framework
LedgerClean's diagnostic groups findings into eight categories, which map cleanly to the actual time blocks of a cleanup. You can use this same structure even if you're not running the diagnostic — just walk through each category by hand on the file.
For each category below, I give a realistic time band per finding at junior, mid, and senior speeds. These are working numbers from a small sample of cleanups across different industries. Use them as a starting point and tune from your own data after you've done five or ten projects with this framework.
1. Reconciliations
What you're looking at: Bank, credit card, and loan accounts that were never reconciled, or were force-reconciled with rounding plugs.
- Per unreconciled period: 0.5 to 1.5 hours
- Force-reconciled with material plug: add 0.5 to 1.0 hour to dig up the missing transactions
- Bank feed reconnected mid-period: add 1.0 to 2.0 hours for cross-checking
The trap: a "reconciliation" of an account that's already mostly clean takes 15 minutes. A reconciliation of an account with 18 months of unmatched transactions and a $4,200 plug takes 3 hours. Look at the actual ending difference and the size of the unmatched list before you band the time.
2. Chart of Accounts
What you're looking at: Duplicate accounts, parent-child structure that doesn't make sense, accounts named like “Misc Expense 2” or “Loan from Friend.”
- Merge or rename per duplicate account: 5 to 15 minutes
- Restructure parent-child hierarchy on a non-trivial COA: 1.5 to 3.0 hours
- Migrate transaction history when collapsing accounts: add 0.5 to 1.0 hour per merge if there's meaningful volume
The trap: COA work feels fast, but every change ripples into reports and prior-period comparatives. Always add a buffer for the “why does last year look different now” client call.
3. Categorization
What you're looking at: Uncategorized transactions, miscoded transactions, transactions in the wrong period.
- Per uncategorized transaction (with rules in place): 0.5 to 1.5 minutes
- Per uncategorized transaction (no rules, ambiguous payee): 2 to 5 minutes
- Per miscoded batch (caught in review, not flagged): 5 to 15 minutes
The trap: a 200-transaction uncategorized list isn't 200 unique decisions. It's often 20 unique payees with 10 instances each. Build bank rules early, batch the rest, and the time per transaction collapses.
4. Duplicates
What you're looking at: Duplicate income, duplicate expenses, duplicate journal entries, the same transaction recorded twice through bank feeds and manual entry.
- Per duplicate identified and removed: 5 to 15 minutes
- Duplicates that affect a closed period: add 30 to 60 minutes for the documentation and client conversation
- Duplicates that affect tax-filed periods: this is usually a stop-and-call moment, not a billable cleanup task
The trap: removing duplicates can change income and expenses in periods the client thinks are settled. Always check whether anything has been filed before you delete.
5. Reconciliation discrepancies
What you're looking at: Reconciliations that “balance” with adjustments, opening-balance plugs, journal entries to Undeposited Funds, suspense accounts.
- Per discrepancy traced and corrected: 0.5 to 2.0 hours
- Suspense or clearing account with material balance: 1.0 to 4.0 hours depending on volume
- Opening-balance equity plug: assume 1.0 hour minimum even if the number is small, because the trail back to source is rarely clean
The trap: this category is the single biggest source of underquoted cleanups. Always assume the discrepancy is older and deeper than it looks.
6. A/R and A/P
What you're looking at: Old open invoices, duplicate invoices, payments not applied, vendor credits floating, A/P aging older than the business.
- Per stale invoice or bill that needs disposition: 5 to 15 minutes plus client time
- A/R cleanup with significant client outreach required: 0.25 to 0.5 hour per disputed item
- Vendor credit research: 15 to 30 minutes per
The trap: A/R aging is often a client-side problem. The bookkeeper can't close items without the client's decision on each one. Build that decision time into the estimate.
7. Sales tax and payroll
What you're looking at: Sales tax liability mismatches, payroll posting errors, ER taxes booked to wrong accounts.
- Sales tax reconciliation per filing period: 1.0 to 2.5 hours
- Payroll reclass per period: 0.5 to 1.5 hours
- Multi-jurisdiction sales tax: multiply by 1.5x to 2x
The trap: payroll work that touches a third-party provider (Gusto, ADP, QBO Payroll) is rarely a fix-the-books task — it's often a fix-the-source-system task. Quote separately or scope it out explicitly.
8. Owner-related transactions
What you're looking at: Owner draws coded as expenses, personal transactions on a business card, distributions or contributions in the wrong place, “Loan from Owner” with no real loan.
- Per personal-vs-business decision: 1 to 3 minutes plus client confirmation
- Reclassing draws/contributions across a year: 1.0 to 2.5 hours
- Building or rebuilding equity section: 1.0 to 3.0 hours
The trap: this category is small in transaction count but high in client-conversation time. The bookkeeper can't guess on personal-vs-business. Allow real time for the back-and-forth.
Multipliers that actually change the number
After you've added up the per-category bands, apply these multipliers. They're what separates a 22-hour estimate from a 35-hour reality.
File age multiplier
- 0 to 6 months behind: x 1.0
- 6 to 12 months: x 1.2
- 12 to 24 months: x 1.4
- 24+ months: x 1.6
Older work has more cross-period dependencies. A duplicate from 2024 that flows through 2024 and 2025 reconciliations costs more than a duplicate from last month.
Industry complexity multiplier
- Service business, single revenue stream: x 1.0
- E-commerce or multi-channel retail: x 1.3
- Construction, real estate, or job costing: x 1.4
- Multi-entity or intercompany: x 1.5
Industries with built-in complexity in how revenue is recognized or how expenses are tracked add hours regardless of how clean the file looks.
Communication multiplier
- Responsive client, can answer questions same-day: x 1.0
- Slow client, 2 to 3 day response time: x 1.15
- Slow client plus multiple stakeholders: x 1.25
- Client with no internal financial knowledge: x 1.3
Re-ramp time after a delayed response is real and easily eats 2 to 4 hours per project.
Tools and access multiplier
- Direct QBO access plus client cooperation: x 1.0
- Read-only access or files via email: x 1.15
- No access until you start, “we'll send what you need”: x 1.3
The cleanups where you don't have direct access until kickoff usually run over because the discovery happens after the quote.
A worked example
A prospect sends a Trial Balance, P&L, Balance Sheet, A/R aging, A/P aging, and a banking detail report. You run a diagnostic. The findings (using the eight-category lens):
- Reconciliations: 4 unreconciled months on one bank, 2 on a credit card. Estimated 9 hours.
- Chart of Accounts: 6 duplicate accounts, mediocre structure. Estimated 2 hours.
- Categorization: 220 uncategorized transactions across 35 unique payees. Estimated 4.5 hours.
- Duplicates: 12 likely duplicates flagged. Estimated 2 hours.
- Reconciliation discrepancies: $3,400 plug in OBE, two journal entries to Undeposited Funds. Estimated 3.5 hours.
- A/R and A/P: 14 stale items needing client confirmation. Estimated 3 hours.
- Sales tax / payroll: clean. 0 hours.
- Owner-related: ~30 personal items mixed in, draws coded as expense. Estimated 2.5 hours.
Subtotal: 26.5 hours.
Now multipliers. The file is 14 months behind (x 1.4). It's an e-commerce business (x 1.3). Client responds within 24 hours (x 1.0). You don't have QBO access until project start (x 1.15).
Compound multiplier: 1.4 x 1.3 x 1.0 x 1.15 = 2.09.
Adjusted estimate: 26.5 x 2.09 = ~55 hours.
If you had quoted the subtotal (26.5 hours at $85/hour = $2,253), you'd have lost money on the project. The multiplier-adjusted number (~55 hours, around $4,675 at the same rate) reflects the real work. That's the gap between a profitable cleanup and an unprofitable one.
Letting the diagnostic do the math
Estimating by hand from raw exports takes 30 to 60 minutes per prospect, and you'll forget categories under time pressure. The reason LedgerClean exists is that the same eight-category framework, applied programmatically, returns the subtotal and a recommended hour band in about a minute. You still apply your own multipliers (file age, industry, client style) because those are judgment calls, but the per-category math stops being the bottleneck.
Whichever way you arrive at the number, write it down. Save your estimate, then track actual hours on the project. After five or ten projects, compare the two columns. Your bands will tighten and your multipliers will get sharper. That's the loop that makes cleanup pricing reliable.
What to do next
If you don't have a system yet, start with the categories. Walk a prospect's file through the eight blocks above and force yourself to put a band on each one. Then apply the multipliers. The estimate will feel high. It usually is, by historical standards. It's also usually right.
If you'd rather not spend 30 to 60 minutes per prospect doing it manually, that's what I built LedgerClean for. Upload the prospect's QBO exports, the same eight-category framework runs against the file in about a minute, and you get the per-category bands and subtotal. You still layer your own file-age, industry, and access multipliers on top — those are judgment calls — but the math stops being the bottleneck. Try a free diagnostic on a sample file and compare it to what you'd estimate by hand.
Stop quoting by gut. The hour number is the whole game.
Written by the Founder
IRS Enrolled Agent and former Intuit QBO Live Lead Bookkeeper with 7+ years managing cleanup engagements. Built LedgerClean from real cleanup methodology, not theoretical best practices.
Try LedgerClean free — 14-day Solo trial, no credit card required to start.
Start Free TrialGet cleanup tips in your inbox
Practical guides for bookkeepers. No spam, unsubscribe anytime.
Subscribe on Substack