The bank feed had 400 uncategorized transactions in it on Monday and none on Tuesday, and the whole thing took me about an hour.
Then I sat with the invoice open, wondering whether an hour was really worth what I was about to type in.
Which is a ridiculous thing to wonder. It took an hour because I've spent years learning how to make it take an hour. The first time I did that job it ate an entire afternoon and I still got two of the categories wrong.
That's hourly billing on one screen. You get better, you get faster, and your invoice gets smaller. You built a skill and then billed yourself down for having it.
Ask a firm owner where their price came from and you'll usually get a shrug and a story about a job they had in 2019. You inherited a number from a firm you used to work at, or you guessed one in year one when you'd have taken anything, and then it just sat there. Three years on, the same number is carrying twice the work.
Your price is a filter before it's a number. It picks your clients, and that happens well before anybody talks about what you get paid.
Price low and you get the client the low number attracted. That client leaves on a number too, and needs the most hand-holding while they're with you.
I've seen a price increase clean up a client list faster than any marketing I ever ran. The money mattered less than the sorting did.
How much do bookkeepers charge?
Published rates run all over the place, and two firms with the same monthly number can be selling completely different things. A survey won't tell you. What moves a rate is how narrow your specialty is, how fast you answer, how much cleanup you'll take on before you say no, and who's holding the risk when a filing runs late. Move any one of those and the number moves with it. Start by writing down what your monthly bookkeeping package actually delivers and by what date. Price that. Then publish it as a range, where a prospect can read it before they book anything.
Key Takeaways
Your price picks your clients - a low one buys you a different client list, and different is the part people miss.
Hourly punishes you for getting faster - the 400-transaction cleanup that ate an afternoon in year one takes an hour now, and hourly bills you for the hour.
Publish a range - a hidden price reads as something being hidden, and a published range turns away the wrong prospects before they cost you a single meeting.
Package the outcome, scope the work - sell "books current by the 15th, clean handoff at tax time" and write down what sits outside it.
Say the scope sentence in week one - one line while everyone's happy is worth more than a hard conversation in month four.
Reprice on a date you already own - one month a year, every client, decided in advance so you're not choosing a good moment.
Publish the range
Issue one gave the range one sentence inside the system that fills a firm and moved on. It never said how you land on the number you're publishing.
My own firm, SDO CPA, has had a waitlist since June and is full. We publish our pricing on the site anyway. Tax returns show a range with the complexity drivers named right underneath it, because a fixed fee promised before anyone has read the documents is a guess. Monthly work shows a tier with the account count and the expense ceiling written into it. Either way the number is on the page before a prospect talks to anybody, and the intake form is what decides where they land.
What surprised me is how prospects talk about it. More than once someone has told us that when a firm won't show pricing, they start wondering what's being hidden. Their lawyer publishes a rate. You're the one they have to ask for it.
And at your firm, the ones who can't afford you stop. They read the range and don't fill in the form. No meeting, and no three weeks of your attention before they mention they found someone cheaper.
The objection is that publishing prices lets a competitor undercut you. They can undercut you today. They just do it quietly, after wasting your Tuesday.
What business owners see when they compare on price
Some of you reading this hire a bookkeeper rather than being one. Two minutes for you, then back to it.
A business owner cannot judge your work, not before hiring you and honestly not for a good while after. They can't tell a clean reconciliation from a sloppy one. So they judge what they can read. How fast you replied. Whether the number came with any reasoning stuck to it.
A low price with an apology attached invites a counter-offer, and now the bargaining starts with you. Say the same number flat, with what's covered and by when, and the client hears somebody who has priced this job before.
That's most of what your price communicates. Not the digits.
How much do bookkeepers charge? Four things set it
Skip the surveys. Four things move a rate, and you control all four of them.
Specialization. "Bookkeeping" competes with everyone who has ever opened a spreadsheet. Bookkeeping for restaurant groups running three or more locations competes with almost nobody.
Response speed. Answering inside a day instead of inside a week is a real difference in the product, and it gets priced like one.
Cleanup tolerance. How bad a set of books you'll agree to take on. The firm that says no to anything more than six months behind charges more for the ones it says yes to.
Deadline risk. If a late filing is your problem instead of the client's, you're carrying something heavy, and carrying it is worth money.
Write down where you sit on all four.
Price the outcome, scope the work
The pattern, in four parts.
Package what the client ends up with. Most monthly bookkeeping packages are a task list with a price stuck on the end, and a task list is something a person can price-shop. Books current by the 15th and a clean tax-time handoff with nothing left to chase is something a person can want.
Give an upfront estimate against a defined scope. Open-ended hourly is the thing you're replacing. An estimate, with what's inside it written down. Last week's issue was about saying the number on a call. This one is about what it covers.
Say the scope sentence in week one. One line, early, while everyone still likes each other. Something like: surprises get a phone call before they get an invoice. Said in week one, that's housekeeping. Said after you've quietly eaten forty hours, it's a confrontation.
Put the reprice on a calendar. Once a year, same month, every client gets looked at. Set next year's date today, while you're annoyed enough to do it. Three ways to word the scope line, and the calendar trigger itself, are in the annex.
The raise
Moving an existing client is four sentences and no apology. The date it starts. The new number. What stays exactly the same. What gets better.
Skip your rising costs and skip inflation. They don't care, and over-explaining reads as asking permission for something you've already decided.
Some clients will leave. Expect that, and run the math before it happens rather than after, because the math is usually smaller than it looks from here.
Say your two lowest-margin clients pay you fifteen hundred a month between them and eat thirty hours doing it. Lose both and you're out fifteen hundred. You also get thirty hours back. If a good-fit client pays a thousand for six hours of work, you've now got room for three of them, and the referral loop is what fills that room. That's not a prediction about your numbers. It's arithmetic you should run on your own client list before you decide a raise is too risky to try.
Do this before Friday: list every client in two columns, what they pay you monthly and roughly how many hours they take. Divide one by the other. Flag the bottom two. Write your scope-change sentence and put it where you'll see it on your next kickoff call. Then open your calendar and drop a reprice date on the same month next year.
What's your worst scope-creep story? The quick question that quietly turned into a second job. Send it to me. The engagement-letter issue is next and I'd rather build it out of yours than mine.
Operator annex
Six things below, in the order I'd build them.
The range block for your site
This is the block itself. Put it on your pricing page, or directly above your intake form, wherever a prospect lands before they can reach you. Fill in your own two numbers and cut any line that doesn't apply to how you work.
Monthly bookkeeping: $[low] to $[high] per month
Where you land in that range depends on:
- Transaction volume across all accounts
- How many bank, card, and payment accounts we connect
- Whether payroll runs through us
- How current the books are on the day we start
Every engagement starts with a written estimate against a defined scope, not an open-ended hourly rate. If something turns up outside that scope, we tell you before we do the work, and we price it then.
Cleanup of prior periods is estimated separately.Two notes on the numbers you drop in. Make the low end a number you'd genuinely be happy to take rather than a number you're using as bait, because the bait ones are exactly the clients who read the low end and assume it's them. And make the gap between low and high wide enough to be honest. Set a top you actually charge. A high end you've never once used just makes the low end look like the price.
The client margin worksheet
Build this once and it becomes the thing you open every time a pricing question comes up. One row per client, sorted lowest effective rate first.
Open a blank sheet and paste this as row 1, then split it into columns on the comma:
Client, Monthly fee, Hours per month, Effective rate, Last price change, Scope creep, ActionEffective rate is a formula, not something you type. In D2, and filled down the column:
=B2/C2Then sort the whole sheet ascending on column D. The clients at the top are the ones costing you the most to keep, and the order will probably not be the order you expected.
How to fill it honestly. Hours per month is the one people fudge, so count the interruptions: the texts, the "quick question" calls, the month you re-did their payroll journal because they hired someone without telling you. If you're guessing, guess high. Last price change is the column that stings. A date more than two years old means nobody has made a pricing decision about that client since.
The action column has three options and only three. Raise, hold, or release. "Talk to them about it sometime" is not an action, and it's how the same two accounts survive four annual reviews in a row.
The raise email
Send them all in one batch on the same day. Do them one at a time and you'll stop after the third. Subject line first:
Your monthly fee, starting [Month]Then the body:
[Name],
Starting [Month 1], your monthly fee moves from $[old] to $[new].
Nothing about how we work together changes. Same close schedule, same deadlines, same everything else.
Two things get better: [specific improvement] and [specific improvement].
This rate holds through [Month, next year]. If you'd like to talk it through, reply and I'll walk you through how I got there.
[Your name]The two improvements have to be real and they have to be specific. "Better service" is worse than saying nothing. "Your P&L lands by the 10th instead of the 15th" is a thing somebody can picture.
Three ways to say the scope sentence
Three versions of one promise, in three different voices.
If the scope changes, you'll hear from me before the work happens, and we'll agree the number then.One bit of housekeeping while we're setting this up. Books have a habit of turning up surprises, and if one shows up that isn't in what we agreed on, I'm going to stop and tell you what it would cost before I start. I'd rather do that than put a line on an invoice you weren't expecting.Nothing outside what we agreed happens on its own. It comes to you first, and you decide before I start.All three do the same job, which is to make the scope conversation happen while it's still cheap. The wording matters less than saying it before the work starts.
The trigger you set once
One repeating event a year, plus one you set the day a client signs.
The yearly one is ninety minutes, repeating, with a reminder a week ahead. Paste this as the event description:
Annual pricing review.
Open the client margin sheet. Sort by effective rate, lowest first.
Bottom 20 percent: raise or release. Decide today, not next week.
Everyone else: apply the standard increase.
All letters go out the same day. Effective date is 60 days from send.
Update the published range on the site to match.The signing-day reminder is the one that protects the work. Every time you sign a new client, set a reminder for 30 days after their start date that asks one question. Is what we're doing still what we scoped? Thirty days is early enough that a sentence fixes it. Wait, and the fix turns into a renegotiation you didn't budget time for.
If your calendar can't fire off a new client, a monthly reminder that says "check the clients who started last month" does the same job with an extra step.
Two prompts (review before you apply anything)
Neither prompt touches anything live. Your prices are yours, so every number one of these gives you gets checked against your own client list before it goes near your site.
The range block first, because it's HTML and you shouldn't have to write HTML. Give an AI assistant that can edit your site the following, filling in your own details first:
I run a bookkeeping firm. I want to add a pricing section to my site that shows a range instead of a single number, placed directly above my intake form.
My monthly range is $[low] to $[high]. The factors that move a client within that range are: [list yours].
Draft the section as HTML matching the styles already on my site. It must include: the range, a short bulleted list of what moves the price, one sentence saying every engagement starts with a written estimate against a defined scope, and one sentence saying cleanup of prior periods is estimated separately.
Do not use the word "quote". Do not offer a free consultation, a free assessment, or a free analysis of anyone's books. Do not publish or deploy anything. Show me the draft and the exact file you would change, and wait.The worksheet next. This one builds the sheet from two sections up, so you only have to paste numbers in. The same stop instruction is written into it.
I have a list of my bookkeeping clients with their monthly fee and my rough estimate of hours per month for each.
Build me a spreadsheet with these columns: Client, Monthly fee, Hours per month, Effective rate, Last price change, Scope creep flag, Action. Effective rate is a formula dividing monthly fee by hours. Sort ascending by effective rate. Add conditional formatting so the bottom 20 percent of rows are highlighted.
Give me the file as a draft I can open and check. Do not connect to any of my accounting systems, do not pull client data from anywhere, and do not send this to anyone. I'll paste my own numbers in.Before that range block goes up, put your low number next to the three worst effective rates on your worksheet. If it sits under all three, you've published the rate you already resent, and the site will keep selling it for you.


