<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Scaling Clients]]></title><description><![CDATA[The practice-growth letter for bookkeeping, accounting, tax, and CPA firms. Getting clients, pricing, capacity, and the AI systems you build yourself.]]></description><link>https://scalingclients.com</link><image><url>https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png</url><title>Scaling Clients</title><link>https://scalingclients.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 28 Sep 2026 03:47:40 GMT</lastBuildDate><atom:link href="https://scalingclients.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[YOB Holdings LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[scalingclients@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[scalingclients@substack.com]]></itunes:email><itunes:name><![CDATA[Bobby Huang]]></itunes:name></itunes:owner><itunes:author><![CDATA[Bobby Huang]]></itunes:author><googleplay:owner><![CDATA[scalingclients@substack.com]]></googleplay:owner><googleplay:email><![CDATA[scalingclients@substack.com]]></googleplay:email><googleplay:author><![CDATA[Bobby Huang]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Reasonable Compensation Studies: The Service Line Your S-Corp Clients Already Want]]></title><description><![CDATA[Every spring an S-corp owner emails the same question.]]></description><link>https://scalingclients.com/p/reasonable-compensation-study</link><guid isPermaLink="false">https://scalingclients.com/p/reasonable-compensation-study</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 23 Sep 2026 17:20:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every spring an S-corp owner emails the same question. What should I pay myself this year?</p><p>Somebody at the firm answers it. Two sentences on a call, maybe a note in the margin of the organizer. It's usually a good answer. Then the return goes out, and the answer isn't on any invoice.</p><p>That's a normal week at a firm with S-corp clients. Nothing's broken. The question just never got a price, because nobody wrote the answer up as a reasonable compensation study.</p><p>I'm a partner in a firm that hears this question too. I'm not a CPA, and I'm never the person who signs one of these. I also own the software in the house ad near the bottom of this letter, so weigh that however you want.</p><p>Here's the claim. The answer you already give away is a product. It has a buyer who asked for it. It has a deliverable, which is a written study with a named person from your firm on it. And it can carry its own price. A signed study takes more work than a two-sentence answer, and its conclusion may not match the quick one. The price has to cover that. What's missing is the packaging.</p><p>One boundary before anything else. This letter is about running a service line. It isn't tax advice or accounting advice, and it won't teach you how a study gets done. That part belongs to the person at your firm who signs it.</p><blockquote><p><strong>What is a reasonable compensation study, and why would a firm sell one?</strong></p><p>It's a written document that reaches a conclusion on what an S-corp owner who works in the business should be paid. The IRS's own guidance says an S corporation must pay a shareholder-employee reasonable compensation for their services before it makes non-wage distributions to them. The evidence behind the conclusion is attached, and a named person at the firm signs off on it. Firms sell it because the client already asks the question every year, and a signed answer they can keep is worth more to them than a quick one on a call. The package is small. One engagement letter, one document, one price, and one signer, for one owner and one tax year.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>The question already comes up</strong> - if your S-corp clients ask what to pay themselves, the quick answer probably goes out free inside tax prep.</p></li><li><p><strong>A study is a product</strong> - it has a letter, a defined deliverable, a price, and a named signer.</p></li><li><p><strong>Five steps get it live</strong> - engagement letter, defined service, payment up front, an insurance check, and a named Reviewer.</p></li><li><p><strong>The Reviewer is a firm role</strong> - one person on your side accepts responsibility for the conclusion and the document.</p></li><li><p><strong>This is about the service line</strong> - not tax advice and not a method lesson, because the method belongs to your Reviewer.</p></li><li><p><strong>Ask your carrier before you sell one</strong> - the insurance step is one question and one written answer.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Packaging, not method.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Packaging, not method.</span></a></p><h2>Step 1: The engagement letter</h2><p>A study needs its own written terms. Your tax-prep letter covers a return, and a study is a different deliverable. Give it its own letter or an addendum, and ask whoever reviews your letters which one fits.</p><p>Here's what that letter names. The deliverable, which is one written study for one owner for one tax year. What the firm is giving a conclusion on, and what it isn't. Who at the firm signs. What the client sends you, and by when. And the fee terms, including that payment comes before sign-off.</p><p>You don't have to start from a blank page. <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">The engagement-letter issue</a> walks through the skeleton and why each clause is there. Start from that base and add the study clauses on top. The annex below lists the ones a study letter carries that a bookkeeping letter doesn't.</p><p>Ours live in a separate letter per engagement type. That's our read, not legal advice, so have whoever reviews your letters look at this one too.</p><h2>Step 2: The defined service</h2><p>Write down what the client gets, in one paragraph, before you price it. If it won't fit in one paragraph, you're not ready to sell it yet.</p><p>The deliverable is a written reasonable compensation study. It's dated. It covers one owner and one tax year, with the evidence the conclusion rests on attached and your Reviewer's name on it. The client gets a document they keep.</p><p>Then write down the edges, because that's where the arguments start later. One owner per study. One year per study. Next year's study is a new engagement, not a free refresh.</p><p>Write down what it isn't, too. It isn't a promise about what any agency will accept or a guarantee of any tax result, and it doesn't stand in for the return. Clients will read a study as more than it is if nobody tells them, so those lines go in the letter as well.</p><p>Notice what's missing from that paragraph: how the number gets reached. That's on purpose. The method is your Reviewer's call, and a service definition that tries to explain it turns into a promise you didn't mean to make.</p><h2>Step 3: Collect payment for it</h2><p>Price it as its own line item. Collect before delivery.</p><p>If it hides inside the tax-prep invoice, the client never sees it, and next year it's gone. Bill it after the return ships and it turns into a conversation about whether it should've been included all along. A study sold at zero teaches the client it's worth zero.</p><p>The mechanics are plain. A fixed fee, invoiced when the letter's signed and paid before the Reviewer signs the study. When a client asks what it'll cost, give an estimate or a range and say what would move it. I'm not putting a number here. Your market and your Reviewer's hours set it, and any figure I printed would read as typical when it isn't.</p><h2>Step 4: Check your insurance</h2><p>Before the first study goes out, ask your carrier in writing whether a written compensation study sits inside your firm's current coverage. Keep the answer with your letter template.</p><p>That's the whole step. I can't tell you what your policy covers. The exact email is in the annex.</p><h2>Step 5: Name the Reviewer who signs off</h2><p>This is the step that turns a document into a service.</p><p>The Reviewer is a person at your firm. Not a software feature, and not the person writing this letter. It's whoever accepts responsibility for the conclusion and for the document it's written in. Your firm decides who's qualified to do that. Who signs matters, because the rules a signer works under depend on their license and your state. Check both before you pick a name. Signing returns doesn't settle it on its own, and this letter doesn't say who qualifies.</p><p>What the Reviewer owns is the conclusion, the evidence behind it, and the finished document. "Signs off" means their name goes on the study and they stand behind what it says. A study isn't a return, so ask whoever handles your firm's professional standards what signing one commits your Reviewer to.</p><p>Staff, a contractor, or software can put the draft together. The Reviewer still has to judge the work, and none of that help changes who owns it.</p><p>Without a named Reviewer you've got a report. With one, the client knows exactly who at your firm stood behind it. The name doesn't promise how anyone else will read the study. For the record, that person is never me.</p><p><strong>Do this before Friday.</strong> Pull up one S-corp client who asked the pay-yourself question last year. Write the one-paragraph service definition from step 2 with that client in mind, and leave their name out of it. Then send your carrier the question from step 4, so the answer's on file before anybody signs anything.</p><p>Answer by reply: who at your firm would be the Reviewer, and what's stopping you from putting their name on a study this year?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;One service line at a time.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>One service line at a time.</span></a></p><div><hr></div><p><strong>House ad.</strong> I own the company behind this product, so read this as an ad from its owner. <a href="https://traceprep.com/for-cpa-firms?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-13">TracePrep for CPA firms</a> is a Reasonable Compensation Study platform, and it's one way to produce the study this letter describes. Every figure in a study traces back to its source. Your firm's Reviewer signs off, and the software doesn't sign anything. The workpapers belong to your firm.</p><div><hr></div><h2>Operator annex</h2><p>These are the pieces you'd otherwise write from scratch. Fill in the brackets, then hand each one to the person at your firm who has to approve it.</p><h3>The service definition, as a skeleton</h3><p>Write this one first. Everything else below copies from it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Firm name] will prepare one written reasonable compensation study for [owner name] of [company name] for tax year [year]. The study states a conclusion, lists the facts and assumptions it relies on, including what the client told us, and attaches the evidence it rests on. [Reviewer name] reviews the study, accepts responsibility for the conclusion and the document, and signs it. We deliver it as [format] by [date], after the fee is paid. The study covers one owner and one tax year. A study for a later year is a new engagement. The study is not a guarantee of any tax result or of what any agency will accept, and it does not replace the tax return.</code></pre></div><h3>The engagement-letter delta</h3><p>Not a full letter. These are the clauses a study letter carries that your bookkeeping or tax-prep letter probably doesn't. The base document is in <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">the engagement-letter issue</a>.</p><ul><li><p><strong>Deliverable.</strong> One written study for one owner and one tax year, delivered as a document the client keeps.</p></li><li><p><strong>What the study concludes on.</strong> And the plain statement that it isn't a guarantee of any tax result or of what any agency will accept.</p></li><li><p><strong>The Reviewer, by name.</strong> Whoever signs the study.</p></li><li><p><strong>Client statements.</strong> The client confirms that what they send is complete and accurate, and the study says which facts came from them.</p></li><li><p><strong>Client inputs and a deadline.</strong> What the client sends, and what happens to your delivery date when it comes in late.</p></li><li><p><strong>Single-year scope.</strong> A later year is a new engagement.</p></li><li><p><strong>Fee before sign-off.</strong> The Reviewer signs after payment clears.</p></li></ul><p>That's our read, not legal advice. Have your attorney, or the partner who owns your letters, look at the wording before you use it.</p><h3>The carrier question, word for word</h3><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Subject: Coverage question about a new service

Hi [agent name],

[Firm name] is considering a new service: a written reasonable compensation study for S-corporation owner clients. Each study is a signed document for one owner and one tax year, reviewed and signed by [Reviewer name or role] at our firm.

Before we deliver one, can you confirm whether this service falls within our current coverage, and tell us whether anything would need to change? Please reply in writing.

Thanks,
[Your name]</code></pre></div><p>Don't interpret the answer yourself. File it next to the letter template and let whoever owns your insurance read it.</p><h3>Reviewer sign-off checklist</h3><p>This is an admin checklist, not the full review. Every box gets ticked before a name goes on a study, and none of them says whether the conclusion is right. That judgment is the Reviewer's. Where Circular 230 applies to your Reviewer, a signed study is written tax advice and has to meet its written-advice standard, and the odds of an audit never belong in the reasoning.</p><ul><li><p>[ ] The engagement letter for this study is signed.</p></li><li><p>[ ] The fee is paid.</p></li><li><p>[ ] The evidence is attached, and I can open and read every piece of it.</p></li><li><p>[ ] I made a reasonable effort to find the facts that matter, they're written down, and I know which ones came from the client.</p></li><li><p>[ ] Every assumption is written down, and I think each one is reasonable.</p></li><li><p>[ ] I haven't relied on anything the client told us that I have reason to doubt.</p></li><li><p>[ ] The conclusion doesn't depend on how likely an audit is.</p></li><li><p>[ ] The document names the firm, the owner, and the tax year.</p></li><li><p>[ ] I've read the conclusion, and I'm willing to put my name on it.</p></li><li><p>[ ] My name is on it.</p></li></ul><h3>One prompt for the letter clauses</h3><p>This drafts letter language. It doesn't produce a study, and it doesn't decide anything for you. Use your blank template, not a letter a client has signed, and paste it only into an AI tool your firm has approved for firm documents. If any client detail is still in it, stop and check your firm's privacy rules and any client consent you'd need first. Read every line it gives back before it goes anywhere near a client.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Below is our firm's blank engagement letter template for tax preparation. It has no client information in it.

We're adding a separate engagement for a written reasonable compensation study. Draft these clauses in the same voice and format as our letter:

1. Deliverable: one written study for one owner and one tax year, delivered as a document the client keeps.
2. What the study concludes on, and a plain statement that it is not a guarantee of any tax result or of what any agency will accept.
3. The named Reviewer at our firm who signs the study: [Reviewer name].
4. Client statements: the client confirms that what they send is complete and accurate, and the study says which facts came from the client.
5. What the client must provide and by when, and what happens to the delivery date if it arrives late.
6. Single-year scope: a later year is a new engagement.
7. Fee terms: fixed fee, invoiced at signing, paid before the Reviewer signs the study.

Do not write anything about how the study is prepared or how its conclusion is reached. Do not invent fee amounts. Label every clause DRAFT FOR ATTORNEY OR PARTNER REVIEW. Give it back to me here as plain text, and do not create or edit any file.

[Paste the blank template here]</code></pre></div><p>If you only keep one thing from this annex, keep the skeleton at the top. Every study letter you send next year starts from it.</p>]]></content:encoded></item><item><title><![CDATA[Repeat a Monthly-Review Step Reliably: Build One Small Firm Skill]]></title><description><![CDATA[You wrote a good prompt in June.]]></description><link>https://scalingclients.com/p/build-one-firm-skill</link><guid isPermaLink="false">https://scalingclients.com/p/build-one-firm-skill</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Tue, 22 Sep 2026 19:56:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You wrote a good prompt in June. Four tries to get it right, and the fourth one was: it read the trial balance, found the mess in Uncategorized Expense, and sorted it into what you could code and what you had to ask about.</p><p>Then July came round and you wrote it again from memory. Slightly different words, and the answer came back a different shape. You spent five minutes deciding whether it was as good as last month's.</p><p>That five minutes repeats every month. When you turn a prompt into a reusable skill you're not saving the prompt. You're saving the decisions you made while getting the prompt right, in a file the assistant reads back before it answers.</p><p>I'm a partner in a tax and accounting firm and I run our month-end. That's where this comes from: the same handful of judgment calls came up every month in a slightly different order, so I stopped re-deciding them and started writing them into files instead. That's process, not proof about anybody's books. Nothing from our work appears below, and every number in this article belongs to a client I made up.</p><p>That client is Cedar Hollow Landscaping LLC, invented for this article and the ones beside it: a single-member LLC on cash basis, one checking account, one credit card, about forty transactions a month. Its made-up June trial balance runs to eighteen accounts and has three problems in it. This article fixes exactly one of them, on purpose. The whole close it sits inside is in <a href="https://scalingclients.com/p/ai-assisted-bookkeeping-monthly-close">Get a reviewable monthly close: AI-assisted bookkeeping for small firms</a>.</p><blockquote><p><strong>How do you turn a prompt into a reusable skill you can run every month?</strong></p><p>Take one step you already do by hand, run it once as a plain prompt, then save the parts that worked into a file the assistant reads before it answers. A skill is a folder with a file called SKILL.md inside it: a few lines of front matter naming the skill and saying when to use it, then your instructions in ordinary sentences. Start narrow. The uncategorized-expense sweep is a good first one. On the made-up landscaping client's June books that's a $1,284.50 Uncategorized Expense balance across four transactions, sorted into what you can code now, what needs the owner, and what needs a receipt. Write three test cases with the answers already known, run them, then run it on the next month.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>The file is small</strong> - a folder, a file called SKILL.md, a name and a description at the top, and your instructions underneath in plain sentences.</p></li><li><p><strong>The decisions are the asset</strong> - which balance counts as an exception, what gets coded now versus asked about, what the answer has to look like. Those are your rules and nobody can sell them to you.</p></li><li><p><strong>Narrow beats clever</strong> - the made-up June books carry three seeded problems and this skill is built to catch one of them. A skill that volunteers opinions on the other two gets abandoned by the fourth run.</p></li><li><p><strong>The payoff lands on run two</strong> - run one is a prompt that worked. Run two, four weeks later, on a different month, with a tired person driving, is the thing you actually built.</p></li><li><p><strong>Test cases come before trust</strong> - three of them, with the answers written down first: a normal made-up month at $1,284.50 across four transactions, a made-up month with nothing uncategorized, and a made-up file from the wrong period.</p></li><li><p><strong>Budget ten minutes a month to keep one</strong> - that's re-running the three test cases and writing one change-log line. Six skills is an hour. Twelve is two hours you have to find every month, and that arithmetic is the whole build-versus-subscribe question.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Firm systems, one small one at a time.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Firm systems, one small one at a time.</span></a></p><p><em>This article describes file shapes and host behavior as of writing, including the two blocks above. Hosts change these. Where something differs from what's in front of you, the vendor's current documentation wins.</em></p><h2>What a skill file actually is</h2><p>Start with the prerequisite, because it decides whether the rest of this applies to you. A skill saved in a folder on your computer only works in a tool that reads that folder, like Claude Code or Codex running on your machine. Web chat in a browser only gets skills you upload to your account or install as a plugin. This article uses the folder version, so what you need is an agent running on your computer with access to a folder. Sorting that out is its own job, and it comes before this one.</p><p>With that in place, a skill is a folder with one file in it. The folder is named for the skill, and the file inside is called SKILL.md. That's the whole structure.</p><p>The top of that file is a short block fenced by a line of three dashes above and below it. Give it two lines, a <code>name</code> and a <code>description</code>, and you'll see files carrying more. The <code>name</code> matches the folder. The <code>description</code> is a sentence or two saying what the skill does and when to use it, and it's the one that matters most. Everything under the closing dashes is ordinary writing: headings, numbered steps, sentences.</p><p>The description is doing more work than it looks like. It's mainly what the assistant reads when it's deciding whether this is the right skill for what you just asked. A vague description means the skill sits there unused. Write it the way you'd write the label on a folder somebody else has to find in a hurry.</p><p>Where the folder goes depends on the host. On a personal setup, Claude Code looks in <code>~/.claude/skills/</code> and Codex looks in <code>~/.agents/skills/</code>, one subfolder per skill. When you want to hand a set of them to somebody else there's a packaged form for that, called a plugin.</p><p>Claude Code and Codex both document support for this shape (<a href="https://code.claude.com/docs/en/skills">Claude Code docs</a>, <a href="https://developers.openai.com/codex/skills">Codex docs</a>). That's what their documentation says. Nobody here tested it for you, and it stops short of any claim about a packaged thing running anywhere. If you're on something else, check its own docs before you copy a folder around.</p><p>Two honest things before you build it. A skill is a tool you pick up, and it runs when somebody runs it, so it fails <a href="https://scalingclients.com/p/ai-for-bookkeepers">the busy test</a> the same way a faster manual step does. What keeps working while you're busy is the decisions inside the file, because they've stopped living in your head.</p><p>And this file is a different animal from the two you may already keep. A standing rules file is written for a person to read. A header at the top of a prompt is a label you write for yourself. This one gets read by a host when you ask for the job it names, and you prove it with a test whose answer you wrote down first. That last part is what the other two don't have.</p><h2>Start from the run that already worked</h2><p>Start from the last time you got a good answer. A blank file is a much harder morning.</p><p>If you've never gotten one, run this once first, on made-up numbers, so you have something to cut down. It's four sentences and it's deliberately worse than the file you'll end up with.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Here is a list of transactions sitting in Uncategorized Expense for one month
at a small landscaping business. For each one, tell me whether I can code it
now, whether I have to ask the owner, or whether I need a receipt first.
Give me one sentence of reasoning per transaction. Don't propose journal
entries.

[paste the transactions here]</code></pre></div><p>Now read what you typed, looking for four things you decided while you were typing. You made all four. You've just never written them down.</p><p>Here's the June run on the made-up landscaping client, in one line: you pasted four transactions totaling $1,284.50 out of Uncategorized Expense and asked which ones you could code and which ones needed the owner. Buried in that request were the four decisions. The full June review, all three problems, is in <a href="https://scalingclients.com/p/month-end-review-packet">Produce a month-end review packet from your trial balance, with AI assistance</a>.</p><h2>The four decisions that turn a prompt into a reusable skill</h2><p><strong>Scope.</strong> What this looks at, and everything it leaves alone. The made-up June trial balance also has a $312.00 bank reconciliation difference from a vendor payment recorded twice, and a $950.00 owner draw coded to Repairs &amp; Maintenance. Both are real problems in the invented file. Neither is this skill's job. Write that down, because a skill that wanders is a skill you stop believing.</p><p><strong>The exception rule.</strong> What counts as needing a human. Here it's three buckets: code it now, ask the owner, need a receipt. Three is enough. The bucket names go in the file so every month's answer comes back in the same three piles.</p><p><strong>The output shape.</strong> What the answer has to look like before you can use it. Three headed lists, a date and an amount and one sentence of reasoning under each transaction, and a total per bucket that adds back to the balance you handed it. That last part is the check. If the totals come up short, something got dropped or invented, and one glance at that line tells you so.</p><p><strong>The stop condition.</strong> When it should refuse. If a transaction fits two buckets, it goes in the ask pile with a reason. If the totals come up short, it says so and stops there, with the gap named.</p><p>Those four are what <a href="https://scalingclients.com/p/bookkeeping-workflow">the month-end issue</a> called the decisions you keep re-making, moved out of your head and into a file that something else can read.</p><h2>Test it before you trust it</h2><p>Write the answers first. This is the part people skip and it's the part that makes the difference between a file you keep and a file you quietly stop opening.</p><p>Three cases, all built on the made-up client so nothing real is anywhere near it.</p><p>The normal month is the made-up June sweep: four transactions, $1,284.50, three buckets, totals that add back. Watch the lane it stays in. If it mentions the invented $312.00 reconciliation difference or the invented $950.00 in Repairs &amp; Maintenance, it failed, even though both observations are correct. You didn't ask.</p><p>The clean month is a month where nothing is uncategorized. The right answer is a sentence saying there's nothing to sort, and a stop. A skill that finds work in an empty month will find work in a real one.</p><p>The wrong file is the made-up client's May trial balance handed over while the request says June. The right answer is that the period doesn't match. This one catches the failure that costs the most, because a confident answer about the wrong month reads exactly like a confident answer about the right one.</p><p>Run all three the day you write the file, then run them again any time you change it.</p><p>Then the standing rule, which survives however well the tests go. Check every line against the transaction it came from, side by side, before you agree with it. That check is the work. Budget the same minutes for it you'd budget for reading a bank feed yourself, because that is what you are doing.</p><h2>What it costs to keep, and when to stop building</h2><p>Every time you turn a prompt into a reusable skill you're signing up for a small standing cost, so it's worth knowing the size of it before you build the second one.</p><p>Budget an afternoon for the first one, and here is where it goes: about an hour on the file itself, and the rest on settling the rules you have been re-deciding from memory. That second part is the argument you were going to have eventually anyway.</p><p>Then budget ten minutes a month. Here's what the ten minutes buys, so you can check the number for yourself: re-run the three test cases, and write one change-log line if anything moved. Things move for four reasons, and you'll recognize the first three straight away: you added an account, a client changed how they do something, or the host changed how it reads the file. The fourth one catches people out. The model can behave differently under the same words than it did last month. That's the reason the test cases earn their place.</p><p>Do the arithmetic before you build the second one. This is the decision the second half of this article exists for. Ten minutes a skill a month, times however many you keep. One is nothing. Six is an hour. Twelve is two hours a month you have to find, which is a real thing to spend if you're the person trying to <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">buy back capacity</a>.</p><p>Three things tell you you've crossed the line. You open the folder and can't remember what half of them do. Two of them disagree and you don't know which is current. Somebody asks which one to run for a client and you have to go read both.</p><p>So here's the split I'd make, and you can weigh it however you want given what I do for a living. The skills worth keeping yourself are the ones holding your firm's own decisions: your fuel-station threshold, your transfer rule, the client whose books need one extra step. Nobody can sell you those, because they're yours and you're the only one who knows when they change. The generic ones, the ones that would read identically at any firm in the country, are where somebody else keeping them current starts to look like a fair trade.</p><p>That's a decision rule. The answer it gives you depends on how many you're running and how much of your own judgment is sitting in them.</p><h2>Do this week</h2><p>Pick the smallest step in your monthly review that you re-explain every time. Save the file in the setup pack, replace the bracketed rules with two of your own, and run the three test cases on a made-up set of numbers, not a client's.</p><p>If you only have twenty minutes, do the front matter and the scope section. A file with a good name, a clear description and an honest scope is already better than typing it again next month.</p><h2>One question</h2><p>So: which line in your file did you have to argue with yourself about? One line, please, and leave the rest of the file where it is. Send it with the rule it replaced.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Written for the month after this one.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Written for the month after this one.</span></a></p><div><hr></div><h2>The setup pack</h2><p>Five files. Save the first one, then use the rest to keep it honest and to hand it over.</p><h3>The skill file</h3><p>Save this as <code>SKILL.md</code> inside a folder named <code>uncategorized-sweep</code> and the sweep is built. Every bracketed line is a rule your firm has already made and never wrote down, so put yours in before the first run.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">---
name: uncategorized-sweep
description: Sort a month's Uncategorized Expense balance into code-it-now,
  ask-the-owner, and need-a-receipt. Use when a trial balance shows a balance
  in Uncategorized Expense for a client month under review.
---

# Uncategorized expense sweep

Read the pasted transaction list, sort it, and write nothing anywhere.

## Scope

Only transactions sitting in Uncategorized Expense for the month named in the
request. Ignore every other account, every other month, and every other
problem in the file, including anything that looks miscoded somewhere else.
Say nothing about them at all.

## What you need before you start

- The client name and the month, both stated in the request.
- A list of the uncategorized transactions with date, description, amount,
  and which account paid them.

If either is missing, name the one that's missing and stop.

## Sort every transaction into exactly one bucket

1. CODE IT NOW. The description matches a rule below or a category this firm
   has clearly already settled. Name the account and quote the rule you used.
2. ASK THE OWNER. Only the client knows what it was. Write the question you
   would send them, in one sentence, in plain words.
3. NEED A RECEIPT. The category depends on a document nobody has yet.

## Rules this firm has already made

- Fuel stations under [your threshold] go to vehicle expense on the statement
  line alone.
- Transfers to [your second account] are owner draws unless the owner says
  otherwise in the same week.
- [one line per rule you catch yourself re-deciding]

## Output

Three headed lists in the order above. Under each transaction: the date, the
amount, and one sentence of reasoning. Then one line per bucket with its count
and dollar total, and a final line with all three added together, which has to
equal the Uncategorized Expense balance you were given.

## Stop conditions

- A transaction that fits two buckets goes in ASK THE OWNER, with the reason.
- If the three totals don't add up to the balance you were given, say so and
  stop. Do not adjust anything to make it tie.
- Never propose a journal entry. Never say a transaction is fine.</code></pre></div><h3>The three test cases</h3><p>Made-up numbers throughout, from the invented landscaping client. Run these the day you write the file and again every time you change it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">CASE 1  The normal month
Give it   Four made-up transactions out of Uncategorized Expense, $1,284.50
Expect    Four transactions, three buckets, totals adding to $1,284.50
Expect    No mention of the made-up $312.00 reconciliation difference
Expect    No mention of the made-up $950.00 in Repairs &amp; Maintenance
Fails if  It fixes something you didn't ask about

CASE 2  The clean month
Give it   The same invented client, a month with nothing uncategorized
Expect    One sentence saying there's nothing to sort, then a stop
Fails if  It finds work anyway

CASE 3  The wrong period
Give it   The invented client's May trial balance, with June named in the ask
Expect    It says the period doesn't match, and stops
Fails if  It sorts May and calls it June</code></pre></div><h3>The check before you post anything</h3><p>How do you know the answer in front of you is safe to act on? You work down these six. Every one of them is a thing that has gone wrong for somebody.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[ ] Every CODE IT NOW line names an account and quotes the rule it matched
[ ] Every amount matches the transaction it came from, opened side by side
[ ] The three bucket totals add back to the balance I handed it
[ ] Nothing in the answer is about something I didn't ask about
[ ] Nothing in ASK THE OWNER is a question I could have answered myself
[ ] I made every entry myself, after reading the reasoning, not before</code></pre></div><h3>The handoff note</h3><p>The point of writing the rules down is that somebody else can run the step. Paste this above the skill file when you hand it over, filled in.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Run this on [client] for [month], from the uncategorized list only.

You decide: nothing. Sort, then bring me the three lists.
Escalate to me: anything in ASK THE OWNER, anything where the totals
don't add back, anything you'd have to guess at.
Bring back: the three lists, and the line where they add to the balance.

Nothing gets entered until I've read the reasoning.</code></pre></div><h3>The change log</h3><p>Keep it at the bottom of the skill file. These three lines are made up, like everything else here. One line per change, and name the test case that caught it, because a change nothing caught is a change you can't check.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">02 Jul   Added the fuel-station rule   Kept asking about the same vendor   none, spotted by hand
19 Jul   Stop when the totals don't tie   It nudged a number to balance   Case 1
04 Aug   Named the month in the scope line   It sorted the wrong period   Case 3</code></pre></div><div><hr></div><p>The file will be shorter than you expect. Most of it is four sentences you were already saying out loud every month, finally written somewhere that something other than you can read them.</p>]]></content:encoded></item><item><title><![CDATA[Produce a Month-End Review Packet From Your Trial Balance, With AI Assistance]]></title><description><![CDATA[Somebody hands you a closed month and asks whether it's right.]]></description><link>https://scalingclients.com/p/month-end-review-packet</link><guid isPermaLink="false">https://scalingclients.com/p/month-end-review-packet</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Tue, 22 Sep 2026 19:56:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Somebody hands you a closed month and asks whether it's right.</p><p>They mean the answer, and they want it in a form they can put their name on.</p><p>So you open the accounting system and start clicking. Balance sheet, then the P&amp;L, then back again. Twenty minutes later you say it looks fine, and you're probably right.</p><p>Nothing gets left behind. Nobody can check what you looked at. Next month the same twenty minutes starts from nothing.</p><p>A month-end review packet is what you make instead. Most of it is assembly, and assembly is the part a model is actually good at.</p><p>The packet is the deliverable. The looking is not.</p><blockquote><p><strong>What is a month-end review packet?</strong></p><p>It's the file you hand a reviewer instead of your accounting system. Four inputs go in: the month's bank statement CSV, the credit card statement CSV, the trial balance export, and last month's closed balance sheet, plus the transaction detail behind any account you end up opening, pulled the same day as the trial balance. Four sections come out: what the packet covers, the exceptions with an amount and an account each, the corrections somebody has proposed and nobody has posted, and a signature line naming who reviewed it and what they read. This article works one through on a made-up landscaping client, where three exceptions worth $1,284.50, $312.00 and $950.00 turn up in three different places: one on the trial balance, one only after the bank statement is reconciled, and one in the detail behind a balance that merely looked large. Those numbers are invented for the example.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>The packet is the deliverable</strong> - a review that lives in one person's head can't be signed by a second one, and next month it starts from nothing.</p></li><li><p><strong>Four inputs, plus a fifth you pull only when a balance makes you look</strong> - bank CSV, card CSV and trial balance export for the month under review, the prior month's closed balance sheet, and the transaction detail behind any account you end up opening, pulled the same day as the trial balance.</p></li><li><p><strong>An exception list is only as wide as the files you handed it</strong> - in the made-up landscaping file the $1,284.50 in Uncategorized Expense came off the trial balance, the $312.00 gap only appeared after the bank was reconciled, and the $950.00 owner draw was hiding in the detail behind a Repairs &amp; Maintenance balance.</p></li><li><p><strong>Every exception on the list is still a question</strong> - that invented $950.00 is either money the owner took for himself or an actual repair the business paid for, and no balance on the trial balance can tell you which.</p></li><li><p><strong>Nothing in the packet is posted</strong> - proposed corrections stay proposed until somebody with the authority to post them says yes, in writing, on the packet.</p></li><li><p><strong>The model assembles and people sign</strong> - it reads what you gave it and lists what doesn't fit, and everything after that list is a judgment somebody at your firm has to make and put their name to.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The skeleton is in the article, not behind anything.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The skeleton is in the article, not behind anything.</span></a></p><h2>What goes into a month-end review packet, and the check that runs first</h2><p>Four files, and a fifth you pull only when a balance makes you look.</p><ul><li><p>The month's bank statement, exported as a CSV.</p></li><li><p>The credit card statement, same month.</p></li><li><p>The trial balance export, as of the last day of that month.</p></li><li><p>Last month's closed balance sheet, so the opening balances have something to tie back to.</p></li><li><p>The transaction detail behind any account you end up opening, pulled the same day as the trial balance, so it can't drift out from under you.</p></li></ul><p>The first four you pull before you start. The fifth you pull during, and section one has to record it, or half your findings can't be reproduced by the person who signs.</p><p>That's the list for the made-up landscaping client this article uses throughout, and for a real one too. Cedar Hollow Landscaping LLC is invented for the example: a single-member LLC on cash-basis books, one checking account, one credit card, about forty transactions in June. Small enough to hold in your head, which is exactly why the packet feels unnecessary right up until somebody asks about a month you closed four months ago.</p><p>Run one check before you read anything. For each file, write down what it is and what period it covers, and don't start until every one reads complete. What that check is, how the page is laid out, and what to do with a file you can't re-pull, belongs to a separate piece, <a href="https://scalingclients.com/p/traceable-work-packet">Catch missing inputs before review: prepare one traceable work packet</a>.</p><p>One boundary before anything real goes near a model. Everything here runs on the invented Cedar Hollow file, which has no connection to any actual engagement. That's on purpose: you learn the shape without deciding anything about a client first. What your firm may send outside itself is a separate question, and one to settle with your own counsel before a real export leaves your machine.</p><h2>Reading 18 made-up accounts for the 3 that don't fit</h2><p>The made-up trial balance is eighteen lines. You can read it in ninety seconds. Reading it is the fast part.</p><p>The slow part is that only one of the three exceptions in the invented Cedar Hollow file finishes on the trial balance at all.</p><p><strong>$1,284.50 in the made-up file's Uncategorized Expense.</strong> This one the trial balance hands you. Uncategorized is where a transaction lands when nobody decided, and a balance sitting in it at month end means decisions are outstanding. How many is a question the trial balance can't answer, because a trial balance carries balances and no transaction counts. Open the detail and in the invented file there are four of them, which makes it four questions with four possible answers: one could be a supplier nobody set up yet, one could be personal, one a duplicate, and one the annual insurance payment that belongs somewhere specific.</p><p><strong>A $312.00 gap in the invented file between the books and the bank.</strong> No line on a trial balance announces this one. It comes out of the reconciliation: take the book cash balance, take out the payments and deposits that hadn't cleared by month end, and put what's left next to the closing balance on the bank statement CSV. A clean month lands on zero. In the made-up file it doesn't, because the same vendor payment was recorded twice, so the books show money leaving that never left the account and the book balance sits $312.00 low. Read the direction once the uncleared items are off the table. Books below bank points at something recorded that didn't happen, or a deposit the bank has and the books never captured. A bank fee nobody recorded runs the other way. The duplicate inflates an expense account too, and that balance is on the trial balance, but nothing on the sheet says a balance is doubled rather than merely large.</p><p><strong>A $950.00 owner draw coded to Repairs &amp; Maintenance, in the same invented file.</strong> The trial balance can't tell you this one either. It shows a Repairs &amp; Maintenance balance and stops there. What it can do is make you look: on a made-up landscaping business running about forty transactions a month, a repairs line at that size is worth opening. The draw shows up in the detail behind it. Then two things are wrong at once. Repairs &amp; Maintenance reads $950.00 higher than the invented business actually spent on repairs, so anybody reading the P&amp;L for a trend gets a false one. And the draw account sits $950.00 light. Total equity still comes out right, which is exactly why nothing on the trial balance objects: the overstated expense and the understated draw cancel each other.</p><p>That's what bounds any exception list, including one a model builds. It works from the files you handed it. Give it a trial balance on its own and it can flag the first exception and point you at the third, and it will not name the second, because the bank statement was never in the room.</p><p>Inside its own file it has a gap that doesn't close either. If $600 of service revenue got booked to the wrong income account, and that $600 is invented for this example too, the trial balance still balances, both income accounts carry plausible balances, and no list says a word about it. Anything that was never recorded at all is invisible for the same reason.</p><h2>What the packet says, section by section</h2><p>Four sections, in the order somebody reads them.</p><p><strong>Section one, what this covers.</strong> Every file by name, with the period each one covers, the number of accounts on the trial balance, and the accounts whose detail you had to pull. Anything missing or covering the wrong period gets written here, at the top, before a reviewer has read a single balance. Write the gaps first and a reviewer knows in ten seconds which balances to trust.</p><p><strong>Section two, the exceptions.</strong> One line each: the amount, the account, what the balance appears to be, and the question it raises. Six lines for the made-up Cedar Hollow file if you split its uncategorized balance by transaction, three if you don't. A model will build the part of this it can see from the files you gave it, and this is the section you check hardest.</p><p><strong>Section three, proposed corrections, none of them posted.</strong> From account, to account, amount, the reason, and the name of the person who has to answer a question before it can move. Keeping this separate from section two is the point of the whole exercise. A suggestion and an entry are different objects, and once they share a list nobody can tell later which was which.</p><p><strong>Section four, the review.</strong> Who read it, when, which files they read, which exceptions they accepted as described, which ones they sent back, and which corrections they approved for posting.</p><p>The packet starts after <a href="https://scalingclients.com/p/bookkeeping-workflow">the close checklist and the definition of done</a> have already done their work. How the close gets there is in <a href="https://scalingclients.com/p/ai-assisted-bookkeeping-monthly-close">Get a reviewable monthly close: AI-assisted bookkeeping for small firms</a>.</p><h2>What the signature on a review packet actually says</h2><p>This is where firms get nervous, and the fix is to be narrow about it.</p><p>The signature says: I read these files, I looked at these exceptions, I accepted these, I sent these back, and I approved these corrections to be posted. That's the whole scope. It is not a statement that the books are correct, and it should not be written as one. A reviewer who signs "reviewed and correct" has promised something nobody can deliver from a trial balance and a handful of exports.</p><p>Write the narrow version into the packet itself, above the signature line, so nobody has to remember it.</p><p>A packet somebody else can sign is a job you can eventually stop doing, which is <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">the same problem as everything else that has to leave your desk before a firm grows</a>.</p><h2>Where a person still has to decide</h2><p>Four decisions in the made-up Cedar Hollow packet, plus one that stands on every packet you ever build.</p><p><strong>Which of the four invented uncategorized transactions is a business expense at all.</strong> Only the owner knows what he bought. A model looking at a vendor name and $1,284.50 in an invented file will produce a confident guess, and a guess posted to a client's books is worse than a blank.</p><p><strong>Whether the invented $312.00 duplicate gets fixed in the closed period or the open one.</strong> That depends on whether the prior period is locked, whether statements already went to the client, and what your firm does about restating a month somebody has already seen. The accounting answer is the easy half. The firm policy is the part that decides it.</p><p><strong>Whether the invented $950.00 was the owner taking money or the business paying for a repair.</strong> Two completely different entries. Same number, same account, same made-up file. The answer is in a conversation, not in the data.</p><p><strong>Who's allowed to post any of it.</strong> In a lot of small firms the answer is whoever is holding the file at the time, which is how a proposed correction becomes a posted one with nobody deciding.</p><p>Then the standing one. When every line on the exception list looks reasonable, that's the moment the packet is most dangerous, because a list that reads clean feels like a check that passed. <a href="https://scalingclients.com/p/ai-for-bookkeepers">Who catches it when the tool is wrong, and what one wrong output costs you</a> are questions your firm has to answer for itself.</p><p><strong>Do this before Friday:</strong> build the packet once on the made-up landscaping numbers in this article, where being wrong costs nothing and the answers are already written down. Then save the empty skeleton into a client folder and do a real one next month-end, by hand from your own exports, before anything goes near a model.</p><p><strong>What do you hand a reviewer today, instead of a packet?</strong> A file name and one sentence about what they do with it is enough of an answer.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Built to be argued with.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Built to be argued with.</span></a></p><div><hr></div><h2>The setup pack</h2><p>None of this is finished. The skeleton assumes things about your accounts that you'll want to change on the first client you run it on.</p><h3>The packet skeleton</h3><p>Save it as a text file and copy it per client, per month. The bracketed parts are yours.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">MONTH-END REVIEW PACKET
Client:                          Period:
Prepared by:                     Prepared on:

1. WHAT THIS COVERS
Files read, and the period each one covers:
- Bank statement export: [file name], covering [start] to [end]
- Card statement export: [file name], covering [start] to [end]
- Trial balance export: [file name], as of [date]
- Prior period closed balance sheet: [file name], as of [date]
- Transaction detail pulled for: [accounts], as of [date]
Accounts on the trial balance: [count]
Missing, or covering the wrong period:
[list here, or write NONE]

2. EXCEPTIONS
Nothing in this section is a correction.
- [amount] [account] - [what the balance shows] - [the question this raises, and who can answer it]

3. PROPOSED CORRECTIONS - NONE OF THESE ARE POSTED
- [amount] from [account] to [account] - [reason] - [who has to answer first]
No line in this section is entered anywhere until section 4 is signed.

4. REVIEW
Reviewed by:                     Date:
Files read: [section 1 list]
Exceptions accepted as described: [numbers]
Exceptions sent back for an answer: [numbers]
Corrections approved for posting: [numbers]

This signature records which files were read and which decisions were made.
It is not a statement that the books are correct.</code></pre></div><p>Section two, filled in with the three made-up Cedar Hollow exceptions:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">2. EXCEPTIONS
- $1,284.50  Uncategorized Expense  -  four transactions with no category  -  what were these four? Owner
- $312.00  Cash - Operating  -  book balance low against the reconciled bank statement  -  a vendor payment looks recorded twice. Confirm against the bank CSV. Bookkeeper, then reviewer
- $950.00  Repairs &amp; Maintenance  -  detail shows one payment to the owner  -  draw, or a repair the business paid for? Owner</code></pre></div><h3>The exception log</h3><p>One row per exception, kept in the same folder as the packet. Six columns, in this order: Exception, Amount, Where it shows, Traces to, Proposed, Posted.</p><p>Header row:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Exception&#9;Amount&#9;Where it shows&#9;Traces to&#9;Proposed&#9;Posted</code></pre></div><h3>The review checklist</h3><p>One row per client per month. After the first month you stop working out what the columns should be and start filling them in.</p><p>The columns, in the order you work them: Client, Period, Packet file, Inputs complete, Periods match, Trial balance in balance, Uncategorized at zero, Bank cleared to statement, Card cleared to statement, Opening ties to prior close, Exceptions listed, Corrections proposed, Corrections approved by, Reviewed by, Review date, Sent to client.</p><p>As a header row you can paste straight into a spreadsheet:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client&#9;Period&#9;Packet file&#9;Inputs complete&#9;Periods match&#9;Trial balance in balance&#9;Uncategorized at zero&#9;Bank cleared to statement&#9;Card cleared to statement&#9;Opening ties to prior close&#9;Exceptions listed&#9;Corrections proposed&#9;Corrections approved by&#9;Reviewed by&#9;Review date&#9;Sent to client</code></pre></div><p>Packet file is the column that makes the row worth keeping. Without it the row says a packet was reviewed and nothing says which file. Periods match is the one people leave out: a yes or no on whether the current-month files cover the same month and the balance sheet is the close immediately before it.</p><p>The skeleton and the prompt wait for you to open them. The row keeps doing something while you don't.</p><h3>One prompt</h3><p>Read the exception list before you read the balances. This is the prompt that gives you one.</p><p>Before you paste anything: the trial balance for a real client carries that client's business in it. Practice on the made-up one in this article, where being wrong costs nothing.</p><p>And a word about what comes back. The failure you're watching for reads perfectly reasonable and belongs to a transaction the model never had in front of it. It works from the one file you pasted, so everything the reconciliation would have told you is out of reach. So is anything that nets to zero: if an amount went to the wrong account and the sheet still balances, there's nothing to flag. Nothing on that list goes into a packet in the words it came back in.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'm a bookkeeper reviewing a closed month for a small business.

The sheet below is one month of ending balances and nothing else. It has no transactions in it, so anything you'd need a transaction to know, name instead of guessing.

Give me back one list. Each line: the amount, the account name, what the balance appears to be, and the question somebody would have to answer to settle it.

Flag at minimum:
- any holding or catch-all account carrying a balance
- any owner or equity account with a balance I'd have to explain
- any expense account whose balance looks large next to the rest of the sheet
- any account that should net to zero and doesn't
- any account you can't classify from its name alone

Where settling a line would need something you don't have, name what it needs.

Mark any line you'd want a person to check against a source document before it goes in a packet.

Where you're unsure, say so on the line instead of guessing.

Don't propose journal entries or tell me what to post. The list is the whole output.

[paste trial balance]</code></pre></div><p>If you paste that every month, it wants to be a file instead. Claude Code and Codex both document support for reusable instruction files. The shape is a folder with one markdown file in it called SKILL.md, carrying a few lines of metadata at the top and the instructions underneath, with a references folder beside it for anything long. Building one well, and testing it so a bad output gets caught before it reaches a packet, is its own piece of work, covered in <a href="https://scalingclients.com/p/build-one-firm-skill">Repeat a monthly-review step reliably: build one small firm skill</a>.</p><p>Somebody has to ask the owner what he bought. Until that conversation happens the balance just moves forward a month, and the packet is where you write down that it hasn't happened yet.</p>]]></content:encoded></item><item><title><![CDATA[Get a Reviewable Monthly Close: AI-Assisted Bookkeeping for Small Firms]]></title><description><![CDATA[The statements went out.]]></description><link>https://scalingclients.com/p/ai-assisted-bookkeeping-monthly-close</link><guid isPermaLink="false">https://scalingclients.com/p/ai-assisted-bookkeeping-monthly-close</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Tue, 22 Sep 2026 19:56:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The statements went out. Two days later the client writes back with one question about one number, and it's a fair question.</p><p>So you open the file. Then the bank statement. Then a vendor bill from the middle of the month, because something about it was odd.</p><p>Forty minutes later you've got the answer. Nothing was wrong. The entries were right and the month tied. What was missing is the part that lets somebody else check the work, and that's where AI-assisted bookkeeping earns its keep.</p><p>The job isn't making the books right. It's making them checkable.</p><p>A model reads the month's exports and hands back a list of what to look at. Amount, account, and where the number came from, on every line. A person decides every one of them and posts every one of them. That list, graded against a standard you wrote before the run, is what turns a finished close into a reviewable one.</p><p>Nothing in this article comes from a client file. I can't show you a page of our work, and I'm not the CPA at the firm where I'm a partner. Everything below runs on a set of books I made up, and I'll say so every time a number shows up.</p><blockquote><p><strong>What is AI-assisted bookkeeping in a monthly close?</strong></p><p>It means a model reads the month's exports and returns a list of exceptions. Four files go in: the bank statement CSV, the credit card statement CSV, the trial balance export, and the prior month's closed balance sheet, and a fifth you pull only when a balance makes you look: the transaction detail behind any account you end up opening, pulled the same day as the trial balance. One list comes out, with an amount, an account and a source on each line, graded against a review standard you wrote first. On the made-up practice books used here, an invented landscaping company with 18 accounts, that list surfaces three planted problems: $1,284.50 in Uncategorized Expense across four transactions, a $312.00 bank reconciliation difference, and a $950.00 owner draw coded to Repairs &amp; Maintenance. Every one of those numbers is invented. The model proposes. It never decides and never posts.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Reviewable means somebody else can check it without redoing it</strong> - a written standard, an exception list, and a source on every line, sitting there before anyone asks.</p></li><li><p><strong>The model's job is the list, never the ledger</strong> - it reads exports and proposes what to look at, and a person posts every entry and owns every call.</p></li><li><p><strong>Four files in, one list out</strong> - bank CSV, card CSV, trial balance export, last month's closed balance sheet, and a fifth you pull only when a balance makes you look, the transaction detail behind any account you end up opening, pulled the same day as the trial balance. A missing one gets named in writing before anything runs.</p></li><li><p><strong>Write the standard before the run</strong> - graded afterwards, a standard is just a description of whatever the model happened to say.</p></li><li><p><strong>Plant the answers in your practice month</strong> - the made-up books in this article hide $1,284.50, $312.00 and $950.00 on purpose, all three invented, so you can measure what a run missed instead of admiring what it found.</p></li><li><p><strong>Practice on made-up books, not a client's</strong> - this is firm-operations material and not accounting, tax or legal advice, and a review packet isn't an audit.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The list is the easy part.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The list is the easy part.</span></a></p><h2>What AI-assisted bookkeeping actually does at month end</h2><p>Start with what a model does well on this kind of work. It sorts routine transactions. It drafts words somebody was going to write anyway. It reads a pile of something and tells you what's in it. That list, and <a href="https://scalingclients.com/p/ai-for-bookkeepers">the four questions worth asking about any of it</a>, came out of the AI issue and none of it has changed. One ability gets added here, because the review layer runs on it: a model will compare two documents and report where they disagree.</p><p>Almost everything sold into this profession points those abilities at the ledger. Categorize, match, post. That half you can buy from somebody.</p><p>The job that runs on the same abilities and rarely gets packaged is the other one. Read four exports, compare them against a written standard, and draft the list of what doesn't match. Every other kind of professional work has a name for that output. It's a review packet, and bookkeeping is one of the few places it gets rebuilt from memory every month instead of produced.</p><p>Now the other side of that boundary, and none of it is a close call.</p><p>It doesn't post. Nothing it produces reaches a ledger without a person typing it in, and a workflow that closes that gap is a different workflow than this one.</p><p>It doesn't reconcile. It can tell you two numbers differ by $312.00 on the made-up books below and it can guess why. Whether that guess is right is a question about one specific duplicated bill, and the bill is the evidence. Ask what document proves the explanation. If the answer is the model's own sentence, you're holding a hypothesis.</p><p>It doesn't decide. Owner draw or repair is a call, and calls belong to the person whose name is on the work. Anywhere an account changes without a person choosing, something decided.</p><p>It doesn't promise. There's no accuracy number in this article, because a run that returns three of three planted problems on invented books has told you about those books and nothing about yours. Any figure that doesn't name what it was measured on is that same run wearing a percentage.</p><h2>Reviewable means a second person can check it</h2><p>A done list somebody else can tick proves the steps happened. Checking the numbers behind those ticks is a separate job, and today it means opening the file again. That second gap is the one this closes.</p><p>Closing it takes three artifacts, and most firms already have the first.</p><p><strong>A written standard.</strong> The conditions the month has to meet, in words somebody can tick. "Reconciled" fails that test, because everyone agrees with it and nobody can check it. A usable version reads: every bank and card account reconciles to a statement, and any difference is zero or explained in one sentence.</p><p>The <a href="https://scalingclients.com/p/bookkeeping-workflow">close checklist from the workflow issue</a> is where this starts, and it sits one layer below. That checklist says the close is done. The standard says what somebody reviewing the close is entitled to see.</p><p><strong>An exception list with a source on every line.</strong> Everything that failed a condition, with the amount, the account name as it actually appears in the trial balance, and the file and row where the number lives. A reviewer who has to go find the number is doing the close again, which is how review turns into a thing that gets skipped in March.</p><p><strong>A signature and a date.</strong> Initials against the standard and the day it was worked. A review nobody signed is a review nobody can prove happened, including to yourself in eight months when it matters.</p><p>A review packet is an internal work product, and its whole purpose is making a second pair of eyes cheap enough to use every month. What you're allowed to put into any tool alongside real client records is a separate question with real rules behind it, and that one goes to your own counsel rather than to an article.</p><h2>The files a review runs on, and the check that runs before anything else</h2><p>A review can only see what you hand it. Four files, and a fifth you pull only when a balance makes you look.</p><p>The bank statement CSV for the month. The credit card statement CSV for the same month. The trial balance export as of the last day of that month. And the prior month's closed balance sheet, which is the one that gets left out. The fifth is the transaction detail behind any account you end up opening, pulled the same day as the trial balance, and it arrives during the review rather than before it.</p><p>That fourth file earns its place because it's the only one that says where the month started. Without it a run can tell you the numbers are internally consistent and still miss that the opening cash never matched what you closed with last time.</p><p>Then a check that takes twenty seconds and saves you a whole review of the wrong month. Are all four here, do all four cover the same period, and does the trial balance date match the last day of the statements. A model will review a bad stack without complaint, and which way a packet fails is the subject of a separate piece, <a href="https://scalingclients.com/p/traceable-work-packet">Catch missing inputs before review: prepare one traceable work packet</a>.</p><p>Say what's missing in writing, before the review runs, not in a comment afterwards. The packet check in the setup pack below is that sentence, pre-written. Where those four files come from, what each one has to agree with, and what to do when a client can't produce one at all, all belong to that piece.</p><h2>Write the review standard before the model sees anything</h2><p>The order matters more than the wording.</p><p>Written first, a standard is a test. Written afterwards it becomes a description of whatever came back, and the condition you forgot will never announce itself, because nothing failed it. You'll read a clean list and feel good about a month that was never checked against the thing you didn't think of.</p><p>A condition is written well when somebody who wasn't in the file can tick it or fail it without asking you a question. Put each one through three tests. It names an account or a number. It has exactly one outcome. And somebody who has never seen this client can fail it with only the exports in front of them.</p><p>A small firm's close needs about ten firm-level conditions, and then each client gets a short block of its own: the account they always get wrong, the thing you've already fixed twice. Start with six and let the next two months tell you the rest.</p><p>There's a practical reason this has to be an artifact instead of a habit. We ask for everything on the 5th and we aim to have every client closed by the 20th. That window is where a review layer either fits or it doesn't. A review that depends on somebody being fresh stops happening late in the window. A list somebody ticks survives a tired afternoon, which is the entire argument for writing it down.</p><h2>A worked example on a made-up set of books</h2><p>Cedar Hollow Landscaping LLC doesn't exist. I invented it for this article, and everything below about it is invented too.</p><p>The made-up company is a single-member LLC on the cash basis with one checking account, one credit card, and about 40 transactions a month. The invented period under review is June. Its invented trial balance has 18 accounts.</p><p>Problems are planted in those made-up books on purpose, which means the answers exist before any run does. All three amounts are invented: $1,284.50 sitting in Uncategorized Expense and made of four transactions, a bank reconciliation difference of $312.00 caused by a vendor payment recorded twice, and a $950.00 owner draw coded to Repairs &amp; Maintenance.</p><p>A run over those made-up files returns something shaped like the list below, formatted the way the standard asks for it. Every figure in it is invented along with the company.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">EXCEPTIONS - Cedar Hollow Landscaping LLC (made-up practice books) - June

1  Uncategorized Expense      1,284.50   TB row 14
   4 transactions, largest 612.00 on the 14th
   Condition failed: "The uncategorized account balance is zero at period end."

2  Bank reconciliation          312.00   Bank CSV vs TB row 3
   Cleared 18,442.19, book 18,754.19
   Condition failed: "Every bank and card account reconciles to a statement."

3  Repairs &amp; Maintenance        950.00   TB row 11, Bank CSV row 22
   Single payment, description "TRANSFER TO OWNER"
   Condition failed: "Owner activity posts to owner accounts only."

4  Advertising                1,100.00   TB row 7
   Up against the prior month's closed balance sheet, under threshold
   Condition failed: none. Flagged as a variance for the preparer.</code></pre></div><p>The first three lines are the planted problems. That's what a working run looks like on those made-up books, and it isn't an accuracy claim, because the books were built to contain exactly those three things.</p><p>Now take condition 2 out of the standard. Line 1 never appears. The $1,284.50 stays where it is on the made-up books, nobody gets told about it, and what's left reads exactly as tidy and exactly as confident as the list above. That's silent omission, and there is nothing on the page to see it with. The only reason it's visible here is that the answers were planted before the standard was written.</p><p>Line 4 is the more interesting one. Nothing failed. Advertising just moved, and on an invented landscaping company in June, moving is what advertising does. The list flags it anyway, because a variance against the prior month's closed balance sheet costs almost nothing to compute and it's sometimes the only warning you get before a real problem. A reviewer reads line 4, thinks "summer," and moves on in about eight seconds. That's the correct price for that line.</p><p>Line 3 is where a run goes half wrong, and the way it goes wrong is the thing to watch for. A likely proposed fix on those made-up books is to recode the $950.00 to Owner's Equity. That's the wrong account for a draw in this invented chart, which has a Draws account sitting two rows away. The exception is real and useful, and the remedy attached to it is confident and wrong in exactly the same voice as the three lines above it.</p><p>Building the full packet, including the answer key that says what a good run should have caught, is its own job, covered in <a href="https://scalingclients.com/p/month-end-review-packet">Produce a month-end review packet from your trial balance, with AI assistance</a>.</p><h2>Where it gets things wrong</h2><p>A run fails in ways that mostly don't announce themselves. Only the first of these is loud.</p><p><strong>The confident wrong remedy.</strong> Line 3 above. A correct finding arrives carrying an incorrect fix, and both come with the same certainty. This is what costs you when somebody works the list straight down without opening the chart of accounts.</p><p><strong>Silent omission.</strong> The exception it never mentioned. Nothing on the page tells you something is missing, which is why the practice month has planted answers in it. A run that hands back two of the three problems you planted has told you something the page itself never would have.</p><p><strong>Arithmetic that reads right.</strong> Totals that look plausible and don't add. Check the ones a conclusion depends on. If a difference of $312.00 on those made-up books is the entire finding, subtract the two balances yourself. It takes four seconds and it occasionally saves a very embarrassing email.</p><p><strong>Invented account names.</strong> A model that can't find the right account will sometimes name one that sounds like it belongs in your chart. Any account cited on an exception line has to exist in the trial balance you handed over. That's a search anybody at the firm can run, and it can be somebody else's job.</p><p><strong>The plausible reconciliation.</strong> The expensive one. A walk from one number to another with reasonable steps, where a single step is made up, reading exactly like a correct walk. The defense is structural: every step names a file and a row, or the step doesn't count. A step with no address is a sentence somebody wrote.</p><p>A run is still worth having with all five of those in it. What you're handed is a starting list where every line carries its own address, and that's a good thing to open on a morning late in the close.</p><h2>Where this runs</h2><p>You can do all of this by pasting into a chat window, and for one client that's fine. It stops being fine somewhere around the fourth, because you'll type a slightly different instruction every time and the months stop being comparable to each other.</p><p>The fix is to put the instruction in a file the tool reads on its own, so the same standard runs the same way without anybody retyping it.</p><p>Two products document a way to do that. Claude Code reads its instructions from a skill file kept in a folder of its own. That file is called SKILL.md: a short header carries a <code>description</code> (and usually a <code>name</code>), and the rest is plain instructions.</p><p>Codex reads a standing-instruction file named AGENTS.md that sits alongside the work.</p><p>That's documented host support, and it's the whole reason those two get named here. Nothing of mine has been tested on your machine, your plan or your operating system, and I'd rather say so than imply otherwise. Other hosts exist, none of them are tested here, and I won't list them as though they were.</p><p>Turning your review standard into one of those files raises two questions worth their own article: how you know the file is actually being read on a given run, and what happens to the months you already closed when the standard changes. That article is <a href="https://scalingclients.com/p/build-one-firm-skill">Repeat a monthly-review step reliably: build one small firm skill</a>.</p><p>Whether any of it is worth building is <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">the capacity question</a>, and it answers itself: a close only you can check is a job that never leaves your desk.</p><h2>Do this week</h2><p>Block half an hour. Most of it is typing.</p><p>Open a blank file and write six conditions your close has to meet. Six, not ten, because you'll write the other four next month once you know which ones you missed. Then invent a client. Any name, any month, and put two problems in the books on purpose so you know what's in there. Run your six conditions over it and see whether both come back.</p><p>If you've only got ten minutes, write the six conditions and stop. The standard is the part that keeps working, and it works whether or not a model ever reads it.</p><h2>One question</h2><p>Write your six conditions first, because this only makes sense once they exist.</p><p>Then keep going past six and stop at the first condition you can't finish writing. Which one is it, and what makes it unfinishable?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;For the half of the job that happens after the books are done.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>For the half of the job that happens after the books are done.</span></a></p><div><hr></div><h2>The setup pack</h2><p>The bracketed parts are the only decisions left in what follows.</p><h3>The packet check</h3><p>This runs before anything else touches the files. The line that gets skipped is the fourth.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[ ] Bank statement CSV present, period end matches the month I'm reviewing
[ ] Credit card statement CSV present, same period
[ ] Trial balance export present, dated the last day of that same period
[ ] Prior month's CLOSED balance sheet present. Closed, not current.
[ ] All four cover the same month. If one doesn't, stop and name which one.
[ ] Anything missing is written down before the review starts, not after</code></pre></div><h3>The review standard</h3><p>One file for the firm, not one per client. Client-specific conditions go at the bottom under the client's name. Plain words, because the person ticking them is not always going to be you.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">REVIEW STANDARD - monthly close
Last updated: [date]

A month is reviewable when all of these are true and each one has a name
and a date beside it.

Conditions 1, 2, 3, 5, 6 and 10 restate what a close checklist already
covers. They are repeated here so a reviewer never has to open a second
document. Conditions 4, 7, 8 and 9 exist only because somebody other
than the preparer has to be able to check this.

1. Every bank and card account reconciles to a statement, and any
   difference is zero or explained in one sentence.
2. The uncategorized account balance is zero at period end.
3. No holding, suspense or clearing account carries a balance without a
   written explanation.
4. Owner activity posts to owner accounts only. No owner item sits in an
   expense account.
5. AR and AP agings tie to the balance sheet.
6. Payroll clears to the payroll report and posts to the period it
   belongs to.
7. Opening balances match the prior month's closed balance sheet, line
   for line.
8. Every account that moved more than [your threshold] against the prior
   month has a one-line reason.
9. Every exception raised this month is cleared, or carried forward with
   a named owner and a date.
10. The prior period is locked.

Client-specific, [client name]:
- [condition]
- [condition]

Reviewed by: ______________    Date: __________</code></pre></div><h3>The exception log</h3><p>One row per exception, kept in the same folder as the month's packet. Six columns, in this order: Exception, Amount, Where it shows, Traces to, Proposed, Posted. The Exception cell is where the condition that failed gets written out in a sentence, which is what ties the log back to the standard above. The skeleton lives in "Produce a month-end review packet from your trial balance, with AI assistance," and it is the same six columns everywhere.</p><p>Keep the logs where you can read a few months side by side. A line you write three months running has stopped being an exception and become a condition you haven't added to the standard yet.</p><h3>The prompt</h3><p>This one is useless until the standard exists. Without it there's nothing to grade anything against, and you get back a summary of a month you already had.</p><p>You already know what's in your practice month, because you put it there. The line worth staring at is the one you didn't plant. Nothing on that list is true because it's on the list, and the three you planted are the only reason you can tell the difference.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'm reviewing a month of bookkeeping for a small company. I'm going to
give you the month's files and a written standard. I want a list of
exceptions, not a finished close.

Files:
1. Bank statement CSV for the month
2. Credit card statement CSV for the same month
3. Trial balance export as of the last day of that month
4. The prior month's closed balance sheet
5. The transaction detail behind any account you end up opening, pulled
   the same day as the trial balance. Ask for it if you need it; it is
   not in the first four.

[paste or attach the files]

Standard:

[paste your review standard here]

For every condition in the standard that this month fails, give me one
numbered line with:
- the condition it failed, quoted from the standard
- the account name exactly as it appears in the trial balance
- the amount
- the file and the row where I can see the number myself
- a proposed fix, and how confident you are in it, said plainly

Then a second short list: anything that did not fail a condition but moved
enough against the prior month that a person should look at it, and why.

Rules for you:
- Don't infer anything about this company from its name or its industry.
  The files and the standard are the only facts in play. Where a
  figure is absent, write "not in the files" and carry on.
- Never name an account that doesn't appear in the trial balance.
- Show the arithmetic for any difference you report. Both numbers and the
  subtraction.
- Don't connect to anything, don't open anything, and don't write journal
  entries. I post my own entries.
- If a condition can't be tested from these files, put it under "couldn't
  test" and say which file would let you test it.</code></pre></div><h3>The reviewer checklist</h3><p>The person ticking this should not be the person who did the close. If it has to be the same person, do it in a different sitting, with the standard open and the accounting file shut.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[ ] Packet check done. All four files, same period.
[ ] Every condition in the standard has a tick or a named exception
[ ] Every exception line names a file and a row, and I opened one at random
[ ] Every account named in an exception exists in the trial balance
[ ] Any arithmetic the conclusion rests on, added again by hand
[ ] Opening balances match the prior month's closed balance sheet
[ ] Proposed fixes read against the chart of accounts, not accepted as written
[ ] Anything carried forward has an owner and a next month beside it
[ ] Signed and dated</code></pre></div><div><hr></div><p>Condition one takes about a minute to write. The other nine are that same minute, nine more times, and after that the file exists whether or not you were feeling careful the day it mattered.</p>]]></content:encoded></item><item><title><![CDATA[Catch missing inputs before review: prepare one traceable work packet]]></title><description><![CDATA[The trial balance on your screen is dated the 2nd.]]></description><link>https://scalingclients.com/p/traceable-work-packet</link><guid isPermaLink="false">https://scalingclients.com/p/traceable-work-packet</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Tue, 22 Sep 2026 19:56:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The trial balance on your screen is dated the 2nd.</p><p>It opens, it's the right client, nothing obviously wrong with it. You read it and write up what you found.</p><p>Four days later somebody asks why cash moved. It moved because the file got pulled before the last days of the month posted, and a few accounts changed after. You reviewed a month that no longer exists.</p><p>Nothing on the file warned you, and closing that gap is what a traceable work packet is for. The file carried a date, and that date was the day somebody exported it. The period it covers is a separate fact, and it's inside the file.</p><p>It starts with a distinction nobody gets taught. A missing input is loud. You go looking for it, it isn't there, you ask, you wait. Annoying and honest. An input that covers the wrong days is quiet. It arrives, it opens, it looks finished, and it fails at the end of your work, where the cost is highest.</p><p>Every close checklist ever written checks for the loud one.</p><p>There's a second gap underneath that, and it costs more. Most checklists never say what "traceable" means, so nobody can tell whether a packet is traceable or not. It has one testable definition. Every number in the review points back to a file and a line somebody else can open. If a number only points back to what you remember deciding, it isn't traceable, and the next person who asks about it is going to redo it.</p><blockquote><p><strong>What is a traceable work packet?</strong></p><p>A traceable work packet is the set of inputs a month's review needs, checked before the review starts, every number in it pointing back to a file and a line. Four inputs: the bank statement CSV, the credit card statement CSV, the trial balance export, and the prior month's closed balance sheet. Each gets a row on the packet manifest, a page recording the period it covers, the date you pulled it, the number it has to agree with, and one of three statuses: complete, missing, or wrong period. Nothing gets reviewed until all four read complete. A fifth, the transaction detail behind any account you end up opening, pulled the same day as the trial balance, arrives during the review rather than before it. In a made-up landscaping client's June books, the made-up practice case used here, that check surfaces a $312.00 bank difference before anybody starts reading.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>The fourth input is the one that gets skipped</strong> - it's the prior month's closed balance sheet, and it's the only file that proves the month started where the last one ended.</p></li><li><p><strong>Missing announces itself and wrong period doesn't</strong> - a file pulled before the month finished posting opens fine, reads fine, and moves after you're done.</p></li><li><p><strong>Read the period out of the file itself</strong> - the first and last dates inside the export are the period. The file name is whatever you typed when you saved it.</p></li><li><p><strong>Traceable has one test</strong> - every number points back to a file and a line somebody else can open, or it isn't traceable.</p></li><li><p><strong>Proposed and posted are different columns</strong> - in the made-up Cedar Hollow month, a synthetic $950.00 owner draw sitting in Repairs &amp; Maintenance stays a proposal until somebody with the authority to post it says so.</p></li><li><p><strong>The check finds inputs, not errors</strong> - it tells you the packet is complete and covers the right days. It doesn't tell you the books are right, and nothing here promises that.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The manifest page is in here.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The manifest page is in here.</span></a></p><h2>The four inputs a month's review needs</h2><p>Every month's review runs on four files. Three of them are exports and the fourth is last month's finished statement.</p><p><strong>The bank statement CSV.</strong> It's the outside record. Everything in the books that touched cash has to exist here too, and its ending balance is what the reconciliation lands on. Without it you're checking the books against themselves, which they will always pass.</p><p><strong>The credit card statement CSV.</strong> Same job, different account. The made-up Cedar Hollow set has one card, which makes it easy. On a client with four cards this is where packets quietly go short, because three arrive and one doesn't and the trial balance still adds up.</p><p><strong>The trial balance export.</strong> The whole month on one page, and the file every exception gets found in. The made-up Cedar Hollow trial balance has 18 accounts, and all three of its planted problems are visible on it once you know what you're reading for.</p><p><strong>The prior month's closed balance sheet.</strong> This is the one people skip, and it's the only file that can prove the month started where the last one ended. If last month closed with one cash balance and this month opens with a different one, something reopened behind you. You want to know that before you spend a day inside the month. On a client you've just taken on it might not exist in a form anybody trusts yet, and that's its own project. Write "missing" on the row anyway. A packet that admits the gap is worth more than one that starts by assuming the month opened clean.</p><p>Four files. That's the entire pre-review input list for a small client like the made-up Cedar Hollow one, cash basis, one checking account, one card, roughly 40 transactions a month. A bigger client has more of the first two and never more of the last two.</p><p>There is a fifth, and it is not on the manifest when this check runs. The transaction detail behind any account you end up opening, pulled the same day as the trial balance, arrives during the review rather than before it, because until somebody opens a balance nobody knows which account it is. The review packet records it in its own first section when it shows up.</p><p>This article starts the moment those four files are supposed to be in your hands. Where they come from before that is <a href="https://scalingclients.com/p/bookkeeping-workflow">the capture and triage workflow that produces them</a>, and it runs across the whole month.</p><h2>Missing is loud, wrong period is quiet</h2><p>Three checks separate the two failures. None of them needs anything you don't already have open.</p><p><strong>Read the period inside the file.</strong> Open the CSV and look at the first and the last transaction date in it. That's the period. The file name is whatever you typed. A file called <code>checking-jun.csv</code> in the made-up Cedar Hollow folder that actually starts on the 3rd is a file missing two days, and it will reconcile short, and the two days are the last place you'll think to look.</p><p><strong>Compare the pull date to your cutoff.</strong> Anything arriving on a feed can post after you've exported, so an export pulled on the 1st or the 2nd is a draft of the month. Pick one cutoff date and write it at the top of the page. The cutoff in this article is the 10th of the month after the one under review: pulled on or after the 10th, the file stands; pulled earlier, pull it again before you read a number off it. One date, used the same way on every file and every client, is what makes the check something a person or a piece of software can run identically.</p><p><strong>Tie both numbers.</strong> The first tie is last month's closing balances against this month's opening. That one catches a period somebody reopened. The second tie is the bank file's ending balance against the books' cash. That one catches a difference. In the made-up Cedar Hollow packet the second tie comes out $312.00 apart, all of it synthetic, and that difference is exactly what the review exists to explain.</p><p>The first two take under a minute each. The third takes about two.</p><h2>What a traceable work packet actually means</h2><p>Traceable means every number in the review points back to a file and a line. A file name and a row number. A folder isn't one of those, and neither is "the bank feed." Somebody who wasn't in the room opens it and sees the same thing you saw.</p><p>Take the three problems planted in the made-up Cedar Hollow month.</p><p>Uncategorized Expense holds a made-up $1,284.50 across four transactions. The untraceable write-up says "uncategorized needs cleanup." The traceable one names all four rows: <code>checking-jun.csv</code> rows 9, 17, 26 and 38, all made up, each with its amount, its payee, and a proposed account beside it.</p><p>The bank difference is $312.00, also made up, and it comes from a vendor payment recorded twice. A write-up that says only "recon off by 312" leaves the next person rebuilding the whole reconciliation to work out which made-up rows you meant. Write both book entries out, name the single payment at row 22 of that same made-up file, and add one sentence saying which of the two entries you propose to remove, and they can check it in about a minute.</p><p>The owner draw is $950.00, made up as well, sitting in Repairs &amp; Maintenance. Untraceable: "reclass owner draw." Traceable: row 31 of the made-up checking file, the account it's in now, the account you propose, and a blank column recording whether it got posted and who decided.</p><p>That last column carries more weight than it looks like it does. A packet that mixes what you proposed with what you posted can't be checked by anybody, because there's no way to tell which numbers moved and which ones are still suggestions. Two columns, and <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">a review a stranger can pick up</a> is what you're handing over. The Posted column takes four words: yes or no, the date, a name.</p><h2>The packet check, before anybody opens the books</h2><p>Here's where it sits in a month. We ask for everything on the 5th and we aim to have every client closed by the 20th. The packet check goes right after the 10th, before anybody opens a set of books, because that's the only place in the month where finding a bad input is free. The cutoff is the 10th: a file has to be pulled on or after the 10th of the month after the one under review, because the 5th is the day you ask, and feeds keep posting for days after that.</p><p>The check itself is a page. Six columns, four rows, one row per input. Each row records the period the file actually covers, the day you pulled it, the number it has to agree with, and a status. Three statuses, and only three: complete, missing, wrong period. Anything you're unsure about isn't complete.</p><p>Then the rule that makes the page worth having: nothing gets reviewed until all four rows read complete. A partial packet gets a partial review, and a partial review is one somebody does twice.</p><p>Sometimes you can't re-pull. A client sent a PDF, a portal aged the export out, whatever it is. The row still reads wrong period and the exception log gets a line saying why. The status is a fact about the file.</p><p>The first time you do this you're writing the page, so it takes a while. After that you're filling one in, and for a client the size of the made-up Cedar Hollow one that's a few minutes.</p><h2>Where this check goes next</h2><p>The check is deliberately boring, because a boring check is one a piece of software can run the same way every month without you watching it.</p><p>That makes it a good job for a skill. Same four inputs, same three statuses, same two ties, same cutoff date. You'd hand it the file names and their dates and get the manifest back with a status on every row. Until you build one, the page in the setup pack does the same job by hand.</p><p>A skill, in the hosts that document them, is a plain text file. There's a short block at the top naming it and saying when it should be used, and instructions under that in ordinary sentences. It sits in a folder the host reads. Claude Code and Codex both document packaging skills that way. That's documented host support and not a test result of ours, and none of it has been run against your setup.</p><p>Every packet shown in this article is made up, including the one the check runs on. The wider article this one sits under is the monthly close itself, <a href="https://scalingclients.com/p/ai-assisted-bookkeeping-monthly-close">Get a reviewable monthly close: AI-assisted bookkeeping for small firms</a>. The one that takes a checked packet and produces the actual review comes after it: <a href="https://scalingclients.com/p/month-end-review-packet">Produce a month-end review packet from your trial balance, with AI assistance</a>.</p><p>One boundary before you go build any of it. The four files in this article are made up and so is the client in them. Whether your own client exports can go into a tool at all is your firm's decision and your own counsel's, and it's a question about <a href="https://scalingclients.com/p/ai-for-bookkeepers">what leaves the building</a> rather than one this page can answer for you.</p><h2>Do this week</h2><p>Pick the client whose close you'd least like to hand to somebody else, and write the manifest page for that one client. Four rows, six columns, the file names from your own folder.</p><h2>One question</h2><p>How many months back do you have to go before you hit one where the trial balance came out on the 2nd?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;One page, and it goes in front of the review.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>One page, and it goes in front of the review.</span></a></p><div><hr></div><h2>The setup pack</h2><p>Copy what follows into your own files and change the names. Every sample row below is made up, and so is the client in it.</p><h3>The packet manifest</h3><p>One page per client per month. Six columns:</p><ul><li><p><strong>Input</strong> - which of the four it is</p></li><li><p><strong>File name</strong> - exactly as you saved it</p></li><li><p><strong>Period covered</strong> - the first and last date inside the file, not the month you meant</p></li><li><p><strong>Pulled on</strong> - the day you exported it</p></li><li><p><strong>Ties to</strong> - the number this file has to agree with, and what it agrees with</p></li><li><p><strong>Status</strong> - complete, missing, or wrong period</p></li></ul><p>Paste this header row into a sheet. There are tabs between the columns, so it lands in six cells.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Input&#9;File name&#9;Period covered&#9;Pulled on&#9;Ties to&#9;Status</code></pre></div><p>Here it is filled in for the made-up Cedar Hollow month, with made-up file names and dates. The cutoff in this sample is the 10th of the month after the one under review, so look at the third row. That's the point of the page.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Bank statement CSV&#9;checking-jun.csv&#9;Jun 1 to Jun 30&#9;Jul 11&#9;Ending balance vs books cash&#9;complete
Credit card CSV&#9;card-jun.csv&#9;Jun 1 to Jun 30&#9;Jul 11&#9;Ending balance vs books card liability&#9;complete
Trial balance&#9;trial-balance-jun.csv&#9;Jun 1 to Jun 30&#9;Jul 2&#9;18 accounts, opening vs May close&#9;wrong period
Prior month close&#9;balance-sheet-may-closed.pdf&#9;closes May 31&#9;Jun 22&#9;Closing balances vs June opening&#9;complete</code></pre></div><h3>The folder</h3><p>One folder per client per month, and the same six names inside it every month, so next month is a copy with the dates changed. The client name below is made up.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">cedar-hollow/
  jun/
    checking-jun.csv
    card-jun.csv
    trial-balance-jun.csv
    balance-sheet-may-closed.pdf
    manifest.txt
    exceptions.txt</code></pre></div><h3>The wrong-period check</h3><p>Three lines. Run them in order, on every file, before any row on the manifest gets a status.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">1. Open the file. Write down the first and the last date inside it.
   Those two dates are the period. Ignore the file name.
2. Compare the pull date to your cutoff, the 10th of the month after the one
   under review
   unless your firm sets a different one. Pulled on or after it, the file
   stands. Pulled before it, pull again.
3. Tie both numbers. Last month's closing balances to this month's opening,
   and the bank file's ending balance to the books' cash.</code></pre></div><h3>The exception log</h3><p>One row per exception, in the same folder as the manifest. Six columns again:</p><ul><li><p><strong>Exception</strong> - one sentence on what you found</p></li><li><p><strong>Amount</strong> - the figure exactly as it appears in the file</p></li><li><p><strong>Where it shows</strong> - the account or the reconciliation</p></li><li><p><strong>Traces to</strong> - file name and row number</p></li><li><p><strong>Proposed</strong> - what you'd do about it, in one sentence</p></li><li><p><strong>Posted</strong> - yes or no, the date, and who decided</p></li></ul><p>Same six columns wherever this log turns up. The skeleton to paste, header row and all, is in "Produce a month-end review packet from your trial balance, with AI assistance."</p><p>Filled in with the three made-up problems planted in the made-up Cedar Hollow month, columns in that order:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Four transactions never categorized&#9;1284.50&#9;Uncategorized Expense&#9;checking-jun.csv rows 9, 17, 26, 38&#9;One account proposed per row, listed on the log&#9;no
Vendor payment recorded twice&#9;312.00&#9;Bank reconciliation&#9;checking-jun.csv row 22&#9;Remove the second entry&#9;no
Owner money coded as a repair&#9;950.00&#9;Repairs &amp; Maintenance&#9;checking-jun.csv row 31&#9;Reclass to Owner Draw&#9;no</code></pre></div><h3>A prompt for the comparison part</h3><p><strong>Four file names and their dates. No transactions, nothing from inside the books.</strong></p><p>Most of the manifest is transcription. The one part that takes real attention is comparing four sets of header dates against one cutoff, and that comparison is identical every month, which is what makes it worth handing over. This does that part. Nothing else.</p><p>It will get some of them wrong, which is why each line it returns carries a file name and a date. You open that file. The file settles it, and that's the only reason the sentence above it is worth reading.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'm checking whether a month's bookkeeping inputs are complete before anybody
reviews them. Below are the file names and dates for four export files. There
are no transactions here and nothing from inside the books.

Month under review: [month]
File 1, bank statement: [name], first date inside it [date], last date inside
it [date], pulled on [date]
File 2, credit card statement: [name], first date inside it [date], last date
inside it [date], pulled on [date]
File 3, trial balance: [name], period it covers [date] to [date], pulled on
[date]
File 4, prior month close: [name], the month it closes [date], pulled on [date]

The lines above are the whole input. Where a line is absent, write
"not given" and move on.

My cutoff is the 10th of the month after the one under review. A file
pulled on or after that date stands. A file pulled before it does not.

Give me one status per file, using only these three words: complete, missing,
wrong period.

Under every file you did not mark complete, give me three things:
- the exact reason, naming the date that made you say it
- what I should do about it, in one sentence
- which of the two ties that file was supposed to answer

Then name any of the four inputs that has no line above it at all.

Finish with one line telling me to open each file you flagged and read
the dates myself before I change anything.

Don't tell me anything about the books. You haven't seen them.</code></pre></div><h3>The reviewer's start checklist</h3><p>Whoever opens the packet ticks this before reading a single number. If any line fails, the packet goes back and nothing gets reviewed.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[ ] All four inputs present, one row each on the manifest
[ ] Every Period covered read out of the file itself
[ ] Every file pulled on or after the cutoff date at the top of the page
[ ] Opening balances tie to last month's closed statement
[ ] Bank ending balance tied to the books, any difference written down
[ ] Exception log exists, one row per exception
[ ] Every exception row names a file and a line
[ ] Posted column filled on every row, even when every answer is no
[ ] Nothing sitting in Proposed has already been posted</code></pre></div><div><hr></div><p>One page per client. The person who opens it next starts reading instead of asking you.</p>]]></content:encoded></item><item><title><![CDATA[Turn On Email Quarantine in Microsoft 365]]></title><description><![CDATA[Open the Junk Email folder on any mailbox at your firm and read it for a minute.]]></description><link>https://scalingclients.com/p/microsoft-365-spam-quarantine</link><guid isPermaLink="false">https://scalingclients.com/p/microsoft-365-spam-quarantine</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Fri, 04 Sep 2026 16:47:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7824be83-a724-4c03-8397-45b85c333077_1796x1692.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Open the Junk Email folder on any mailbox at your firm and read it for a minute. Most of it is obvious. Somewhere in there will be one that isn't: a real company name in the subject line, a short note about changed bank details and a deadline. Microsoft 365 spam quarantine is the feature that keeps that message out of the mailbox entirely, and on almost every tenant it is switched off.</p><p>Microsoft put that message in Junk on purpose. The filter caught it. Junk is where the filter delivers what it catches, and Junk is a folder inside the mailbox, three rows down from a real client email, in a folder your bookkeeper opens twice a week looking for an attachment that got misfiled.</p><p>SDO CPA does tax and accounting work. I'm a partner. Our mail runs on Microsoft 365, same as most firms our size.</p><p>We were getting fifteen to twenty a day across a few accounts. It's close to nothing now. Quarantine is part of that and not all of it, because I changed a few things around the same time. The setup below took about half an hour.</p><p>Here's the part that surprises people. Microsoft is already filtering your spam. That's on. It's been on since the day you bought the licenses. What isn't on is where the filtered mail goes. By default it mostly goes to Junk, which your team can see and click. Quarantine holds it outside the mailbox, where getting it back is a deliberate act instead of a click while somebody is scanning fast. The switch that moves spam and phishing from one to the other ships turned off, and it stays off until an admin turns it on.</p><p>Most firms our size don't have an admin. They have <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">an owner who is also the admin</a>, who has never opened the page where that switch lives.</p><blockquote><p><strong>How do you turn on spam quarantine in Microsoft 365?</strong></p><p>Microsoft 365 spam quarantine is almost certainly off in your tenant right now. Go to the Microsoft Defender portal at security.microsoft.com/presetSecurityPolicies, turn on the <strong>Standard protection</strong> preset security policy, and apply it to all recipients. That one switch changes high confidence spam and phishing from "move to Junk Email folder" to "quarantine," and it assigns the quarantine policy that emails users a daily summary of what got held. High confidence phishing is already quarantined by default. Set the notification frequency to daily, tell your team what that email looks like before it starts arriving, and watch the queue at security.microsoft.com/quarantine for two weeks. Budget thirty minutes, then five minutes a week.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Microsoft's default sends phishing to Junk</strong> - in the default anti-spam policy, four of the five spam verdicts (spam, high confidence spam, phishing, and bulk) are set to "move message to Junk Email folder." High confidence phishing is the one bucket already quarantined out of the box.</p></li><li><p><strong>Junk sits inside the mailbox and quarantine sits outside it</strong> - anything in Junk is one click from being opened, forwarded, or marked "not junk" by a staff member who's moving fast.</p></li><li><p><strong>The Standard preset is one switch, and it's off</strong> - turning it on quarantines high confidence spam and phishing, and drops the bulk mail threshold from 7 to 6.</p></li><li><p><strong>Quarantine with no notification is what makes firms give up</strong> - that's my read on it, anyway. Microsoft ships three quarantine policies that look almost identical on screen, and only one of them tells your team anything. The default anti-spam policy uses one of the silent ones.</p></li><li><p><strong>Held mail expires and is gone</strong> - 15 days under the default anti-spam policy, 30 days under the Standard and Strict presets. After that Microsoft deletes it permanently and nobody can get it back.</p></li><li><p><strong>This is one control, not a security program</strong> - tax and accounting firms are financial institutions under the GLBA Safeguards Rule, and IRS Publication 5708 says the law requires a written plan. Quarantine is a line item in that plan. None of this is legal advice.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The admin stuff nobody teaches either.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The admin stuff nobody teaches either.</span></a></p><p><em>Settings, defaults and portal paths verified against Microsoft Learn on 4 September 2026. Microsoft moves these pages. If a link 404s, search the setting name from inside the Defender portal.</em></p><h2>What Microsoft actually does with your spam right now</h2><p>Every Microsoft 365 tenant has a default anti-spam policy. You didn't create it and you can't delete it. It applies to everyone who doesn't match a more specific policy, and it has been running since your first mailbox.</p><p>That policy sorts suspicious mail into five buckets and does something with each one. Here's what it does before anyone touches it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Spam                       Move to Junk Email folder
High confidence spam       Move to Junk Email folder
Phishing                   Move to Junk Email folder
High confidence phishing   Quarantine
Bulk mail (BCL 7 or above) Move to Junk Email folder</code></pre></div><p>Read that list again with a staff member in mind. Four of five verdicts, including the one literally labeled phishing, get delivered into the mailbox. The message about changed bank details is sitting in a folder somebody scans twice a week at speed.</p><p>Four things are already on, and they're worth knowing about before you change anything:</p><ul><li><p><strong>Zero-hour auto purge</strong> pulls malware out of mailboxes after delivery when Microsoft's verdict changes.</p></li><li><p><strong>Spoof intelligence</strong> catches senders forging your domain.</p></li><li><p><strong>DMARC enforcement</strong> honors what a sending domain publishes when a message is detected as spoof. If they publish <code>p=quarantine</code>, Microsoft quarantines it. If they publish <code>p=reject</code>, Microsoft rejects it outright.</p></li><li><p><strong>Malware attachments</strong> go to quarantine under an admin-only policy, so users never see them at all.</p></li></ul><p>So the machine is running. It just delivers most of its verdicts to a folder that's still in the building.</p><h2>Why the Junk folder is the wrong place for a firm</h2><p>Three things go wrong with Junk, and they go wrong harder at an accounting firm than at a landscaping company.</p><p><strong>Staff dig through it.</strong> They have to. Client documents end up there. Portal notifications end up there. So people scan Junk on purpose, at speed, looking for a false positive, which is the exact mental state where a good phishing message wins.</p><p><strong>Safe senders are a private decision.</strong> Every mailbox keeps its own Safe Senders list, and the person who owns the mailbox maintains it in Outlook without telling anybody. A sender on that list gets delivered to the inbox. You can read those lists as an admin, but only through PowerShell, and nothing surfaces a change to you when it happens.</p><p><strong>Shared mailboxes make it worse.</strong> Your info@ or billing@ address gets the highest volume of anything you own, and it's the mailbox nobody personally owns, so nobody personally maintains it.</p><p>And there's a fourth reason, specific to this profession. Under the Gramm-Leach-Bliley Act and the FTC's Safeguards Rule, tax and accounting practices count as financial institutions no matter how small they are. IRS Publication 5708 (Rev. 8-2024) puts it plainly: "Not only is a WISP essential for your business and a good business practice, the law requires you to have one."</p><p>I'm not a lawyer and this isn't legal advice, and turning on quarantine doesn't make you compliant with anything. But if you're going to write down the controls your firm actually runs, "spam and phishing are held outside the mailbox and reviewed daily" is a better line to write than "we tell everyone to be careful."</p><h2>The Microsoft 365 spam quarantine setup, step by step</h2><p>Thirty minutes. You need Security Administrator, or Organization Management in Exchange. Global Administrator also works, and if you set up Microsoft 365 originally that's probably what you're signed in as. Microsoft recommends against using it for routine work, so if you have a second admin account with a narrower role, use that one.</p><h3>Before you touch anything</h3><p><strong>Check what you're licensed for.</strong> Go to <code>https://admin.microsoft.com/Adminportal/Home#/subscriptions</code> and look at your plan name. The anti-spam and quarantine features in this guide come with every Microsoft 365 subscription that has mailboxes, including Business Basic and Business Standard. Business Premium and E3 add Defender for Office 365 Plan 1, which brings Safe Links, Safe Attachments and impersonation protection. If you're on Business Premium you're already paying for the Defender features, so you may as well turn them on in the same sitting.</p><p><strong>Fix your email authentication first.</strong> Microsoft says this explicitly, and it's the step people skip. If your own domain's SPF, DKIM and DMARC records are missing or wrong, tightening the filter will start catching your own legitimate mail, and you'll blame the filter. Sort authentication out before you change policy.</p><p><strong>Decide who watches the queue.</strong> One named person, checking daily for the first two weeks. If that person is you, put it in your calendar now.</p><h3>Step 1: Turn on the Standard preset</h3><p>Go to <code>https://security.microsoft.com/presetSecurityPolicies</code>. If that link redirects, the page lives under <strong>Email &amp; collaboration &gt; Policies &amp; rules &gt; Threat policies &gt; Preset security policies</strong>, in the Templated policies section.</p><p>You'll see three sections: Standard protection, Strict protection, and Built-in protection. Standard and Strict will almost certainly show as off. Built-in protection is on, and it covers only Safe Links and Safe Attachments for firms with a Defender license. It doesn't touch spam actions at all, which is why your spam is still going to Junk.</p><p>Slide <strong>Standard protection</strong> to On, then select <strong>Manage protection settings</strong>. The wizard walks you through:</p><ol><li><p><strong>Apply Exchange Online Protection.</strong> Choose <strong>All recipients</strong>. This page governs the anti-spam and anti-phishing settings, so it's the one that matters most. Scoping it to a test group and forgetting about it is how half a firm ends up unprotected.</p></li><li><p><strong>Apply Defender for Office 365 protection.</strong> This page only appears if you have Business Premium, E3, E5 or a Defender add-on. Choose All recipients here too.</p></li><li><p><strong>Impersonation protection.</strong> Defender licenses only. Add your firm's own domain, and add the names and email addresses of your partners and anyone who can approve a payment. This is the setting aimed at a message that looks like it's from you, addressed to your bookkeeper.</p></li><li><p><strong>Review and confirm.</strong> Turning it on for the first time is what creates the underlying policies. There's no other supported way to make them.</p></li></ol><p>That's the switch. Here's exactly what it changed:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">                           Before (default)             After (Standard)
Spam                       Move to Junk                 Move to Junk
High confidence spam       Move to Junk                 Quarantine
Phishing                   Move to Junk                 Quarantine
High confidence phishing   Quarantine                   Quarantine
Bulk mail                  Move to Junk (threshold 7)   Move to Junk (threshold 6)
First contact safety tip   Off                          On</code></pre></div><p>Two things worth noticing. Ordinary spam still goes to Junk under Standard, on purpose: it's the noisiest bucket and the one most likely to hold a newsletter somebody wanted.</p><p>And the first contact safety tip turns on. That puts a banner on the first message from any new sender, reading "You don't often get email from" followed by the actual sending address. Your staff will notice that one immediately, and it does more day-to-day work than most of the settings underneath it.</p><h3>Step 2: Confirm the notification is actually on</h3><p>This is the step that decides whether the whole thing survives.</p><p>Microsoft has several quarantine policies and they look almost identical. The difference is whether the user gets told:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">AdminOnlyAccessPolicy                    User sees nothing, admin only
DefaultFullAccessPolicy                  User can view and release, NO notification
DefaultFullAccessWithNotificationPolicy  User can view and release, notification ON</code></pre></div><p>The default anti-spam policy assigns <code>DefaultFullAccessPolicy</code> to everything, with notifications off. Change the actions by hand instead of using the preset and you build a black hole: mail disappearing with nobody told. My read is that this is the version most firms try, and it's why quarantine gets switched off again a month later.</p><p>The Standard preset assigns <code>DefaultFullAccessWithNotificationPolicy</code> to high confidence spam and phishing, which is the reason using the preset beats hand-configuring. Check it at <code>https://security.microsoft.com/quarantinePolicies</code>.</p><p>Two exceptions to tell your team about. Nobody can release a high confidence phishing message themselves, no matter what the policy says; they can only request the release, which comes to you. Malware is stricter again. It's held under <code>AdminOnlyAccessPolicy</code>, so users never see those messages and have no request option at all.</p><h3>Step 3: Set the notification schedule</h3><p>On the quarantine policies page, open the <strong>Quarantine notification settings</strong> flyout. You can set the notification to arrive every four hours, daily, or weekly.</p><p>Pick <strong>daily</strong>. Four hours is enough interruptions that people start ignoring it. Weekly is long enough that a real client email sits unread for six days.</p><p>While you're on that screen, use <strong>Specify sender address</strong> to set the sender to a real person at your firm. The default is <code>quarantine@messaging.microsoft.com</code>, which looks exactly like the kind of thing your staff have been trained to distrust. <strong>Use my company logo</strong> puts your branding at the top, which sounds cosmetic and isn't: this is a daily email with links in it, and people need to recognize it on sight. The logo has to be uploaded to your Microsoft 365 theme first. One trap on this screen: pick the language before you type anything into the sender display name, subject or disclaimer boxes, because selecting a language afterwards wipes what you typed.</p><h3>Step 4: Turn off Outlook's own junk filter</h3><p>Outlook has a separate junk filter that runs on the desktop, and it fights with the server. Microsoft's own recommendation is to set it to <strong>No automatic filtering</strong>, in Outlook under Home &gt; Junk &gt; Junk E-Mail Options &gt; Options.</p><p>That doesn't disable anything you want. Safe Senders and Blocked Senders lists keep working. It just stops the desktop from making a second, different guess about mail the server already ruled on.</p><h3>Step 5: Tell your team before it goes live</h3><p>Do this the day before. The message they'll get from Microsoft is unfamiliar, it's about email, and it has links in it, which is the exact profile of a message you've spent years telling them not to click. Warn them or half of them will report the notification as phishing. There's a script for this in the setup pack below.</p><h3>Step 6: Watch the queue for two weeks</h3><p>Go to <code>https://security.microsoft.com/quarantine</code> daily for the first two weeks. You're looking for one thing: legitimate mail that got held. The same page is under <strong>Email &amp; collaboration &gt; Review &gt; Quarantine</strong> if the direct link doesn't land.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M6zV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M6zV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 424w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 848w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M6zV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7824be83-a724-4c03-8397-45b85c333077_1796x1692.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Quarantine page in the Microsoft Defender portal, showing held messages with their verdict and release status. Sender addresses blurred.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Quarantine page in the Microsoft Defender portal, showing held messages with their verdict and release status. Sender addresses blurred." title="The Quarantine page in the Microsoft Defender portal, showing held messages with their verdict and release status. Sender addresses blurred." srcset="https://substackcdn.com/image/fetch/$s_!M6zV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 424w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 848w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 1272w, https://substackcdn.com/image/fetch/$s_!M6zV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7824be83-a724-4c03-8397-45b85c333077_1796x1692.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The queue on my own tenant. Sender addresses are blurred; everything else is as it comes. Note the two filter chips at the top: this view is showing the last 30 days and hiding senders already blocked, so it is not the full count of what got stopped. The columns that matter are the verdict (Phish, Spam, High Confidence Phish) and Release status.</figcaption></figure></div><p>Common catches at a firm:</p><ul><li><p>Bank and lender notification emails, which are bulk-sent and often poorly authenticated</p></li><li><p>Payroll and portal notifications from smaller providers</p></li><li><p>A client whose own domain has a broken SPF record</p></li><li><p>Industry newsletters that cross the bulk threshold</p></li></ul><p>Release what's legitimate. For a sender that keeps coming back, you want a real tenant-level allow, and this is the part that trips people up. The <strong>Allow sender</strong> button on a quarantined message adds that sender to the Safe Senders list of whoever is signed in, which is the same private per-mailbox list from earlier and not a firm-wide fix.</p><p>The tenant-level path runs through submissions. Go to <code>https://security.microsoft.com/reportsubmission?viewid=email</code>, submit the message as <strong>I've confirmed it's clean</strong>, and select <strong>Allow this message</strong>. That writes an allow entry for the sender into the Tenant Allow/Block List at <code>https://security.microsoft.com/tenantAllowBlockList</code>, where you can also add entries directly on the Domains &amp; addresses tab. Those entries hold for 45 days after Microsoft's own filtering decides the sender is clean, or you can set them to expire up to 30 days out.</p><p>Keep that list short. Microsoft's warning is worth repeating: every unnecessary allow entry exposes you to mail the system would otherwise have filtered.</p><p>After two weeks you'll be down to a few minutes a week, and after a month you'll mostly forget it's there. <a href="https://scalingclients.com/p/bookkeeping-workflow">The month-end issue</a> made the same move on a close: the parts that keep running are the parts nobody has to open.</p><h2>Standard or Strict: which preset to turn on</h2><p>Strict quarantines everything, including ordinary spam and bulk mail, and drops the bulk threshold to 5.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">                           Standard        Strict
Spam                       Junk            Quarantine
High confidence spam       Quarantine      Quarantine
Phishing                   Quarantine      Quarantine
High confidence phishing   Quarantine      Quarantine
Bulk mail                  Junk            Quarantine
Bulk threshold             6               5
Notification on            Some verdicts   All verdicts</code></pre></div><p>Start with Standard. Run it for two clean weeks. If the queue is quiet and nobody's complaining, move to Strict.</p><p>I'd expect a firm that goes straight to Strict with no quarantine history to spend day three releasing a pile of held mail and day five switching the whole thing off. Standard gets you most of the benefit with far fewer false positives.</p><p>One thing to know before you pick: retention differs. Under the default anti-spam policy, held mail lives 15 days and you can set that anywhere from 1 to 30. Under Standard or Strict it's 30 days and you can't change it. Thirty days is better. When mail expires from quarantine, Microsoft deletes it permanently, and there is no recovery.</p><h2>What breaks, and what to do about it</h2><p><strong>A client's email gets held.</strong> Release it from the quarantine page. If it happens twice, take the submissions route above so the allow is firm-wide.</p><p><strong>Someone says they never got the notification.</strong> Check that they're in scope. Scope the preset to specific recipients instead of All recipients and anybody outside that list is still living under the old default policy.</p><p><strong>A staff member wants a high confidence phishing message released.</strong> They'll get a request option and you'll get the request. Look at it before you approve. That's Microsoft's highest-confidence bucket, and it's the one verdict users can never release on their own.</p><p><strong>Your own outbound mail starts landing in clients' junk folders.</strong> Unrelated to any of this, and it means your SPF, DKIM or DMARC records need work. Go fix authentication.</p><p><strong>You want to know how far off you were before.</strong> Run the configuration analyzer at <code>https://security.microsoft.com/configurationAnalyzer</code>. It lists every setting that doesn't match Standard, which is also the fastest way to find the custom policy somebody set up years ago that nobody remembers.</p><h2>Do this week</h2><p>Block thirty minutes. Open <code>https://security.microsoft.com/presetSecurityPolicies</code>, turn on Standard protection, apply it to all recipients, set the notification to daily, and send your team the message in the setup pack the day before it goes live.</p><p>If you only have ten minutes, do just the first part. The preset carries a working notification policy with it, so even the partial version still tells people what it held.</p><h2>One question</h2><p>Sometime in the first week, one thing is going to show up in that queue that you didn't expect. Something you'd have sworn was fine.</p><p>Which one was it? I'm building the list of what this catches that it shouldn't, because that list is my best guess at why firms turn quarantine back off, and there's no vendor page anywhere that will tell you what's on it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The setting nobody turned on, weekly.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The setting nobody turned on, weekly.</span></a></p><div><hr></div><h2>The setup pack</h2><p>Everything below is meant to be copied and used.</p><h3>The rollout checklist</h3><p>Work top to bottom. Nothing later depends on anything you skipped.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[ ] Confirm my role: Security Administrator or Organization Management
[ ] Check plan at admin.microsoft.com &gt; Your products
[ ] Verify SPF, DKIM and DMARC on every domain we send from
[ ] Name the person who checks quarantine daily for 2 weeks
[ ] Send the team message (below), day before go-live
[ ] security.microsoft.com/presetSecurityPolicies &gt; Standard protection &gt; On
[ ] Manage protection settings &gt; Exchange Online Protection &gt; All recipients
[ ] Defender page (if licensed) &gt; All recipients
[ ] Impersonation protection: add our domain, partners, anyone who approves payments
[ ] Review and confirm
[ ] security.microsoft.com/quarantinePolicies &gt; Quarantine notification settings
[ ] Pick the language FIRST, then fill the text boxes
[ ] Notification frequency: Daily
[ ] Specify sender address: a real person here, not the Microsoft default
[ ] Use my company logo (upload to the Microsoft 365 theme first)
[ ] Outlook on every desktop: Junk &gt; Junk E-Mail Options &gt; Options &gt; No automatic filtering
[ ] Calendar: check quarantine daily, 14 days
[ ] Calendar: 5 minutes weekly, ongoing
[ ] Day 14: run security.microsoft.com/configurationAnalyzer, confirm clean
[ ] Day 14: decide Standard or move to Strict</code></pre></div><h3>The message you send the team</h3><p>Send it the day before. Subject line and body follow, and the placeholders in brackets are yours to fill.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Subject: New daily email from Microsoft starting tomorrow (this one is real)

Starting tomorrow you'll get an email once a day listing messages that got
held before they reached your inbox. It comes from [name and address you set
as the notification sender] and it will have our logo on it.

It's real. I turned it on.

Here's what changed. Until now, anything Microsoft thought was spam or
phishing went into your Junk folder, where you could still see it and open
it. It doesn't go there anymore. It gets held outside your mailbox, and the
daily email is how you find out what's in there.

If something legitimate got held, you can release it yourself from that
email. If it's a message flagged as a serious phishing attempt, you'll see
a request option instead. Send it to me and I'll look.

Two things I need from you:

1. Skim the daily list. It takes about thirty seconds.
2. If a client's email gets held, tell me the same day. I can allow that
   sender for the whole firm so it stops happening.

Held mail is deleted after 30 days and can't be recovered, so don't leave
something sitting in there.

Questions to me, not to Microsoft.

[your name]</code></pre></div><h3>The two-week watch routine</h3><p>Same five minutes each morning until day fourteen. Log it as you go, one line per item.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Date: 12 Mar
Held overnight: 31
Legitimate, released: 2
  - lender notification, [bank], released + submitted for a firm-wide allow
  - client portal alert, [client], released, watching to see if it recurs
Phishing worth naming: 1
  - request to change bank details, real company name in the subject
Actions taken: 1 allow submitted, nothing else
Team complaints: 0</code></pre></div><p>After fourteen days, look at the "legitimate, released" lines together. Fewer than three a week means you're in good shape and can consider Strict. More than ten a week and your email authentication is probably the real problem.</p><h3>The weekly five minutes, forever</h3><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Open security.microsoft.com/quarantine
Sort by date, scan subject lines only
Release anything obviously legitimate
Note any sender held twice or more, submit it for a firm-wide allow</code></pre></div><h3>A prompt for the part that's tedious</h3><p>Reading a policy screen and working out which values don't match Microsoft's recommendations is slow, and it's the kind of comparison a model does well. It fails <a href="https://scalingclients.com/p/ai-for-bookkeepers">the busy test</a>. You open this one on purpose, once, when you need it. The quarantine policy is the part that keeps working while you're busy.</p><p><strong>Somebody set this policy up in 2022 and nobody has opened it since.</strong></p><p>You are the one who opens the portal afterwards. This hands you a list and stops there, and every line on that list is a change you make with your own hands after you've read why.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a small accounting firm and I administer our own Microsoft 365. Below
is text I copied from an anti-spam policy screen in the Microsoft Defender
portal.

Work only from the text in the block. If a setting isn't in there, say
"not shown on this screen" rather than assuming what it is.

[paste the policy screen text here]

Give me three lists.

1. Settings where this policy is weaker than Microsoft's Standard
   preset recommendation. For each one: the setting name, what it's set
   to here, what Standard uses, and one plain sentence on what that
   difference means for mail arriving at a firm that handles client tax
   documents.

2. Settings where this policy is stricter than Standard. Same format.
   I want to know these because stricter is not automatically better and
   some of them will be why legitimate client mail is getting held.

3. Anything in the text that looks like it was set by hand for a reason
   I'd want to remember before changing it.

Rank list 1 by what would reduce phishing reaching a mailbox the most.

Don't make the changes for me and don't give me PowerShell. I'm going to
do this in the portal so I can see what I'm agreeing to.</code></pre></div><div><hr></div><p>Half an hour, and most of it is finding the page. It's at security.microsoft.com/presetSecurityPolicies, and it has been sitting there since you bought the licenses.</p>]]></content:encoded></item><item><title><![CDATA[The Owner's Guide to AI That Actually Helps]]></title><description><![CDATA[Every AI number aimed at this profession is a measurement somebody chose. Four questions that turn one back into something you can check, run on my own two products at the end.]]></description><link>https://scalingclients.com/p/ai-for-bookkeepers</link><guid isPermaLink="false">https://scalingclients.com/p/ai-for-bookkeepers</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 02:42:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The software I build carried two accuracy numbers. Both measured, both true.</p><p>One came off a first import, before the thing had seen anything of a firm's books. The other came off books it had been running on for a while, once it had learned how that client's transactions behave. The second was higher. Of course it was. It had practice behind it.</p><p>I took the second one down. There's one number on the page now, and it's the day-one figure.</p><p>While both were up, anybody reading the higher one was reading a number taken under the best conditions I had. I chose which conditions they saw. Nobody lied anywhere in that.</p><p>Every AI number aimed at this profession is a measurement somebody chose.</p><p>Everybody with a product in this market publishes a number that way, me included. There is no version of publishing one that skips the choosing. So the useful move is a short set of questions that makes a chosen number answerable.</p><blockquote><p><strong>What does AI for bookkeepers actually do today?</strong></p><p>Inside a firm right now the three I'd pay for are these. It sorts routine transactions into categories. It drafts text somebody was going to write anyway. And it reads a pile of something and tells you what's in it. Everything past that is a claim, and every claim carries a number taken under conditions the seller set. This is for the owner deciding what to keep paying for, not for somebody shopping. Four questions turn a claim back into something checkable: what it was measured on and against what, who catches it when it's wrong, what one wrong output costs, and what you keep when you stop paying. Two filters sit on top: whether it keeps working on a week you're busy, and what your firm has agreed can be sent outside it.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Every accuracy number was measured on something</strong> - and the something is usually not books that look like your clients' books.</p></li><li><p><strong>Two of the four questions have no vendor answer</strong> - who catches an error and what it costs you are both settled inside your own firm.</p></li><li><p><strong>A tool you operate is not a system that runs</strong> - most of what gets sold as automation is a faster manual step, which is worth money and adds no capacity.</p></li><li><p><strong>What leaves your firm is your firm's call</strong> - one named person decides it in writing, and a vendor's terms page is not that decision.</p></li><li><p><strong>Copy from a coded list instead of the client file</strong> - the names come off without anybody having to remember, which leaves a shorter list of things you still have to decide about.</p></li><li><p><strong>This issue names no tools on purpose</strong> - I sell software into this profession, and a list from me would be shaped by that in ways you couldn't see from the outside.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Questions here, not lists.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Questions here, not lists.</span></a></p><h2>The four questions to ask about AI for bookkeepers</h2><p>Run these on anything sold to your firm, mine included. Two go to the vendor. Two you answer about your own firm, and those decide whether the vendor's answers matter at all.</p><p><strong>What it was measured on, and against what.</strong> An accuracy claim is a fraction and the bottom of it is a pile of data somebody picked. Ask what was in that pile: whose books, how many, over how long, how messy at the start. Then ask what the number beat. Faster than what, run by whom, held to what standard, measured by which side. A percentage with no denominator and no baseline can't be checked by anybody, including the person who published it.</p><p><strong>Who catches it when it's wrong.</strong> No vendor can answer this and you shouldn't ask them to. It's a question about your own workflow. When a categorization comes back wrong, where does it get caught, by whom, and how many days does it sit in the books first.</p><p><strong>What one wrong output costs you.</strong> A tool that's right most of the time is cheap when the miss surfaces at review and expensive when it surfaces on a filed return. So price the miss. A wrong category on a small expense costs a correcting entry and the few minutes it takes to make it. A wrong number inside something a client forwards to their bank costs you the client. Same accuracy rate, two completely different products. Nobody was ever taught to ask this. Ask it anyway. Pricing your own hour the same way, so the correcting entry has a real number on it, is <a href="https://scalingclients.com/p/busy-but-not-profitable">the issue on the hours nobody invoices</a>.</p><p><strong>What you keep when you stop paying.</strong> Somebody will ask you for this work years from now, and the vendor is not the person who'll be asked. So find out what you hold: is the finished output a file in your own systems, or a page you can see for as long as you're a customer. Ask in writing, and ask before you renew.</p><p>A tool that can't answer the first and the fourth in writing inside two weeks isn't a tool you've evaluated. That doesn't make it bad. It makes it something you renew on faith, and you should at least know which ones those are.</p><h2>The busy test</h2><p>A tool you operate is not a system that runs.</p><p>Most of what gets sold to firms as automation is a faster manual step. That's genuinely worth money. It just doesn't add capacity, because it stops when the person stops. The part that never moves at all is the diagnosis conversation, which is <a href="https://scalingclients.com/p/how-to-sell-accounting-services">the sales issue</a>.</p><p>The test takes a week. Pick one where you don't open the thing. If work was waiting when you came back, and you didn't start it, it runs. If nothing happened, it's a tool, competing for your hands with everything else you do with them.</p><p><a href="https://scalingclients.com/p/bookkeeping-workflow">The issue on month-end</a> drew that line down the middle of a close. The capture address keeps collecting documents with nobody minding it. The weekly pass only happens because a person sits down.</p><h2>What leaves the building</h2><p>The prompts in this letter have carried the same warning from the start: take the names out first. That warning only ever covered the names.</p><p>Amounts attached to a person. Account numbers, EINs, socials. The client's own documents, which carry all of it at once plus a few things you forgot were in there. And the gap between pasting a paragraph and uploading a file, which are two decisions with two different sizes of mistake behind them.</p><p>Then the thing nobody has a habit for yet: what a tool starts doing after an update. Taking names out doesn't settle that. Somebody has to decide it, and when nobody does, it gets decided by whoever is closest to a deadline.</p><p>Use a <strong>synthetic practice roster</strong> when you want to test a prompt: made-up businesses, made-up facts, no connection to a real engagement. It lets you see the shape of an answer without treating a coded list as permission to disclose or use real information. Removing names alone does not establish that a disclosure or use is permitted.</p><p><a href="https://scalingclients.com/p/bookkeeping-niches">The issue on picking a lane</a> uses a synthetic practice roster for its example. Same useful test, without the real-world input.</p><p>You don't need the annex for the first step. Write down the thing that never gets pasted anywhere, today, in whatever file your firm already reads.</p><h2>Why this issue names no tools</h2><p>Because I sell two pieces of software into this profession. Whatever I put on a list would be shaped by that, and you'd have no way to see where.</p><p>There's a harder version of the same problem, and you'd find it eventually, so here it is. The four questions above aren't neutral either. I picked them, and my own products happen to answer them reasonably well. Somebody with different products would hand you a different four, picked the same way, and it would read just as sensibly to you.</p><p>So add your own. Take the tool you'd least like to lose and find the question it would fail. That's the question missing from this list, and adding it is what makes the list yours.</p><p><a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">The first issue, on getting clients without cold outreach</a> made the case that an owner can build most of this stuff now without hiring anybody to do it. Still true. Building it yourself just doesn't spare you the buying decisions, and those have a salesman on the other side of them.</p><p><strong>Do this before Friday:</strong> run the first and fourth questions at the AI tools your firm pays for, starting from the last invoice you can find. Then add the ones with no invoice, meaning anything anybody in the firm opened this month. The second and third you answer yourself, and they take longer.</p><p>Twelve of these now, which is also a chosen number, published by somebody who sells software into this profession. Run the four questions on the letter while you're at it. What it was measured on is one owner's firm. What you keep when you stop paying is all of it, because you were never paying.</p><p>What did you buy that stopped getting used, and what actually killed it? Reply with that. The product name doesn't help me. What made you stop opening it does, and it's worth more to me than any vendor page I could go read.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;I publish the conditions with the number.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>I publish the conditions with the number.</span></a></p><div><hr></div><h2>Operator annex</h2><p>Send the email first. The rest of this is built around the reply.</p><h3>The email you send before the renewal</h3><p>Two of the four questions have a vendor answer, and the first one splits in half when you ask it, because a vendor answers the denominator and the baseline separately. Add the data question from <em>What leaves the building</em>, since you may as well get it all in one reply, and that's four things to send.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Subject: A few questions before we renew

Hi [name],

We're going through the tools we use at the firm and I have a few questions about [product]. Short answers are fine. I'd like them in writing.

1. The accuracy figure on your site: what was it measured on? How many businesses, what kind of books, over what period, and how clean to start with?

2. What was it compared to? If it beats something, tell me what, and who was running it.

3. If we cancel, what do we keep? Are the finished outputs files we hold in our own systems, or access that ends with the subscription? If the second, for how long after?

4. Where does our clients' data go when we use the product, and who else can read it? A pointer to the terms is fine.

Thanks,
[you]</code></pre></div><p>Send it and leave it alone. When the reply lands it goes wherever that tool's contract lives. The sent mail and the reply are the record, so there's nothing else to keep.</p><p>A tool still carrying two blanks two weeks after you asked is an unevaluated tool. Unevaluated tools go on the renewal list, not on the roster.</p><p>If you want them where you'll see them without opening your sent folder, it's a few lines per tool in a text file. Filled in, so an answer sits next to a non-answer:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Tool]
Measured on: their own sample, size not stated, condition not stated
Compared to: nothing stated
On cancellation we keep: exports of finished output, 30 days of access after
Client data goes to: their processor plus one subprocessor, both named in their terms
Asked: 3 Mar    Answered: 11 Mar</code></pre></div><p>The blanks are the finding. A sample with no size and no baseline next to it isn't an answer.</p><h3>The busy test, written down</h3><p>Take the week first. Then read this against what you found:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">It runs if:

- Something it produced was waiting for you when you came back, and you didn't start it
- It fires on something happening outside your firm: a document arrives, a feed updates, a date passes
- When it finishes, the next thing happens without anybody carrying the output over
- It kept producing during the week when nobody in the firm touched it, not just when you personally didn't</code></pre></div><p>Four yeses and it runs. Staff around it like capacity. Two or three and it's a partial system: find where a person is still carrying something across, because that handoff is capping it. One or zero and it's a tool. Price it like one. The hour it saves is an hour you'd have spent at the desk anyway, and on a week you're out it saves nothing.</p><h3>What never leaves, written down</h3><p>One page. It lives wherever your firm actually reads things, not in a policy binder.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Firm] - what we don't paste

Client names, business names, and anything else that identifies a person go into the coded list first. Prompt inputs get copied out of the coded list, never out of the client file.

Never pasted or uploaded outside the firm, coded or not:
- Social security numbers, EINs, bank and card numbers
- A client's own documents, in any format
- Anything out of a client's payroll records
- Logins for anything

Pasting text and uploading a file are different decisions. A file brings everything in it, including whatever you forgot was in it. An upload needs a second person to agree first. Solo, the second person is tomorrow: an upload waits overnight, and if it still looks necessary in the morning it goes.

If a tool we already use turns on a feature that sends our data somewhere new, we stop using that feature until [name] has looked at it. Noticing is part of everybody's job, not [name]'s.

Decided by: [name]. Anybody can ask. Nobody else decides.
Last read: [date]</code></pre></div><p>And the file the first line of that page depends on:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client codes - stays in [location], never leaves the firm

A = [client]
B = [client]
C = [client]
D = [client]

A new client gets the next code the day the engagement letter is signed.
A departed client keeps their code forever. Codes are never reused.
Past Z, go to AA, AB, AC.
This file never gets pasted into anything. It is the one file that stays home.</code></pre></div><h3>What goes at the top of every prompt file</h3><p>Prompt files go out of date and keep running anyway. One written against last spring's tool still returns something that looks right. A few lines at the top of each file, so the folder listing is the index:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Produces:
Reads:
Its input is copied from:
Never touches:
Last checked:</code></pre></div><p>Here it is with all five filled:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Produces: a first-pass categorization review note for one client month
Reads: a de-identified transaction export, one month
Its input is copied from: the coded list
Never touches: anything with an account number in it, and any payroll file
Last checked: 14 Feb</code></pre></div><p>"Its input is copied from" is the line doing the work. If the answer is anything other than the coded list, then something other than that page is choosing your inputs and nobody signed off on it. "Never touches" is yours to write. Don't let anything else write it.</p><h3>Two prompts</h3><p>These two only read. Nothing either of them touches changes. What both can do is sound certain about something they half-know, and the prompt that reads your prompt files is looking at a map of everything your firm sends outside. Read what comes back the way you'd read a junior's first draft: assume the confident parts are the ones to check.</p><p><strong>Instead of reading the sales page for the third time.</strong> The email above goes to every vendor. This finds what one specific page left out, and hands you the extra sentences to add to it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a bookkeeping firm and I'm evaluating a piece of software. Below is
the text of the vendor's own page, pasted by me.

Everything you need is in the block below. Don't go anywhere else for it,
and don't fill a gap with what you already know about this company. Where
the text doesn't say, write "not stated on this page."

[paste the page text]

Answer these one at a time:

1. What accuracy, speed, or time-saving figures does the page state, and
   what does it say each one was measured on: whose data, how much, over
   what period, in what condition?
2. What is each figure compared against? Name the baseline the page states.
   Where there is none, say so plainly.
3. What does the page say about who reviews the output before it's used?
4. What does it say happens to finished work after a customer cancels?

Then, for every "not stated on this page," write the exact sentence I should
email the vendor to get it. One each, plain, no preamble.

Do not tell me whether to buy it.</code></pre></div><p><strong>Instead of opening every prompt file to remember what's in it.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Below are prompts I use at my bookkeeping firm. Before pasting them I
replaced every client and business name with a letter, including the names
inside the example rows, because a saved prompt usually has a real one baked
into its example. Don't ask me for the real ones.

[paste the prompts]

For each prompt, tell me:

- What it produces, in one line.
- Every input it asks for, and whether each could carry a client's identity,
  amounts tied to a person, or a document.
- Whether its output goes anywhere other than back to me.
- Anything in the prompt text itself that would be a problem if read by
  somebody outside my firm.

Report what each one touches and stop. Do not write a "never touches" line
for any of them, and do not tell me which inputs are acceptable. That call
is mine, and it's the whole point of the exercise.

Give it back to me here as plain text. Don't create or edit any file.</code></pre></div><div><hr></div><p><strong>House ad. Both of these are mine, and the four questions get run on them below.</strong></p><p>Growthy is bookkeeping software. It connects to QuickBooks Online, or you import bank statements, or upload a CSV. It categorizes the routine transactions and you review and approve the rest. About 85 percent accurate on a first import, measured before it has learned anything about a particular set of books. <a href="https://growthy.com/signup/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-12">See what Growthy does</a>.</p><p>TracePrep is the second product, built by a separate company, TracePrep Inc. It's a Reasonable Compensation Study platform for CPA and EA firms. Every figure in a Study traces back to the record it came from, your firm's own Reviewer signs off before a Study goes out, and the calculation underneath is deterministic and inspectable, which is a different kind of thing from what this issue has been about. It's in design-partner validation, not general release. <a href="https://traceprep.com/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-12">See how TracePrep builds a Study</a>.</p><p>Now the four questions, aimed at my own two, since these are questions about buying software and not about one category of it. Growthy's number comes with the conditions it was measured under, which is part of the first question and not all of it, because I haven't put a baseline next to it here. On the second it can only tell you where its own boundary sits, not who catches the miss: a person reviews and approves, so the catching is yours, and that's why it doesn't clear the back half of the busy test. On the fourth, the honest answer today is that the export isn't built yet. You can reactivate an account before it's deleted, and how long we hold it before that is undecided, which is exactly the sort of answer you should make any vendor put in writing.</p><p>TracePrep's answer to the fourth is most of why it exists: your firm owns the finalized evidence and workpapers permanently, and finalized Studies remain downloadable in TracePrep for exactly three years after cancellation. Neither of them answers the second or the third for you, because who catches a miss and what it costs are facts about your firm and not about a product.</p><div><hr></div><p>Nothing here runs on its own. The email gets sent, the week gets taken, the header lines get written once, the page gets read again in the spring. A synthetic practice roster is a test case, not a permission slip. In six months, you'll know whether the rules you wrote still match the tools you use.</p>]]></content:encoded></item><item><title><![CDATA[Capacity Before Headcount]]></title><description><![CDATA[Hiring into a broken delivery system buys you a more expensive problem]]></description><link>https://scalingclients.com/p/how-to-grow-an-accounting-firm</link><guid isPermaLink="false">https://scalingclients.com/p/how-to-grow-an-accounting-firm</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 02:42:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The job post has been open in a tab since Tuesday.</p><p>You started it at ten at night, right after a client emailed to ask what a transfer from March was for. You knew. You were also the only person alive who knew, and answering took eleven minutes you didn't have, and it was the second time that week something ordinary came to you because there was nowhere else for it to go. So you're hiring.</p><p>The instinct is aimed at the wrong thing. The week that feels full is four different kinds of hours, and a new person takes one of the four off you.</p><blockquote><p><strong>How to grow an accounting firm when you're already full?</strong></p><p>You count the week before you write the job post. The hours that feel like they need a person sort into four piles. Work only you can do. Work that shouldn't exist at all. Work anybody could do once the rule for it is written down. Work that belongs to the client and got absorbed. A hire takes the third pile off you. The other three move by writing something down, deleting a step, or handing a job back where it came from. So count for a month, total the third pile, and hold it next to the hours you'd be paying for. If the third pile doesn't fill the job you're about to post, the person who takes it spends month one asking you questions nobody ever wrote answers to.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>A full week is four kinds of hours</strong> - work only you can do, work that shouldn't exist, work anybody could do from a written rule, and work that's the client's.</p></li><li><p><strong>A hire takes one of the four off you</strong> - the written-down kind, and only the part that's already written.</p></li><li><p><strong>Unwritten work isn't handoverable yet</strong> - the rule for it lives in your head, which is where a new person has to go to get it.</p></li><li><p><strong>A new person costs you answering time before they return any</strong> - count last month's questions and the minutes each one took you, because that's what their first month looks like from your side.</p></li><li><p><strong>The trigger is a count</strong> - transferable hours in a week, held next to the hours you'd pay for, with no percentage anywhere in it.</p></li><li><p><strong>It has to read the same twice</strong> - one month can be a single bad close, and a rule that fires on one reading fires on noise.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;The four-pile sheet is in here.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>The four-pile sheet is in here.</span></a></p><h2>The four kinds of full</h2><p>Take last week and put every hour in one of four piles. Sort by who the hour belongs to, rather than by what kind of work it is.</p><p>Start with the pile you'll get wrong, because everything turns on it. It's the recurring work a competent person could do on a Tuesday from a document, without asking you anything, and it's the only pile a hire takes off you. The trouble is that almost everything feels like it belongs there while you're doing it, because you're carrying the rule around in your head and can't see it from in there. The test is whether the rule exists on paper. If it doesn't, the task isn't ready to hand to anyone, however obvious it feels at your desk. Software claims a slice of that same pile, and <a href="https://scalingclients.com/p/ai-for-bookkeepers">the four questions in the AI issue</a> are how you check the claim before you buy instead of hire.</p><p>Then the pile that's yours and nobody else's. The judgment calls. The conversation where a client is embarrassed about something and needs a person. Anything that has to be signed by somebody qualified to sign it. Smaller than it feels, and it never gets to zero.</p><p>A third pile belongs to nobody at all. Hours that exist because something upstream is broken: re-deriving a decision you already made in April, chasing a document for the fourth month running, reopening a file you'd finished twice, clearing the same phishing mail out of the inbox every morning because nobody ever <a href="https://scalingclients.com/p/microsoft-365-spam-quarantine">switched the filter from Junk to quarantine</a>. <a href="https://scalingclients.com/p/bookkeeping-workflow">The rebuild at the front of every month</a> is the first place I'd look for it. What that pile wants is a route and a written decision, and a second person just does the rebuild alongside you.</p><p>And the last one is the client's. The statements you assemble because they never send them. The receipt you rebuild from a bank line. The four follow-ups. Somebody absorbed that job and it wasn't the client. Putting a price on those absorbed hours instead of just counting them is <a href="https://scalingclients.com/p/busy-but-not-profitable">the issue on being full and still broke</a>.</p><p>Count all four and the transferable pile comes in smaller than it felt. That's the number the rest of this runs on.</p><h2>What a hire costs before it gives anything back</h2><p>Open last month's sent folder and count the questions you personally answered that only you could answer. Multiply by [10] minutes each, which is a floor rather than an average. That's what somebody's first month costs you, except it arrives as every question, all day, with no written answers waiting.</p><p>That isn't a knock on whoever you'd hire. When a job has never been written down, the only copy is in your head, so the new person's real first job is extracting it one question at a time from the one person in the building with no spare minutes.</p><p>It's easy to read that first month as a bad hire. What's missing is a document. We hire this way at my firm. The first question is what the person could actually carry, and what we'd do with the hours it hands back.</p><h2>How to grow an accounting firm without adding a person</h2><p>Almost every article on growing an accounting firm opens with getting more clients. Your problem is thirty days of small unrecorded decisions arriving at the front of the month, and a job post doesn't touch one of them.</p><p>Intake is the other side of it. <a href="https://scalingclients.com/p/when-to-turn-down-a-client">A written floor</a> stops work you shouldn't have taken from becoming work you have to staff. Everything here sits behind that gate, on the delivery side.</p><p>The waitlist at SDO CPA has been open since June. I'm a partner in that firm. Room comes off that list when a client relationship ends, never from adding a person. Which work you want in the seat that opens is <a href="https://scalingclients.com/p/bookkeeping-niches">a lane decision</a>.</p><h2>The rule that decides it</h2><p>Two numbers, both of them yours.</p><p>Your transferable hours in a normal week: the pile a competent person could take from a document, counted, with every unwritten task thrown out of it.</p><p>The hours you'd buy: not a full-time job as an idea, but the offer you'd really make, at the hours you'd pay for. Twenty a week, or fifteen, or whatever your number is. At times a hire has taken twenty to thirty hours a week off me, and what makes that worth the money is what went into those hours, which for me was finding the next client.</p><p>The rule fires when your transferable hours cover the hours you'd buy, and it has to do that twice, on counts taken a month apart. One month can be a single bad close, a quarter end, or one client who blew up in March. If your work has a heavy season, keep counting past two and hold the extra counts on the sheet, because a February count says nothing about July.</p><p>There's no percentage in that and there shouldn't be. Nobody hires a fraction of a person, and a ratio is good at making one bad month look like a trend.</p><h2>What to fix before you hire</h2><p>The pile that transfers is the pile that's written down, so most of the pre-hire work is writing. Four of the seven lines on the gate in the annex are documents that don't exist yet: standing rules for your two hardest clients, a definition of done for whatever you deliver every month, a one-page description of the job in tasks, and the list of decisions that still have to come back to you. The other three are checks: that the work has held still for a few months, that the transferable pile was counted rather than estimated, and that you start this person on your best-documented client instead of your worst.</p><p>Every unticked line costs the same thing. It becomes a question, the question comes to you, you answer it slightly differently than last time, and now two versions of the rule exist and neither is on paper.</p><p>The gate covers none of the employment side. Classification, wage and hour, offer letters, probation, termination. Those go to an employment lawyer in your state, and this letter has nothing useful to say about them.</p><p><strong>Do this before Friday:</strong> count last week into the four piles, on your two hardest clients only, in whatever you already keep lists in. Total the transferable pile, turn it into hours, and write the number down with the date beside it. It decides nothing until you have a second one a month from now. The annex has the sheet, the gate and the trigger sentence, but the count is the part that can't be skipped.</p><p>If you've made a hire already, which was it: work that was written down before they arrived, or work you spent a month describing one question at a time?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;If you're about to post a job, subscribe first.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>If you're about to post a job, subscribe first.</span></a></p><p><strong>House ad. My own product, so weigh it accordingly.</strong></p><p>Growthy is bookkeeping software I build. Point it at QuickBooks Online, or import bank statements or a CSV. It sorts the routine transactions and tells you which ones it isn't sure about, and those are the ones you approve. On a first import it's right about 85 percent of the time, so you check the rest. What it can't do is fill in the inventory below, because it has never watched how you spend a Tuesday. <a href="https://growthy.com/signup/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-11">Try Growthy</a></p><div><hr></div><h2>Operator annex</h2><p>Your email client is already open, which is why the hire file works and a planning session doesn't.</p><h3>The hire file</h3><p>It's an email address, and it's the same trick issue eight used for client receipts, running the opposite direction. That one collects the client's paperwork. This one collects your own irritation.</p><p>Set up an address that lands somewhere you'll look later. Then one rule: the moment something makes you think <em>somebody else should be doing this</em>, forward the thing itself. The email, the task, the message that started it. Don't write it up and don't explain it. The forward is the entry.</p><p>Save this where you keep short notes:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Address: hire@[yourfirm].com

When something makes you think "somebody else should be doing this",
forward that exact item to the address. No subject rewrite, no explanation.

Read the folder in one pass, subject lines only, whenever you take an
inventory count. Anything that shows up three times is a job.</code></pre></div><p>Put that note on your phone rather than in a folder on your desktop, because the annoyance almost never happens at your desk.</p><p>Reading it on the same sitting as a count does a second job: the folder tells you what the sheet missed.</p><h3>The inventory</h3><p>One row per recurring task, not one row per client. A task you do for eleven clients is a single row with a count, unless it's genuinely eleven different tasks.</p><p>The columns, and what goes in each:</p><ul><li><p>Task - what you do, in plain words</p></li><li><p>Client or All - a name, or All</p></li><li><p>Times per month - a number, not "weekly"</p></li><li><p>Minutes each - an honest guess is fine on the first pass</p></li><li><p>Total minutes - times per month multiplied by minutes each</p></li><li><p>Who could do this today - a name, or nobody</p></li><li><p>What's missing - what a person would need in front of them; blank if nothing</p></li><li><p>Pile - 1, 2, 3 or 4</p></li></ul><p>Header row, tab separated, ready to paste into the first row of a sheet:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Task&#9;Client or All&#9;Times per month&#9;Minutes each&#9;Total minutes&#9;Who could do this today&#9;What's missing&#9;Pile</code></pre></div><p>Pile is the column the roll-up reads, so the rule for filling it goes next to the sheet:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Pile 1, only me: needs judgment, a licence, or the relationship.
Pile 2, nobody's: it only exists because something upstream is broken.
Pile 3, anybody's: a competent person could do it from a written document.
Pile 4, the client's: it's their job and I absorbed it.

No written rule anywhere, no Pile 3. It sits in Pile 1 until the day
you write the rule, and the What's missing column says what to write.</code></pre></div><p>Fill it for a week rather than a month on the first pass, on your two hardest clients only.</p><p>Then the roll-up. Four totals and one division, at the bottom of the sheet:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Pile 1 total minutes: ______
Pile 2 total minutes: ______
Pile 3 total minutes: ______
Pile 4 total minutes: ______

Weeks counted: ______

Transferable hours per week = Pile 3 total minutes / weeks counted / 60</code></pre></div><p>Don't turn that into a share of anything, and don't hold it against your total hours. It gets compared to one number, and that's the offer you'd make.</p><h3>The pre-hire gate</h3><p>Seven lines. The first two are built in issue eight's annex, if you don't have them yet.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Tick only what's true today. Every untrue line is the next thing to write.

[ ] Standing rules exist in writing for the two clients whose work is hardest
    Skipped: every rule gets re-answered by you, differently each time.

[ ] A written definition of done exists for what you deliver every month
    Skipped: nobody but you can tell whether a month is finished.

[ ] The job you'd hand over is described on one page, in tasks, not adjectives
    Skipped: you hire a personality and meet the tasks one at a time afterwards.

[ ] The decisions that still have to come back to you are listed by name
    Skipped: everything comes back to you, including what shouldn't.

[ ] The work you'd hand over has run the same way for three months
    Skipped: you're teaching a moving target, and the teaching never ends.

[ ] Pile 3 has been counted, not estimated, within the last two months
    Skipped: you're buying hours you never proved you had.

[ ] The client this person starts on is the one whose rules are best written
    Skipped: month one gets spent on your least documented account.

Not a checklist item, and not covered anywhere in this issue: classification,
employee versus contractor, wage and hour, offer letters, probation, and
termination. Those decide what this person legally is, they vary by state, and
they go to an employment lawyer before the job post goes anywhere.</code></pre></div><p>Untick the whole thing and run it again the day before you post.</p><h3>The trigger you sign</h3><p>Fill in your numbers, sign it, and keep it in the same place as the half-written job post:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'm not posting the job until the transferable pile reaches [20] hours
in a normal week.

Count taken: ______________     Hours: ______
Count taken: ______________     Hours: ______
Count taken: ______________     Hours: ______   (seasonal work only)

The last two counts above the line, and at least [four] weeks between
them. Then I hire.

Either count below the line, and I go back to the gate and write
whatever's missing.

________________________        ______________
signature                        date</code></pre></div><p>Write the date of the second count on your calendar the day you take the first one.</p><h3>The prompt</h3><p>The gate's one-page job description is the line worth handing to a model. It's the one owners rewrite and rewrite and still end up with a paragraph of adjectives about a person who doesn't exist yet.</p><p>Two things before you paste. Your inventory has a client column, so open a copy and swap every business name for a letter before any of it leaves your machine. And whatever comes back, rewrite the verbs in your own words: it has never met your clients and it has never watched you work.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I own a small bookkeeping firm and I'm about to hand part of my week to a new
person. Below is a list of recurring tasks with how often each happens, how many
minutes each takes, and a note on what somebody would need in order to do it.

Before you read the list: I've replaced every client name with a letter. If I've
missed one, ignore it and don't repeat it back to me.

[paste your Pile 3 rows here]

Write two things.

One: a one-page description of this job, in tasks. Every line starts with a verb
and names something that either got done or didn't. No adjectives about the
person, no "detail-oriented", no "self-starter".

Two: a two-week handover plan. For each task, say what this person needs in front
of them on day one to do it without asking me, and where my list is missing that
thing.

Then tell me which of these tasks you don't think are handoverable yet, and why.

Do not write a job advertisement. Do not name a salary, a title, or an employment
type. Do not connect to anything, do not open anything, and do not send anything
anywhere.</code></pre></div><p>Take the first count this week, even if the sheet is half empty. In month two you'll want something to compare it against.</p>]]></content:encoded></item><item><title><![CDATA[Full in Hours, Broke in Revenue]]></title><description><![CDATA[Cost to serve, and the two moves that come before firing a client.]]></description><link>https://scalingclients.com/p/busy-but-not-profitable</link><guid isPermaLink="false">https://scalingclients.com/p/busy-but-not-profitable</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 02:42:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You closed a month where every hour had somebody's name on it.</p><p>Nothing sat idle. You worked the weekend before the 15th, and two clients got more than they paid for while you watched.</p><p>Then the account balance came in looking like a slow month.</p><p>You don't feel behind. You feel busy, which is supposed to be the good problem, and the number underneath doesn't agree.</p><p>Busy is a capacity fact. Profitable is an arithmetic fact.</p><p>You'd never confuse those two for a client. You'd pull the job costing, find the work that eats more than it bills, and say so. Nobody hands you that report for your own firm, so the two stay stuck together and the arithmetic never gets run.</p><p>I'm a partner at SDO CPA and I'm not a CPA; Serena is. We've had a waitlist since June. Halfway down this issue I point you at my own firm's terms page, which is one firm's answer and not a neutral one. Go read it and disagree with it if you want. I'll quote the parts that matter and link the rest.</p><blockquote><p><strong>When to fire a client, and what the numbers have to say first</strong></p><p>Later than you think, and only after two cheaper moves. Start with cost to serve: every hour that client takes, priced at what your own hour has to be worth, set against the fee. Most of those hours never reach an invoice, so I'd guess most owners have never seen the number. A client is costing you money when cost to serve goes past the fee, well before it goes past your target. When it does, the first move is a written trigger that puts a price on the expensive behavior. The second is a notice saying what changes and by when. Firing is third. Owners who skip to third pay for the exit and never find out whether the client would have changed.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Busy is a capacity fact and profitable is an arithmetic fact</strong> - only one of them shows up on your calendar, and it's the wrong one.</p></li><li><p><strong>Your fee is exact and your hours are a feeling</strong> - which makes every comparison between two clients part memory.</p></li><li><p><strong>Cost to serve is every hour a client takes, priced</strong> - and the hours that never reach an invoice are most of it.</p></li><li><p><strong>Price your own hour before you judge anybody with it</strong> - an hour valued at whatever's left over makes every client look fine.</p></li><li><p><strong>The first move is a written trigger</strong> - a consequence with a date on it does more work than resentment does.</p></li><li><p><strong>The move most people reach for is the last one</strong> - firing costs you the exit and the replacement, both at once.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Somebody forwarded you this, probably. Get your own.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Somebody forwarded you this, probably. Get your own.</span></a></p><h2>You do job costing for clients and never for yourself</h2><p>The fee is a number you can read off an invoice. The hours are a feeling you have about a client, and feelings sort in the wrong order. The client you dread isn't always the expensive one. Sometimes the expensive one is pleasant, apologetic, and emails you six times a week.</p><p><a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">Issue four</a> gave you the worksheet for this: the fee in one column, the hours in the next, divide, sort. It also told you that if you're guessing the hours, guess high. That instruction was honest and carrying more weight than it looked. The guess isn't a rounding error on the answer. It is the answer, and everything downstream inherits it.</p><p>So this issue is about the hours. It doesn't rebuild that sheet; it puts a measured number where the guess was.</p><h2>The hours nobody invoices</h2><p>Three of them, not the same size. Issue four named two and stopped short of pricing them.</p><p>Start with the interruption. A text about a transaction. A phone call that runs four minutes. A question you answer between two other things. None of it is billable, and that isn't the cost anyway. The cost is the work you stopped doing, which now takes longer than it would have.</p><p>The expensive one is the re-do. You fix something, and next month you fix it again, because the fix never reached the place the error comes from. Where that fix has to land so it stops coming back is <a href="https://scalingclients.com/p/bookkeeping-workflow">the month-end issue</a>. A client whose staff codes the same expense wrong every month isn't giving you a monthly correction. It's the same job twelve times a year and you're paying for all twelve.</p><p>Then the late file. On its own, cheap. Expensive because of where it lands: at the end of a week that was already full, pushing everything behind it. That cost doesn't even appear on their row. It appears on somebody else's.</p><p>Call that cost to serve. It's what the work takes once the hours are priced, and nearly all of the missing part is in those three.</p><h2>Cost to serve, and what your own hour has to be worth</h2><p>An hour you priced at zero makes every client look profitable. If your own time is whatever's left after payroll and software, that's a residual and you can't judge anything with it.</p><p>What would you pay somebody to do the part of this work that isn't specifically you? Say ninety dollars an hour, illustrative and round, sitting above what it would cost you to hire the work out. The annex shows how to get to your own number.</p><p>The answer comes out in dollars a month, which is the version you can decide with. On those illustrative figures, a client paying eight hundred a month who takes twelve hours costs you a thousand and eighty, which is a monthly margin of minus two hundred and eighty. On the fee that isn't a pricing problem. It looks like one in the hours.</p><p>Two weeks of counting is all it takes, and it's a count rather than a clock. You're tallying the times a client takes something, not attributing your day in six-minute blocks, and then it stops. What comes out is a shortlist. Take it to the client rather than the sheet.</p><h2>When to fire a client, and the two moves that come first</h2><p>Re-rate first. Then cure. Release last.</p><p>Cure sits before release because it's the only one of the three that doesn't risk the seat, and on a list that hasn't grown in two years that matters more than the arithmetic. <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">Whether the seat should be refilled at all</a> is the next issue's question.</p><p>Re-rate means the expensive behavior gets a price, written down before it happens. Cure means a notice: what changed, what the window is, what happens at the end of it. Release is third and stays rare, because the first two usually work and when they don't you've got a record of trying. We've used the cure step more than once at my firm, and our own read is that it comes out better on both the relationship and the insurance side. That's our read, not legal advice.</p><p>Issue four's annual review gives the bottom of your list two options, raise or release. Cure is the term missing between them, and it keeps clients you were about to lose. Issue six ran the fit test over the people already in seats; this runs the economics test over the same list, and they don't hand back the same names.</p><p>My firm's version of the first two is public, which is the only reason I can show you. <a href="https://www.sdocpa.com/terms/">SDO CPA's terms page</a> asks clients to respond to a request for records or information within ten business days. It says work expedited because information arrived late carries a rush fee of 100% of the base service fee, or hourly rates for time-based work. It says records that arrive incomplete or disorganized get the extra work billed at hourly rates. And it says either side can end the engagement at any time on written notice. Separately, an unpaid invoice carries a ten-day cure. In practice we also say up front that an estimate assumes clean records, and messy ones usually become a separate bookkeeping engagement we price on its own rather than an adjustment to the first one.</p><p>None of it is written as a threat or used as one. It's a price list for behavior, written before anybody is annoyed, which is the only time you can write one fairly.</p><p>A clause like that lives in a letter, and <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">issue seven</a> is the one that builds it. Don't paste a trigger into a client agreement off the back of a newsletter. Write the sentence and hand it to whoever maintains your terms.</p><p>And when the cure window closes and nothing has changed, <a href="https://scalingclients.com/p/when-to-turn-down-a-client">issue six</a> has the note you send. I'm not writing a second one.</p><p><strong>Do this before Friday:</strong> start a two-week tally, one line every time a client takes time nobody invoices. Work out what your own hour has to be worth. Then add a measured-hours column to the worksheet you already built.</p><p>Open your client list and find the one you'd drop today if the money didn't matter. What is it about them that makes the month harder? Send me that. Habit or number, I want to know which it usually is.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Worth an email address.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Worth an email address.</span></a></p><div><hr></div><h2>Operator annex</h2><p>You already have the sheet. What you don't have is a real number in the hours column, and the first two pieces below are what fix that.</p><h3>The two-week tally</h3><p>One note, left open, one line each time. You'll be writing in it at 4:12 in the afternoon with a client on the phone, so it has to be somewhere that's already open.</p><p>The format:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">date | client | minutes | what it was</code></pre></div><p>Filled in, a line reads <code>09-14 | Client B | 6 | text about a deposit</code>.</p><p>Two weeks. A month is long enough that you'll stop on day nine, and a week misses the close.</p><p>Count the things you'd never bill. That's what you're measuring. The four-minute call, the re-coded expense, the fifteen minutes on their bank feed, the text you answered at nine at night. If you're unsure whether something counts, it counts.</p><p>Issue seven's log catches the asks: the requests you could have priced and didn't. This catches the time nobody asks for at all, which is why it records minutes instead of decisions.</p><p>At the end of two weeks, total the minutes per client and double it for the month. Rough is fine.</p><h3>Three columns onto the worksheet you already built</h3><p>Issue four had you build a sheet with the client, the monthly fee, the hours, the effective rate, the last price change, scope creep, and an action column. Don't rebuild it, and don't touch what's in it.</p><p>Careful here. This is the mistake that makes the whole exercise wrong. Issue four already told you to put the interruptions into the hours column, guessed high. Your new number replaces that guess. It does not get added to it.</p><p>Paste this into H1, where it lands in H1, I1 and J1:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Measured hours&#9;Cost of hours&#9;Monthly margin</code></pre></div><p>Measured hours is your billed work for that client, plus the tally total after you've doubled it for the month. Type it in. Cost of hours and monthly margin are formulas.</p><p>Put your replacement rate in L1. Then I2 gets this, copied down the column:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">=H2*$L$1</code></pre></div><p>And J2 gets this, copied down the same way:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">=B2-I2</code></pre></div><p>Then sort ascending on J. Compare the order against the one column D gave you. Column D ranked your clients on hours you estimated, in dollars an hour. Column J ranks them on hours you counted, in dollars a month. Where a client moves a long way between the two lists, the estimate was the problem.</p><h3>What your own hour has to be worth</h3><p>Ask what you'd pay somebody competent to do the part of your work that isn't specifically you, add the employer costs you'd carry on them, and divide by the hours they'd actually be productive rather than the hours they'd be at a desk. Round it up. Everybody rounds this one down.</p><p>Worked with illustrative round numbers: a sixty-thousand salary plus twenty percent in taxes and benefits is seventy-two thousand. Fourteen hundred productive hours in a year rather than two thousand. On those illustrative figures that's about fifty-one dollars an hour, and it's the floor for work somebody else could do, not your own rate. The ninety I used in the letter sits above this floor on purpose. Yours will land somewhere else, and where is your call.</p><p>Two variations, because not every firm has a salary to run this off. If you've never hired, use a contract bookkeeper's day rate divided by six, or what you'd charge a new client for that same hour. And if staff absorb the interruptions rather than you, the three columns work unchanged; price those hours at the staff rate instead of yours, and the client who eats a junior's week shows up the same way.</p><h3>Two triggers you can put in writing</h3><p>Two, not six. Six clauses is five you'll wave through the first time somebody is nice about it.</p><p>Before either of them: none of this is drafted language and I'm not the one to turn it into any. Somebody wrote your terms. Send them the sentence and let them write the clause, and do the same with the notice in the next section. A price term on a client who has already signed usually can't move without whatever notice their own agreement requires, and that period is the one that binds you.</p><p>The short one, mechanical:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">We ask for a response to any request for records or information within ten business days. Work that has to be expedited because a response arrived later than that is billed at our expedited rate.</code></pre></div><p>The long one is conditional, because the messy-records case needs the condition described and the short shape can't carry it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Our monthly fee is set against records that arrive complete and reconciled to the bank statement. Where a period's records arrive in a different state, that period moves off the monthly fee and onto our hourly rate for the work needed to bring them up to it. The monthly fee resumes the following period.</code></pre></div><p>Say this at kickoff, out of the clause and in your own words. It's what keeps the clause from being a surprise, and a rate change discovered on an invoice gets argued about instead of accepted.</p><h3>The cure notice</h3><p>This isn't an exit letter. It's what has to exist before an exit letter is fair, and its real job is to be something you can point at three months from now.</p><p>The subject does most of the work:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">A change on your account starting [date]</code></pre></div><p>The note itself:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

I want to flag something before it turns into a bigger conversation.

Since [month], [the specific thing: requests have been taking three to four weeks, the bank file has been arriving after the 20th, the same accounts have needed correcting] has meant [the specific consequence: your close finishes late, roughly [N] extra hours a month on our side].

Starting [date, at least 30 days out], [the specific change: requests outstanding past ten business days move that month's work to our expedited rate / coding cleanup will be estimated separately before we do it].

Nothing else about our work together changes. If [the specific thing] goes back to where it was, so does the rate, and I'd rather that's how this goes.

[Your name]</code></pre></div><p>When you send it, name one behavior and one consequence. A notice listing four grievances turns into a wind-up to firing somebody, and the client answers the version they heard.</p><h3>The count you never have to take</h3><p>A rule per client, in whatever you read mail in. Any message from their domain gets that client's label and stays in your inbox. Nothing gets moved and nothing gets auto-replied to.</p><p>The rule is one line. Most mail clients take something like this in the search box, with or without the brackets:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">from:(@clientdomain.com)</code></pre></div><p>Then set a repeating reminder for the 1st of the month with this as the body:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Open each client's label or folder. Filter to last month. Write the message count in the sheet next to that client.</code></pre></div><p>That number measures contact volume. It correlates with the hours you never log, and unlike those hours, it counts itself. A client whose count doubles between March and June has changed something, and you'll see it in the count before you feel it in the month.</p><p>Issue eight told you to keep a note of who never uses the document address, because two months of chasing hours next to a name makes the pricing case better than a reminder does. This is that note, kept whether or not you remember to keep it.</p><h3>One prompt</h3><p>Ranking your own client list is the step you're least neutral about, so it's the one worth a second opinion.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">This is a **synthetic practice table**. Every business, number, and behavior is made up for this exercise. Do not treat names replaced by letters as proof that a real client table may be disclosed to an AI service.

Work only from what I paste. No lookups, no connections. Nothing you write here is sendable as-is: the terms sentence goes to the person who maintains my agreements, not to a client.

Columns: practice row, monthly fee, measured hours, cost of hours, monthly margin.

Northside trades, $900, 14, $560, $340
Clearwater studios, $1,200, 23, $920, $280
Maple service co., $750, 8, $320, $430

Tell me the two rows with the worst monthly margin. For each one, name the single behavior most likely to be producing the unbilled hours. Then, for the worse of the two, draft one sentence I could take to my terms that would put a price on that behavior. Give me the sentence only, not a full clause.

Ask me up to three questions about those two rows before you answer.</code></pre></div><p>The model can see that a row is bad. It can't see that the client's controller left in April, so the two rows it names are questions to go and ask, not conclusions.</p><p>The filter counts whether you open it or not. Everything else here waits for you.</p>]]></content:encoded></item><item><title><![CDATA[Marketing for Bookkeepers: Visible Without Becoming a Content Creator]]></title><description><![CDATA[Two routes reach a stranger, and neither one is a feed. Build one page and one habit.]]></description><link>https://scalingclients.com/p/marketing-for-bookkeepers</link><guid isPermaLink="false">https://scalingclients.com/p/marketing-for-bookkeepers</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 02:42:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You opened the compose box on a Tuesday. Twenty minutes free and a vague sense you were supposed to be saying something. You looked at the cursor, thought of three things that felt too obvious to type, and closed the tab.</p><p>Three weeks later you opened it again. Same three ideas. Same tab.</p><p>That's most firm owners I talk to, and the guilt's misplaced. The advice was wrong. Somebody told you that being visible means producing, and producing on a schedule is the one thing a person who bills their own hours can't sustain.</p><p>Visibility isn't production. A stranger ends up in your inbox one of two ways. They go looking for something and find you, or a person says your name and they go check. Both are buildable, and neither needs a posting habit.</p><p>A page, then a habit. The page has to exist first.</p><p>Call the page an answer with an address. It's the reply you've already typed four times, published once, at a URL you can paste into the fifth conversation instead of typing it again. That's the test. If you wouldn't paste the link, you wrote the wrong page.</p><p>That page isn't hypothetical. <a href="https://www.sdocpa.com/how-to-catch-up-on-bookkeeping/">SDO CPA has one on catching up two years of books</a>, and SDO CPA is where I'm a partner. We've been at capacity since June, waitlist behind it. I've got an interest in you believing this works, so check it against your own week. Ours came from a mix, some out of replies we'd already sent and some out of keyword research.</p><blockquote><p><strong>What does marketing for bookkeepers actually look like?</strong></p><p>A stranger reaches you two ways. Search is one: a business owner types a problem and lands on something you wrote. A person is the other: somebody gets asked who to call, says your name, and the listener checks you inside the hour. You build the search route with answer pages, one question per page, taken from questions you already get by email. You get asked about by being useful in threads other people started, with no pitch attached. A posting schedule is optional in both. What matters is having something on your site when the checking happens.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Two routes</strong> - a stranger either searches for a problem or hears your name from a person, and both get built without posting on a schedule.</p></li><li><p><strong>The answers already exist</strong> - they're sitting in your sent folder, written under pressure, findable by nobody but you.</p></li><li><p><strong>The test is whether you'd paste the link</strong> - if you'd still retype the answer instead, you wrote the page for the wrong reader.</p></li><li><p><strong>Ads are rented</strong> - we tested them years ago and stopped. The day you stop paying, it stops.</p></li><li><p><strong>The comment worth writing is the one the thread missed</strong> - if the discussion already covered your point, keep the twenty minutes.</p></li><li><p><strong>The hour after somebody says your name decides it</strong> - a profile with a job title on it doesn't answer the question the listener arrived with.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;You can read this without ever posting anything.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>You can read this without ever posting anything.</span></a></p><h2>What marketing for bookkeepers actually is</h2><p>Search for advice on marketing a bookkeeping firm and count how many results tell you to be consistent. That's the genre. Post more. Engage more. It works, and it's expensive in the only currency you're short of, which is Tuesday afternoons.</p><p>The cheap version is one page.</p><p>Pick a question you've answered by email three times this year. A real person sent it, in their own words, usually with an apology in front of it. Then go find the reply you sent and start from there. You already wrote the good version under pressure, and you've been retyping it ever since.</p><p>That page does two things a post can't. You can hand it over, which means pasting the link into the next email instead of writing the answer a fourth time. That's the part that pays even if it never ranks. And it sits there in March, when the person who skimmed it in October finally has the problem badly enough to act.</p><p>Pick the question carefully. The one you get asked most is sometimes the one from the clients you least want, and a page is a permanent invitation. <a href="https://scalingclients.com/p/bookkeeping-niches">The issue on picking a lane</a> is the filter for that. Run the question through it first.</p><p>Getting that page found in a search is a separate job. <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">The issue on being findable</a> walks that side end to end, including the audit that tells you whether you show up at all.</p><p>We ran ads in 2023 at my firm, for six months. Very few of the leads we could attribute came back to the channels we were paying for, and we track that, so we stopped and haven't spent on them since, which is why issue one describes the firm as running no ads. Ads are rented attention. The day the card stops, so does the traffic. If you've got the budget, run them.</p><h2>Answer in rooms you didn't build</h2><p>The other route runs through a person. What you build is the reason your name's in their head when somebody asks them for one.</p><p>Be precise about who that person is. Usually not a buyer. It's another practitioner, a bookkeeper who's full, an attorney whose client just asked, somebody adjacent who fields the question and has nobody to hand it to. That's the same supply <a href="https://scalingclients.com/p/accountant-referral-program">the referral issue</a> is about, from the other end. Issue two was about asking them. This one is about giving them something to point at.</p><p>Those people are already talking, and the question's already being asked. Somebody posts about a payroll mess they walked into. Somebody in a group asks which entity their client should be in, and the answers underneath cover most of it while missing the part you know from having cleaned it up.</p><p>I pick threads on one signal, and it took me a while to trust it. Read what's already been said, then look for the gap. If the discussion covered everything you were going to say, skip it. Keep the twenty minutes. If it missed something you only know from having done the work, that's the one.</p><p>Before you write, look at whether you've already commented on that person recently. Turning up under the same three people every week starts to look like a routine from their side. I'm not in there much at the moment. When I am it's about once a week, not daily.</p><p>The rules I keep are short. No firm name in the comment, no product plug, no offer to hop on a call. One voice. My own account, nothing else. Two accounts agreeing under the same post is staged, and everybody can smell it. The sending's mine too. I draft with help, then read every word and press the button myself. <a href="https://scalingclients.com/p/ai-for-bookkeepers">What an AI tool is allowed to see before it drafts anything</a> is a decision your firm makes once, in writing.</p><p>A question I put to my feed brought other firm owners into a real conversation about who they refer to and why. That's in issue two. I have no client who traces back to a comment. I don't keep that record and I'm not going to invent one.</p><p>The mechanical half stands without a case study. A published answer removes a reply you'd otherwise type again. A name with something underneath it survives being searched. The person who eventually says your name watched you be useful for free.</p><p>And the limit runs the other way. If almost nobody sends you questions yet, there's no page here to write. <a href="https://scalingclients.com/p/how-to-sell-accounting-services">Go have the first ten conversations</a>, then come back to this.</p><h2>What a stranger finds an hour later</h2><p>Somebody says your name across a table. The listener nods, and forty minutes later they type your name into their phone.</p><p>The search is where the referral actually happens. The favor isn't spent until it resolves.</p><p>If what comes back is a profile with a job title and a headshot, it evaporates. Nobody tells you. The person who recommended you doesn't find out either, so they keep recommending you to people who bounce off the same profile. Three pages answering questions in the listener's own situation, and it lands instead. The referral was identical both times.</p><p>So the page comes before the habit.</p><p>You might have a couple of blocks on your site from earlier issues already. They stack in the order a stranger reads them. Who you're for near the top, what you won't take underneath. Then the answer pages, one per question, each on its own page.</p><p><strong>Do this before Friday:</strong></p><ol><li><p>Search your sent mail for "can I still" and "what happens if". More phrases in the annex.</p></li><li><p>Write one answer page. Your question, your words, its own page on your site. Start here. A single page is where this starts paying you back; three is where it starts landing referrals.</p></li><li><p>Put a half hour aside this week and name it after what happens inside it.</p></li><li><p>In that half hour, find two threads where the discussion missed something you know, and say the missing thing. No link and no firm name, unless somebody asks.</p></li></ol><p>There's a question you've answered by email more times than anybody should have to. I want to know what it is.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Read it Monday, build it by Friday.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Read it Monday, build it by Friday.</span></a></p><div><hr></div><h2>Operator annex</h2><p>All of this exists because I kept typing the same things twice.</p><h3>The answer page</h3><p>This goes on your site as its own page, at its own address, not as a section of an existing one.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[The question, worded the way a client would ask it]

Short answer: [Two or three sentences that answer it. No preamble. Don't open with "it depends".]

What changes the answer:
- [The first thing]
- [The second thing]
- [The third thing]

What the work involves: [Three or four sentences on the actual steps, in order, with a realistic timeframe. Say estimate, never quote.]

Who this is for: [One sentence naming the kind of business and the situation. Then one naming who it isn't for, and where they should go instead.]

If this is your situation: [Where to go next. Your intake form. Not a call, and not an offer to look at their books for free.]</code></pre></div><p>Filled in, it reads like the block below.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">We switched payroll providers in June. What do I need from the old one?

Short answer: Get the year-to-date register and every filed return before your access shuts off. Old providers usually cut logins within a couple of months, and rebuilding a year out of pay stubs costs more than it sounds like.

What changes the answer:
- Whether the old provider filed the quarterly returns or only prepared them
- Whether anybody left mid-year, because their totals have to carry across
- Which state accounts moved, since some transfer and some need a fresh registration

What the work involves: We pull the year-to-date register from the old system and tie it to what the new one imported, line by line, before the next quarter closes. Anything that doesn't tie gets fixed while both logins still work. You get a written estimate once we know how many pay periods are involved. [A mid-year switch usually runs (your own range) once the files arrive.]

Who this is for: Owners who moved payroll partway through a year and haven't checked what came across. If you switched on January 1 with no prior-year activity, this is simpler than the page makes it sound.

If this is your situation: Start with the intake form. It asks for what we need to size the work.</code></pre></div><p>The firm in that one is invented and so are the mechanics. Your own numbers go in the brackets.</p><h3>Where your questions already are</h3><p>Search your own sent mail for the openers below. Every mail client can search sent items, so the phrases are what matter and the syntax is yours.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">how much
do I need
can I still
what happens if
is it too late
the difference between
behind on
should I switch</code></pre></div><p>Three separate people is the threshold I use. Pull the third reply you sent and start the page from that one.</p><h3>Before you write, four lines</h3><p>Write them in a scratch file. In your head works if the answer's obvious.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">What the post is about:
What the discussion missed:
Have I commented on this person in the last few weeks:
What I'd add, in one sentence:</code></pre></div><p>If the second line is empty, close the tab. Same if the third line is a yes.</p><h3>Four ways into somebody else's thread</h3><p>Four comments, sorted by what each one adds. Swap the brackets for your own work. None of them names a firm or mentions that you're taking work.</p><p>A detail from a file you've worked.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Same thing happened on a [type of work] file last year, right down to [the detail that made it worse]. What saved it was [the specific thing], and I only know that because we did it the slow way first and then spent a week undoing the shortcut. Cheap lesson to borrow.</code></pre></div><p>You genuinely want to know how they handled one part of it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Curious how you handled the [specific detail] side of it. That's the piece I've never found a clean answer for.</code></pre></div><p>There's a wrinkle under what everyone in the thread agreed on.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">A wrinkle underneath this. [The thing everyone assumes] is usually downstream of [the underlying thing]. Every time I've seen it, fixing the visible half bought about a month before it came back.</code></pre></div><p>Nobody in the thread has the number.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Adding a number to this. [The specific step] runs closer to [realistic amount of time] than the [what people assume] most people budget.</code></pre></div><p>If somebody asks for the link, send it.</p><h3>The half hour, and the two lines under it</h3><p>Book the half hour somewhere in the week. Then add two lines to whatever file you already keep open. A notes file, the bottom of your task list, wherever you actually look.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Answered:
Question worth a page:</code></pre></div><p>Any time you catch yourself retyping an answer you've already sent somebody, put that question on the second line. When the same one keeps landing there, stop answering it by hand and write the page.</p><h3>Sorting, then drafting (review before you apply anything)</h3><p>Neither of these writes anything to your site. They hand you text on a screen and that's where they stop.</p><p>This one reads your replies and doesn't write. Paste in what your searches turned up.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Below are replies I've sent to clients and prospects. Before you read them: I've replaced every personal name, business name, email address and dollar amount with a letter or a placeholder. If you spot one I missed, tell me and stop there.

Group them by the underlying question being asked. Topic is the wrong axis here. For each group give me three things: the question in one plain sentence, the way a business owner would ask it; how many separate times I've answered it; and the single best-written sentence from my own replies, quoted exactly as I wrote it.

Don't improve my sentence. Don't write an article, a page, or a headline. Don't suggest keywords. Don't save, send, publish or post anything anywhere. Rank the groups by how many times I've retyped the answer, and stop.

[paste the replies here]</code></pre></div><p>The other builds the page, one question at a time, out of the replies you actually sent.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'm building one page on my own website out of replies I've already written. The question is: [question]. Below are my own replies to it.

Everything I paste is de-identified. No client name, no business name and no real amount appears in it, and none should appear in what you hand back.

Cut and order what's below into this shape: the question as the title; a two or three sentence direct answer; three things that change the answer; what the work involves, in order; one sentence naming who it's for and who it isn't for; one line pointing at my intake form. Every sentence in the draft comes from my text. Edit my words down. Don't compose new sentences. If a section has nothing in my replies to fill it, leave it blank and tell me what you need from me.

Rules. Keep it at a seventh grade reading level. Say estimate, never quote. Don't offer a free consultation, a free review, or a free look at anybody's books. Don't invent a timeframe, a price, or a credential I didn't give you. Don't publish, post, connect to my site, or save a file. Hand me the draft and stop.

[paste your replies here]</code></pre></div><p>Scrub the names before anything goes in. If nothing you paste has a client in it, nothing that comes back can put one on your site.</p>]]></content:encoded></item><item><title><![CDATA[Month-End Should Be a Review, Not a Rebuild]]></title><description><![CDATA[Your close is long because of what the month didn't capture. The workflow that fixes the 1st instead of the 15th.]]></description><link>https://scalingclients.com/p/bookkeeping-workflow</link><guid isPermaLink="false">https://scalingclients.com/p/bookkeeping-workflow</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 01:14:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It's the 3rd, and you're trying to remember a Tuesday from four weeks back.</p><p>One card purchase, no receipt anywhere, and four weeks of bank feed behind it that nobody has looked at.</p><p>Ten minutes of that feed sorts itself out. Then you hit the rest. A transfer that's either an owner draw or a loan payment. A run of charges from a vendor you don't recognize. A deposit that doesn't match any invoice you've got.</p><p>So you write to the client. They answer part of it four days later. You ask again. On the 11th you get the last piece, and by then you've been in and out of that one file six separate times.</p><p>The ten minutes was bookkeeping. The eight days were you reassembling a month out of a bank feed and your own memory of it.</p><p>You can't review a month you're still assembling.</p><p>Every one of those unknowns had a cheaper version of itself. On the day it happened, the client could have told you what that transfer was in about eight seconds, because they'd just done it. Four weeks later the same question costs you a message, a reminder, a guess, a follow-up, and a re-open of a file you'd already finished twice.</p><p>The problem is the 1st, not the 15th.</p><p>The 1st is thirty days long, and most of those days you're already in the file.</p><blockquote><p><strong>What is a good bookkeeping workflow?</strong></p><p>A bookkeeping workflow is where in the month each decision gets made. Three layers do the whole job. Capture: documents arrive on the day of the spend, through one route the client never has to learn. Triage: one twenty-minute pass a week where you ask about anything you can't identify, while the person who knows still remembers. Standing rules and a written definition of done: the recurring judgment calls get decided once, in writing, so they stop routing through your head. Build all three and the close becomes a check against a list. The work moved to the days where it costs a fraction of what it costs on the 3rd.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>A long close is a measurement of the month behind it</strong> - the days at the front of your month count what nobody captured or decided in the thirty before.</p></li><li><p><strong>Four things repeat in every painful close</strong> - a transaction nobody can identify, a document that doesn't exist yet, something only the client knows, and a judgment call somebody skipped.</p></li><li><p><strong>Two of those are capture failures and two are decision failures</strong> - fixing how documents arrive only reaches the first pair.</p></li><li><p><strong>Set up the document route first</strong> - an address, a sentence, and an autoresponder change what arrives next month.</p></li><li><p><strong>Twenty minutes a week beats the front of the month</strong> - and the twenty minutes is spent asking questions, which is why it survives a busy week.</p></li><li><p><strong>Done has to be tickable by a stranger</strong> - a close that can't finish without you in the room is a job you'll still be doing at fifty clients.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Free, and every issue so far is still up.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Free, and every issue so far is still up.</span></a></p><h2>The four things a rebuild is made of</h2><p>Pull up the last three closes that hurt. Nearly everything in them is one of four items, and it tends to be the same four. Each one has a version that costs seconds and a version that costs a week.</p><p>Start with the transaction nobody can identify. On the day, that's a one-line question: what was that charge to the processor this morning? On the 3rd it's three messages, a guess, and a correcting entry next month.</p><p>A document that doesn't exist yet. On the day it's a photo of a paper receipt taken in the parking lot. On the 3rd there's nothing to go find, so you're deciding how much documentation you're willing to live without.</p><p>The question only the client can answer. On the day: was that personal, and a yes. On the 3rd it's a client squinting at a date four weeks back, which is a coin flip you then post to the books.</p><p>The judgment call you skipped. On the day it's thirty seconds of thought while you still have the whole context. On the 3rd it's the same thirty seconds with less context, and no memory of what you decided the last time you saw it.</p><p>They split in half. The first two are capture problems, and capture is wiring you install once. The last two are decision problems, and no route you set up will touch them. Fix only the capture side and the answering still gets batched into one shift at the start of the next month, which is the rhythm nobody ever taught anybody to change.</p><h2>The bookkeeping workflow starts with capture</h2><p>The workflow is three layers, and capture goes first because it shrinks everything downstream.</p><p>One email address that lands wherever your documents live. One sentence to the client: forward it when it happens, photos are fine, don't write anything in the email. An autoresponder on that address, so they get a reply and learn the thing worked. No app, no portal, no password they'll reset twice and then stop using. That address keeps collecting on a week you never open it, which is <a href="https://scalingclients.com/p/ai-for-bookkeepers">the test worth running on anything else you pay for</a>.</p><p>You've probably tried a version of this and watched it die by week three. It dies because sending you a receipt is your problem and nothing about it feels urgent to somebody running a restaurant.</p><p>So attach it to something they want. The unresolved-items list goes out on a fixed schedule, names the specific transactions you can't finish without, and their statements genuinely wait on it. That's the first time the receipt has been their problem.</p><p>For the client who will never comply, stop trying. Ask at the moment the transaction shows up in your weekly pass, one question at a time, and put the chasing on the invoice.</p><h2>Twenty minutes, three questions, same order</h2><p>Once a week, same slot, all clients. Twenty minutes.</p><p>What came in this week that I can't identify?</p><p>What's identified but has no document behind it?</p><p>What did I decide not to decide?</p><p>Then you send. All of it, one message per client, once a week. Five messages across five days teaches the client to skim you.</p><p>The list is fixed at three. That's what stops it growing into a second close, which is the part that breaks first.</p><h2>Write down the decisions you keep re-making</h2><p>"What did I decide not to decide" is the decision half, and it's where the capacity is.</p><p>Owner draws versus distributions. Personal spend on the business card. The vendor that's half cost of sales and half equipment. You've decided each of these before. Nobody writes it down, so it gets decided again, slightly differently, and every one routes through your memory.</p><p>Write them down. One file per client, one line per rule, in whatever plain words you'd use with a staff member. "Anything at the fuel station under our documented threshold goes to vehicle expense, statement line only." "Transfers to the second account are draws unless the owner tells us otherwise the same week." For a client you've had a couple of years it's one sitting.</p><h2>Done is a list somebody else could tick</h2><p>A close checklist that needs you in the room is a set of reminders for one person. The tell is any step that reads "check the usual things." The rest of it never got written down, so it stays with you.</p><p>Put on it the steps that fail silently. Every account reconciled to a statement. Zero uncategorized. Nothing parked in Ask My Accountant or whatever your holding account is called. AR and AP agings tie to the balance sheet. Suspense and clearing accounts at zero or explained. Payroll cleared to the payroll report. Prior period locked with a closing date set. And the item you've already had to fix twice for this client. Those are the ones that fail without telling you. You'd never forget to open the file.</p><p>Same list for every client, one row per month. A client who needs something extra gets a note in the last column.</p><h2>What the client owes you, and when</h2><p>The client has a job in the close and nobody ever told them what it was. Nobody told them in <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">the engagement letter</a>, and nobody told them across all the months the statements arrived late.</p><p><a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">The issue on what to charge</a> made the case for saying the scope sentence in week one, before anyone has a reason to be annoyed. The month map is that same move on the delivery side. In week one you tell them what you need, by when, and what happens when it's missing: you close what you can, their numbers are wrong for a month, and you tell them which numbers.</p><p>Week one, this is just how you work. Left until the third bad close, it sounds like you're building a case.</p><p><a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">The system that fills a firm</a> only helps if there's room for what it brings you. My own firm, SDO CPA, has had a waitlist since June, and the constraint there has never been demand. The front of your month, spent reassembling the same handful of accounts, is the room.</p><p><strong>Do this before Friday:</strong> pick the client whose close hurts most and write down the four things you re-derive for them every single month. Then start that client's rules file, one line per decision you know you've made twice.</p><p>Open last month's close for that client. What was the last thing to clear, and who were you waiting on? Both answers, in a reply, would be genuinely useful to me. <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">The capacity issue</a> is out now and it still needs a wider sample than my own client list.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;I write one of these a week.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>I write one of these a week.</span></a></p><div><hr></div><h2>Operator annex</h2><p>None of this needs a new app. A sheet, an email address, and <a href="https://scalingclients.com/p/build-one-firm-skill">two text files</a>.</p><h3>The close checklist</h3><p>One sheet, one row per client per month. Column headers first:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client, Month, Feed categorized, Docs complete, Questions sent, Questions answered, Reconciled, Agings tie, Payroll cleared, Prior period locked, Repeat-fix check, Sent to client, Notes for next month</code></pre></div><p>Repeat-fix check is the column that usually gets left out, and it's the one that compounds. It's a yes or no on whether you looked at the specific thing you've already fixed twice for this client. Notes for next month is where you write the sentence that stops you working the same problem out from scratch in thirty days.</p><p>The definition of done, written once and kept where the person doing the close can see it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">This month is closed when:

- Every bank, card, and merchant account is reconciled to a statement
- Zero uncategorized transactions, not just zero over your review threshold
- Nothing is sitting in Ask My Accountant or an equivalent holding account
- AR and AP agings tie to the balance sheet
- Suspense, undeposited funds, and any clearing account are at zero or explained in Notes
- Payroll is cleared to the payroll report and posted to the period it belongs to
- Every question sent this month has an answer in writing, or a rule that made it unnecessary
- The prior period is locked and the closing date is set
- The repeat-fix check for this client is done
- The statements are with the client</code></pre></div><p>The rule for a box you can't tick: the close still ships. You mark the row done, write the unticked item and the reason in Notes for next month, and tell the client which number is affected. A close that waits for one missing receipt just arrives later, and then it's two closes.</p><h3>The month map you give the client</h3><p>Send this in week one, in the onboarding email or right after the kickoff call. Fill in your own dates and cut anything that doesn't apply. Mine reads the 5th and the 20th. We ask for everything on the 5th and we aim to have every client closed by the 20th.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Here's the monthly rhythm, so you know what to expect from us and what we need from you.

From you, every month:
- Bank and card statements by the [5th], if we don't pull them automatically
- Receipts as they happen, forwarded to the address below. Not saved up for the end of the month.
- Answers to our monthly questions within two business days. There are usually a handful and they're short.

From us, every month:
- One message with all of our questions, sent the same week each month
- Your closed financials by the [Nth], once the questions above are answered

If something's still outstanding on your side after the [Nth], we close the month without it. Your statements go out on time and we'll tell you exactly which numbers are affected and what would fix them. It carries to the following month.</code></pre></div><p>The closing paragraph is what makes the deadline real without anyone having to charge a late fee. If the which-numbers-are-affected pass turns into real work on a late month, it belongs in your scope sentence and on the invoice.</p><h3>The capture address</h3><p>An address, and then two sentences you write once.</p><p>Set up a dedicated address that lands wherever your documents live. Then give the client this, once, in writing:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Forward receipts and bills to [receipts@yourfirm.com] as they come in. Photos are fine. You don't need to write anything in the email. If it's a card purchase with no email receipt, take a picture of the paper one and send it from your phone before you leave.</code></pre></div><p>That sentence goes in three places: the onboarding email, the bottom of every message you send them for the first month, and a contact card you ask them to save under your firm's name. The contact card is the one that gets it onto the phone, and the phone is where the receipt is. My own firm runs document intake and most of its client conversation through a portal, TaxDome in our case, and an address like this is what catches the clients who will never log in to one. An address you hand out gets found by more than clients, which makes it the first mailbox at the firm where you want <a href="https://scalingclients.com/p/microsoft-365-spam-quarantine">spam held outside the inbox instead of dropped in Junk</a>.</p><p>Then the autoresponder:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Got it, thanks. This is filed for [Firm]'s bookkeeping.

If this one needs an explanation (personal, a new vendor, a job it belongs to), just reply to this email with a few words and we'll attach it.

No reply needed otherwise.</code></pre></div><p>Keep a note of who never uses it. Two months of chasing hours next to their name makes the pricing case better than any reminder you could send them.</p><h3>The weekly pass</h3><p>Twenty minutes. Same slot. Keep this where you'll see it when the slot fires:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Weekly pass. 20 minutes. Do not close anything.

1. What came in this week that I can't identify? Note it, don't solve it.
2. What's identified but has no document behind it? Note it.
3. What did I decide not to decide? Note it, and mark whether it's a repeat.
4. Send one message per client with everything from 1-3. One message.
5. File anything that came back from last week's message, now, while you're in here.
6. Anything from 3 that's marked a repeat goes in that client's rules file before you stop.

If a client has nothing this week, send nothing. A week with no message is what makes the weeks with one worth opening.</code></pre></div><p>The last two steps are the ones that get dropped in a busy week, and an answered question that never got filed still shows up on the 3rd.</p><h3>The standing rules file</h3><p>One file per client. One line per decision. Plain words, because the point is that somebody else can read it and act.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Client] - standing rules
Last updated: [date]

- Fuel station charges under [your documented threshold]: vehicle expense, statement line only
- Transfers to the second operating account: owner draw, unless the owner tells us otherwise in the same month
- [Vendor]: split [70/30] cost of sales / equipment unless the invoice says otherwise
- Anything from [platform]: revenue, gross, with the platform fee booked separately
- Personal charges on the business card: due from owner, and flagged in the monthly message

Anything not on this list that comes up twice gets added here the second time.</code></pre></div><p>One line does the work there: anything that comes up twice gets written down the second time.</p><h3>One prompt (review before you apply anything)</h3><p>One warning before you paste anything into this. It sees a client's account list, so scrub the names first, every time. And what comes back is somebody else's guesses about your accounts. Edit it into your own standard before anybody works a close from it.</p><p>The capture instruction above doesn't get a prompt. It's one sentence and you already have it.</p><p>The close checklist is where a prompt earns its keep. Its value is in the done-conditions, and those depend on accounts you actually have:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a bookkeeping firm. I'm writing a definition of done for our monthly close, so a staff member can complete a close without asking me anything.

Below is a chart of accounts for one client. Read it and propose the done-conditions that this specific client's close needs, on top of the standard ones: all accounts reconciled to a statement, zero uncategorized, nothing in a holding account, agings tie to the balance sheet, payroll cleared, prior period locked.

I want you to look for accounts that go wrong quietly: clearing and suspense accounts, intercompany, owner accounts, inventory, deferred revenue, anything that should net to zero and won't announce it when it doesn't.

[paste chart of accounts]

Give me a plain checklist a person can tick, in the order they'd work it. Say which items you're unsure about and why. Don't connect to any accounting system, don't pull data from anywhere, and don't write anything to a file. This is a draft for me to edit.</code></pre></div><div><hr></div><p><strong>House ad. I build this one.</strong></p><p>Growthy is bookkeeping software I build. It connects to QuickBooks Online, or you import bank statements, or you upload a CSV. It categorizes the routine transactions automatically and hands the rest to you to review and approve. About 85 percent lands right on a first import. Running my own firm's books on it took our month-end close from about four hours to about 30 minutes, on our own books, covering the categorizing half of the job. It doesn't build your checklist or ask your clients anything. Every judgment in this issue is still yours. <a href="https://growthy.com/signup/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-08">See what Growthy does</a>.</p><div><hr></div><p>Two of these hold their value past this month. The address, because documents keep arriving through it while you're doing something else. The rules file, because a decision written down doesn't come back a third time.</p>]]></content:encoded></item><item><title><![CDATA[The Bookkeeping Engagement Letter Nobody Taught You to Write]]></title><description><![CDATA[Your letter lists what you do. The scope-creep tax starts with everything it never mentions.]]></description><link>https://scalingclients.com/p/bookkeeping-engagement-letter</link><guid isPermaLink="false">https://scalingclients.com/p/bookkeeping-engagement-letter</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 01:14:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"Can you just look at last year's payroll journal? Something feels off."</p><p>That's the whole email. You open the file, because looking takes two minutes, and looking does take two minutes.</p><p>What takes three weeks is the six months sitting behind it, once you've seen the first one.</p><p>Nobody said a number at any point. Not in the email, not while you were in there, and not when you sent the same invoice you send every month.</p><p>That client signed a bookkeeping engagement letter. It's a good one. Monthly reconciliations, the close, the reports, the year-end handoff, two pages, a lawyer looked at it once. It also never says what the client owes you, or by when, which is <a href="https://scalingclients.com/p/bookkeeping-workflow">where a month turns into a rebuild instead of a review</a>.</p><p>It doesn't list a single thing you don't do.</p><p>So nothing got crossed, because nothing got drawn. The client didn't creep. They asked. Asking is free, and the answer was yes, because the letter gave you no line to point at and gave the ask no price.</p><p>Most owners inherit that letter. It came from an association, or a firm you used to work at, or a search. It was built to protect you in a dispute. It was never built to price a Tuesday.</p><p>And if you landed here because somebody handed you a letter to sign, this one is written for the firm on the other side of the desk.</p><blockquote><p><strong>What should a bookkeeping engagement letter include?</strong></p><p>The usual parts: the parties, the period, the services, the fee terms, and how either side ends it. The part most letters skip is the one that does the work, which is an explicit list of what isn't included. Then three lines almost nobody writes. That you work from what the client gives you and don't verify it. What happens when something outside the scope turns up, which is a note carrying a number, sent before the work starts. And a date the engagement lapses if the client goes quiet. Keep the fee itself out of the body and point at a services list you can update without re-papering every client who ever signed.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>An inclusions list is a menu, not a boundary</strong> - a menu invites additions, and every addition arrives with no price attached.</p></li><li><p><strong>The out list is the working half of the letter</strong> - five categories cover most of what actually creeps, and each one is a sentence rather than a policy.</p></li><li><p><strong>Keep the fee out of the letter body</strong> - the letter carries terms, the services list carries the number, and a price change stops being a re-papering exercise.</p></li><li><p><strong>The crossing needs a mechanic</strong> - a two-sentence note with a real number and a real no, sent before the work rather than after it.</p></li><li><p><strong>Say what you don't verify</strong> - one line that you work from what the client hands over, which is the difference between a correction and an argument.</p></li><li><p><strong>A letter with no end date never closes</strong> - a client who signs, pays, and goes quiet leaves a file nobody can age out.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe. Nothing here is gated yet.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe. Nothing here is gated yet.</span></a></p><h2>Why your inclusions list isn't a boundary</h2><p>A service list answers one question, which is what do I get. It doesn't answer the second one, which is what happens when I ask for something else. When the letter is silent there, the answer defaults to yes. You're the one sitting there, the ask is small, and it's Tuesday.</p><p>A list that promises monthly reconciliations says nothing at all about last year's payroll journal, so last year's payroll journal is free.</p><p>My own firm, SDO CPA, has had a waitlist since June and still turns work away. We spent this spring rewriting our own letters anyway, and the change that mattered wasn't legal. It was the paragraph naming what a letter does not cover, and where the adjacent work goes instead. The version I see most often starts as a simple tax return and turns into a catch-up engagement, then a payroll engagement, because the books behind it were never clean.</p><h2>The out list</h2><p>Five categories cover most of what actually creeps. Write a line for each and you've written the working half of your letter.</p><p><strong>Prior periods.</strong> Anything dated before your start date. The books you inherited are somebody else's work, and pricing them as though they were yours is how a two-month cleanup becomes free. Cleanup gets its own estimate.</p><p><strong>A change in the client's shape.</strong> A new entity, a new state, a second location, a payroll provider they switched without mentioning it, a point-of-sale system swapped in March. The work changed. The number didn't, because nothing in the letter said it would.</p><p><strong>Third-party requests.</strong> The lender package. The insurance audit. The landlord who wants a letter on your paper. The new accountant's document request in February. Every one of those is a real afternoon and none of them are the monthly close.</p><p><strong>The client's other people.</strong> Training the bookkeeper they just hired. Cleaning up after the one they fired. Answering their attorney's questions. You're being useful, and you're being useful at zero. That whole pile has a name in <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">the capacity issue</a>: work that belongs to the client and got absorbed.</p><p><strong>Advice that belongs in its own engagement.</strong> The questions that open with "while I have you." Entity structure. What to pay yourself as an S-corp shareholder. Whether to buy the truck this year. Good questions. Not bookkeeping.</p><p>Each of those ends one of two ways. A price, or the sentence "that's a separate engagement." What you can't do is leave it unanswered, which is the option that gets taken by default.</p><h2>Keep the fee out of the letter</h2><p>The letter carries terms. The services list carries the number.</p><p>We took fees out of the body of ours entirely. The letter points at the services list in the system clients sign through, which turns a price change into one edit instead of a re-papering job across everybody who ever signed. Overages sit there too, next to the service they belong to, rather than buried in a terms section nobody reads twice.</p><p>If you don't have a services list yet, that's the smaller job and it comes first. One page or one screen, each package with what it includes and what it costs, somewhere you can edit it without asking anyone. The letter can point at a page on your own site. It just can't point at a number typed into a document eleven clients have already signed.</p><p>One thing about the paper itself. When terms change, don't edit them in place. Copy the file, date the copy, keep a changelog. Six months later somebody asks what a client actually agreed to and you can answer instead of guessing.</p><h2>What a bookkeeping engagement letter does when the line gets crossed</h2><p>An out list with no consequence attached is just a longer letter. The consequence is a note, and it goes out before the work does.</p><p>Two sentences. What they asked for, what it costs, does that work for you. No preamble about valuing the relationship.</p><p>The number comes off your own margin math, which is <a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">what to charge</a> territory rather than this issue's. The hours behind that number, the ones that never reach an invoice, get counted in <a href="https://scalingclients.com/p/busy-but-not-profitable">the issue on being full and still broke</a>.</p><p>Then wait. If the answer is no, nothing happens and nobody's annoyed, because nothing was done yet. If it's yes, it's on the invoice and it was agreed to in writing. The version that goes wrong is the one where you do the work first and mention it after. Then the price isn't a price. It's a bill for something they thought was included, and you're negotiating from behind.</p><p>While you're in there, add the line about what you don't verify. One sentence saying you work from the records and information the client provides and you aren't auditing them. It sounds like lawyer furniture and it's actually practical. The day a client hands you the wrong year-to-date payroll figures during a mid-year switch, that sentence is the difference between a correction and an argument.</p><h2>The letter needs an end date</h2><p>An engagement with nothing to end it stays open. Forever isn't an exaggeration. A client signs, pays, sends nothing, stops replying, and the file sits there being your responsibility.</p><p>Two dates fix it. A stall notice a few weeks in, when what you need hasn't arrived, which is a short email saying the clock is running and here's what's outstanding. Then a lapse date a few months out, after which the engagement is over and starting again means a new letter at current pricing. At my own firm a new engagement can sit three or four weeks waiting on the client before anybody worries. Past a few months of that, with the client still asking for speed, we let it go.</p><p>This is about closing engagements that never got started, not about repricing the live ones. Those move on their own schedule. A re-signing is still a small sales conversation though, and <a href="https://scalingclients.com/p/how-to-sell-accounting-services">issue three</a> covers saying a number out loud without apologising for it.</p><p><strong>Do this before Friday:</strong> open the last engagement letter you sent. Find the part that says what isn't included. If there isn't one, that's the finding. Write five lines, one per category above, in the words you'd actually use with a client. Then list the three biggest things you said yes to last quarter that weren't in any letter, and put a number beside each. You're not billing anyone retroactively. You're finding out what the missing paragraph has been costing.</p><p>Reply with the line you wish had been in your letter. Just the line, the single exclusion that would have saved you a quarter.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribing costs you an email address.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribing costs you an email address.</span></a></p><p><strong>House ad.</strong> I build TracePrep, so weigh this however you want.</p><p>The fifth category up there is the expensive one, and its S-corp version is the worst of the set. A shareholder asks what they should be paying themselves, and the honest answer is a real piece of work that routinely gets absorbed inside a bookkeeping or tax engagement for nothing. TracePrep runs that as its own deliverable, a Reasonable Compensation Study, where every figure traces to a source and the Firm's own Reviewer controls the conclusion and signs it off. Finished workpapers stay firm-owned. It's in design-partner validation right now rather than general release, and it's built for CPA, EA, and accounting firms rather than pure bookkeeping practices, so if reasonable comp isn't work your firm performs, this one isn't for you. <a href="https://traceprep.com/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-07">traceprep.com</a></p><div><hr></div><h2>Operator annex</h2><p>What follows is the paper, and one warning that comes before all of it. I'm not a lawyer. Every template down here is a starting point for your own letter, not a form to sign. Your attorney or your professional-liability carrier reads it before a client ever does.</p><p>Plenty of places will hand you an engagement-letter template. What they don't hand you is the log that tells you which exclusion you're missing, the note you send when somebody crosses one, or a prompt that builds both off your own service list. That's what the rest of this is.</p><h3>The scope and exclusions section</h3><p>This is the section itself. It goes where your current services list is, or directly after it. Fill in your own brackets and cut anything that doesn't match how you work. Ours live in a separate letter per engagement type, so the bookkeeping exclusions and the tax exclusions never have to share a paragraph. A new service line gets the same treatment, and <a href="https://scalingclients.com/p/reasonable-compensation-study">the reasonable compensation study issue</a> walks through one.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">SCOPE

We will provide the following services for [Client] for the period beginning
[start date]: [your monthly services]. Books are current by the [Nth] of the
following month.

NOT INCLUDED

The following sit outside this engagement. Any of them can be added, and each
is estimated separately before any work begins:

- Any period before [start date], including cleanup of prior books
- Changes to your business structure, including a new entity, a new state, a
  new location, or a change of payroll provider or point-of-sale system
- Requests from third parties, including lenders, insurers, landlords,
  auditors, and other accountants
- Work involving your other staff or advisers, including training or
  supervising your bookkeeper
- Tax, entity, and compensation advice, including what a shareholder-employee
  should be paid
- [add your own]

WHAT WE RELY ON

We work from the records and information you provide. We do not audit or
independently verify them, and we are not responsible for errors arising from
incomplete or inaccurate information supplied to us.

IF SOMETHING OUTSIDE THIS SCOPE COMES UP

We will tell you what it is and what it costs before we begin. Nothing outside
this scope is performed, or billed, without your agreement first.

TERM

This engagement continues until either of us ends it in writing. If we have
not received what we need to begin within [90] days of signing, this
engagement lapses, and new work requires a new letter.

FEES

Fees for the services above are set out in [where your services and pricing
live]. Work outside this scope is estimated separately.</code></pre></div><p>Two things people get wrong adapting this. The exclusions have to name what your clients actually ask for, not a generic set copied out of somebody else's practice, so read your last quarter of email if you want the real ones. And the lapse period has to be a number you'll enforce, because a date you ignore is worse than no date. It's a term you've waived.</p><h3>Lines to pick from</h3><p>Fourteen of them. Take the ones matching what you genuinely get asked, change the wording until it sounds like you, and leave the rest.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Cleanup or correction of any period before [start date].

Rebuilding or re-categorizing prior-year books, whether or not we prepared them.

Sales tax registration, filing, and nexus review in any state.

Payroll processing, payroll tax filings, and setup with a new payroll provider.

1099 preparation and vendor W-9 collection.

Anything arising from a change in your entity type, ownership, or state of operation.

Lender, insurance, bonding, and landlord requests, including forms, letters, and document packages.

Responding to notices, examinations, or information requests from any taxing authority.

Training, supervising, or correcting the work of your staff or another bookkeeper.

Software migration, chart of accounts redesign, and connecting new systems.

Budgeting, forecasting, cash flow projections, and business plan support.

Tax planning, entity structure advice, and owner compensation decisions, including what a shareholder-employee should be paid.

Inventory counts, valuation, and costing.

Anything requiring attendance at your premises.</code></pre></div><h3>The note you send when it happens</h3><p>You'll send this more than anything else in here. Subject line first.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Quick one before I start: [what they asked for]</code></pre></div><p>Then the body.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

You asked about [thing]. That sits outside what we agreed in the engagement
letter, so I'd rather price it before I do it than after.

It's [$X], or roughly [X hours] at [rate] if you'd prefer it billed that way.
I can have it done by [date].

Say yes and I'll start [when]. Say no and nothing changes, we carry on as
normal.

[Your name]</code></pre></div><p>What makes it work is that it goes out before anything is done, and that it offers a real no. A note sent afterwards is a bill with an explanation attached, and people argue with those. Keep the money sentence plain, too. Adding a reason for the price invites a negotiation about the reason.</p><h3>The log</h3><p>One row every time you send that note. One row every time you don't. The second kind is the useful kind.</p><p>Seven columns, and what each one is actually for:</p><ul><li><p><strong>Client.</strong> Obvious, but sort on it later and you'll find one name accounts for most of the sheet.</p></li><li><p><strong>Date asked.</strong> Not the date you did it. The date they asked, which is the date you had a choice.</p></li><li><p><strong>What they asked for.</strong> Their words, short. "Look at last year's payroll" beats "prior period review."</p></li><li><p><strong>In or out.</strong> In scope or outside it, judged against the letter rather than against how you felt about the request.</p></li><li><p><strong>Priced at.</strong> What you'd have charged. Fill this in even when you didn't charge it, especially then.</p></li><li><p><strong>Answer.</strong> Yes, no, or blank because you never asked.</p></li><li><p><strong>Billed.</strong> Money that actually landed on an invoice.</p></li></ul><p>The header row itself, tab-separated so it drops straight into columns:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client&#9;Date asked&#9;What they asked for&#9;In or out&#9;Priced at&#9;Answer&#9;Billed</code></pre></div><p>The rows that matter are the ones marked out with a number in Priced at and nothing in Billed. Those are the ones you did anyway. Three months in, the empty Billed cells start to cluster, and whatever they cluster around is the exclusion missing from your letter.</p><h3>The reply that's already written</h3><p>Put the note into your email client as a saved reply, brackets and all. Every client has the feature under some name: canned responses, templates, snippets.</p><p>Then the ask lands. You open the template, fill in three brackets, and it's gone inside ninety seconds, before the part of you that hates awkwardness gets a vote. Ninety seconds is the entire trick. A note you have to compose from nothing is a note you'll write on Thursday, and by Thursday you've already done the work.</p><p>Add one line at the bottom of your saved copy reading LOG THIS in capitals. It's an ugly hack and it works. You delete it before sending, and deleting it is what reminds you to add the row.</p><p>No recurring reminder here, deliberately. A weekly prompt to review scope creep arrives long after the moment that mattered. This one fires at the moment.</p><h3>Two prompts (draft only)</h3><p>Both stop at a draft, and that matters more here than usual. An engagement letter is a contract, so what an AI writes you is a first draft for your attorney, never a document for a client. What comes back is clause text and a spreadsheet file, sitting on your screen. Everything past that point is you.</p><p><strong>Draft the out list off your own service menu.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a bookkeeping firm. Here is what my monthly service actually includes:
[paste your service list].

Here are the last ten things clients asked me for that weren't in that list:
[paste them].

Draft a "not included" section for my engagement letter. One line per
exclusion, in plain language a client will understand, with related items
grouped together. Base it on what I actually get asked for rather than a
generic template. Close with a short sentence saying anything on the list can
be added and is estimated separately before work begins.

Give me the draft as plain text so I can send it to my attorney. Do not write
indemnity, liability, or limitation-of-damages language. Do not edit any file.
Do not tell me the result is legally sufficient, because you can't know that.</code></pre></div><p><strong>Build the log.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Build me a spreadsheet with these columns: Client, Date asked, What they asked
for, In or out, Priced at, Answer, Billed.

Make "In or out" a dropdown with two options, in scope and out of scope. Add
conditional formatting that highlights any row marked out of scope where the
Billed column is empty.

Give me the file as a draft I can open. Do not connect to my accounting
system, my email, or any client data, and do not fill in any rows. I'll enter
my own numbers.</code></pre></div><p>Count the exclusions in your current letter. Zero is the common answer, and it's one afternoon away from not being zero. The revenue takes a quarter to show up, but the next time somebody asks you to just look at something, you'll have a sentence ready and a number to put on it.</p>]]></content:encoded></item><item><title><![CDATA[Saying No: Qualification and the Waitlist]]></title><description><![CDATA[A no you have to work up to is a no you won't make. Two lines, decided once, and three answers instead of a decision every time.]]></description><link>https://scalingclients.com/p/when-to-turn-down-a-client</link><guid isPermaLink="false">https://scalingclients.com/p/when-to-turn-down-a-client</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 01:14:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It comes in on a Thursday afternoon and you know by the second line.</p><p>Three entities, two years behind, and a note at the bottom asking whether it can all be caught up before the extension deadline in six weeks. Nothing about what happened to the last bookkeeper.</p><p>You've done this job. It's four months of your evenings and one client who is still unhappy in March.</p><p>You take it anyway.</p><p>Not because you were fooled. You had no floor to point at, so the answer got invented on the spot, and anything invented on the spot bends toward whoever is asking.</p><p>You can carry a certain number of clients well. Call that your seats. Nobody ever told you the number, so you find it by going past it, and every yes spends one.</p><p>A no you have to work up to is a no you won't make. It gets decided in a reply box, at the end of a day when you have nothing left.</p><p>So decide it once instead. Write the floor down, put it where a stranger reads it before they can reach you, and every inquiry after that gets sorted against it.</p><blockquote><p><strong>When to turn down a client: how do you decide?</strong></p><p>Ahead of time, and never in the reply itself. Write two lines and keep them. The first is the state of the books you'll start from: twelve months behind, or whatever number you have actually recovered from. The second is the one thing you refuse outright. Then check every inquiry against those two lines. Three answers cover almost everything. Take it, if the floor clears and a seat is open today. Queue it, if the floor clears and no seat is open, which means a written confirmation carrying no date. Route it, if the floor doesn't clear, which means naming a category or a firm that handles that work. A flat no with nowhere to go is the version that costs you the referral.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>A no you have to work up to is a no you won't make</strong> - the decision belongs in a written floor you built on a good day.</p></li><li><p><strong>Two lines is the whole floor</strong> - how far behind you'll start from, twelve months for a lot of firms, and the one thing no fee moves.</p></li><li><p><strong>Put it where a stranger reads it first</strong> - a rule that lives in your head gets overruled by the likeable person in front of you.</p></li><li><p><strong>Every inquiry gets one of three answers</strong> - take it, queue it, or route it, and the third one is what keeps the referral alive.</p></li><li><p><strong>A queue with no rule fills itself</strong> - whoever emailed most recently wins, which is rarely who you meant to help.</p></li><li><p><strong>Run the floor backwards too</strong> - applied only to new inquiries, it leaves you permanently full of the clients you took before you had one.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe and the annex comes with it.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe and the annex comes with it.</span></a></p><h2>First, the honest caveat</h2><p>A floor is what you install when inquiries outrun seats. If three people a month reach out and you have room for all three, writing down what you refuse will only make you smaller.</p><p>You didn't get demand by saying no. You got it by being findable, by publishing what things cost, and by asking the people who already like you. The floor comes after. Below capacity it still earns its keep, because it sends people somewhere useful on a day you can't help them.</p><h2>When to turn down a client: two lines, decided once</h2><p>The first line is the state of the books you'll start from, written as a number. Six months behind, twelve, or whatever you have actually recovered from without losing a season of your life. Below that number the answer is no regardless of the fee, because the fee has never covered it and you know that by now. Issue four calls this cleanup tolerance and counts it as one of the four things that set your rate, so the line you draw here shows up in your pricing whether you write it down or not.</p><p>The second line is the thing you won't do at any fee. Everybody has one. Cash businesses with no records. Clients who want a number moved. The industry that ate a year of your life in 2022.</p><p>Nobody forgets their niche at four in the afternoon. They forget their limit. What work you want and who you want it from is what issue two built, and it does a different job. <a href="https://scalingclients.com/p/bookkeeping-niches">Sorting that into a lane you can name</a> is issue five. Write these two plainly enough that somebody else in your firm could apply them without asking you.</p><h2>Where a stranger reads it first</h2><p>A floor on a page holds up when somebody likeable is sitting across from you. In your head it's a preference, and preferences bend.</p><p>The About page at SDO CPA, my firm, carries this before a prospect can reach anybody: "We're at capacity, and keeping it that way protects the quality our clients count on. New clients join a short waitlist, and we open spots as relationships free up." Higher up the same page, a section names the work the firm doesn't do at all, and a two-way block lists what we ask of a client alongside what a client can expect back.</p><p>None of that is clever. It's written down, in public, so it holds on the days I'd rather be agreeable.</p><p>You don't need a new page for it. Issue three already has <a href="https://scalingclients.com/p/how-to-sell-accounting-services">six versions of a short "what I don't do" block</a>, and issue four has the pricing block that sits above an intake form. What neither carries is the line underneath, the one that tells somebody who fails your floor what to do next. That one's in the annex, and it's three sentences.</p><h2>One bar, three outcomes</h2><p>Take it, queue it, or route it. Every inquiry is one of those, and two of the three are emails you'll be writing while you're busy, so write them once now.</p><p>Take it still needs a rule. The seat has to be open today.</p><p>Queue it is for the inquiry that clears your floor when you have no room. A real queue owes three things and most have none. No promised date, because you don't have one and a guess burns the trust you just earned. An honest reason to be on the list, usually that waiting for the right firm beats starting with the wrong one. And a written rule for who gets the call when a seat opens, decided now, while nobody is waiting. The annex has that rule written into both the reply and the checklist. Skip it and you'll end up calling whoever emailed most recently.</p><p>Route it is the one people skip. Somebody who fails your floor still has a problem and still remembers who helped with it. Send them somewhere real. Issue two has <a href="https://scalingclients.com/p/accountant-referral-program">the who-covers-what list</a> built for exactly this. What you are not doing is opening their books to tell them what's wrong. That's the work, and giving it away teaches people to shop it.</p><p>One part of this never becomes a rule. Somebody clears the floor on paper and something in the way they talk about their last bookkeeper tells you this is going to be a year. No table catches that. Issue three is about that call.</p><h2>Run it backwards over the seats you already filled</h2><p>A floor applied only to new inquiries leaves you permanently full of the clients you accepted before you had one. Say no to eleven strangers this quarter and nothing changes, because none of them was getting a seat anyway. The expensive no is the one you owe somebody already sitting in one.</p><p>So run your two lines over the current list. Some clients you'd take again in a second. Some cleared a floor that didn't exist yet, and one of those is holding the seat your queue is waiting on. Issue four has <a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">the worksheet and its raise, hold, or release column</a>, and the column is what does the work, because "talk to them about it sometime" doesn't count as an answer. The release note itself is in the annex. <a href="https://scalingclients.com/p/busy-but-not-profitable">Which clients actually earn the seat they're holding</a> is a separate pass over the same list. I've sent that note to profitable clients, because a relationship that isn't working doesn't start working because the invoice clears.</p><h2>What a no is worth</h2><p>Turning work away hasn't cost us demand as far as I can tell. It concentrated it.</p><p>I have no clean before-and-after to show you, so here's what I can point at instead. Other firm owners came into the conversation when I wrote publicly that we were full, comparing notes on fit and available capacity. Those are the people who send work, and a firm whose edges are public is a firm they can send it to without gambling their own name on it.</p><p>The mechanical half needs no evidence. Every inquiry that reads your floor and stops is a meeting that didn't happen and weeks of attention you didn't spend on somebody who was always going to find a cheaper firm.</p><p>And the cost is real. A no is a fee you don't collect this month, and if you're under capacity that fee wins the argument.</p><p><strong>Do this before Friday:</strong> write your two lines, the books floor and the refusal, one sentence each. Put them on the page above your intake form, with the routing line underneath. Then write one decline reply and one queue reply and save them wherever you send mail from, so the next inquiry gets answered by something you decided on a good day.</p><p>What's the client you should have said no to? Send me the sentence you read and skipped past, the one you can still quote.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Say no to this one too, if you want.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Say no to this one too, if you want.</span></a></p><div><hr></div><h2>Operator annex</h2><p>Your form is already asking the right questions. It just isn't doing anything with the answers.</p><h3>The routing table</h3><p>Fill in your own numbers, then keep this wherever you triage:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Route it if any of these is true:
- more than [12] months behind
- more than [3] entities
- the work is off your lane
- they left the last firm on price alone
- they need it finished inside [6] weeks

Queue it if none are true and no seat is open.
Take it if none are true and the seat is open today.</code></pre></div><p>Read it top to bottom and stop at the first route.</p><h3>The routing line for your page</h3><p>This sits under whatever "what I don't do" block you already have, above the intake form, so somebody who fails the floor leaves with a direction:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">If your books are more than [12] months behind, that's a catch-up project and it isn't what we do. Search for a firm that lists catch-up as a service, not as something they'll squeeze in. They'll price it properly and they'll be faster at it than we would be.</code></pre></div><p>Name a category and not one firm, unless you have a standing arrangement, because a single name goes stale the moment that firm gets busy.</p><h3>Three replies you already owe</h3><p>Three situations cover nearly every no you'll write. The work is wrong, the timing is wrong, or it's the thing on your second line.</p><p>The wrong work, which you'll send most often and should take ninety seconds:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Not our kind of work, so I won't waste your time pretending otherwise.

For [type of work], start with [category]. Tell them what you told me and they'll know quickly whether it's theirs.</code></pre></div><p>The wrong timing:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

I read through what you sent. At [X] months behind across [Y] entities, this is a cleanup project before it's a bookkeeping engagement, and cleanup at that size isn't work we take on.

Two things that do work. A firm that runs cleanup as its main line will estimate this properly. Or come back to us once you're current and we'll talk about the ongoing work then.

Either way I'd move on it before [deadline]. This gets more expensive every month it sits.

[Your name]</code></pre></div><p>The thing on your second line, where the pointer goes first because the refusal is what they'll remember:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

Start with [category or firm name]. They handle this regularly and they'll be straight with you about what it costs.

I'm telling you that first because my answer is no, and I don't want the no to be the only thing you leave with.

[One sentence naming the thing you don't do.] That's a line I drew years ago, well before you wrote to me, and it isn't about your business or your budget. There's no version of this where we're the right firm for you, and I'd rather you hear it today than after a month of back and forth.

Genuinely good luck with it.

[Your name]</code></pre></div><p>The sentence that ruins all three is "happy to hop on a quick call and see if we can make it work." It turns a decided answer back into an open one, and it tells the reader your floor is negotiable.</p><h3>The queue reply that doesn't promise a date</h3><p>Short on purpose. A long waitlist email is an apology, and an apology invites a negotiation.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

You're on the list, and it's a real list rather than a polite filing.

What that means: we're full, and a spot opens when a client relationship ends, which isn't something anyone can schedule. So I'm not going to give you a date. When something opens I work the list by how long a name has been on it and whether the opening matches the work you need.

If you find someone good in the meantime, take them. No hard feelings, and no awkwardness if you come back later.

[Your name]</code></pre></div><p>That email exists so somebody can decide whether to wait, on real information. A date you'll miss removes the information, and so does offering to look at their last statement, which is a free diagnostic no matter how friendly the sentence around it is. On my own list the wait has run to months, and right now the list is only getting longer, which is the whole reason nobody gets a date.</p><h3>The release note</h3><p>One thing before the template. Your engagement letter probably has its own termination clause with its own notice period, and that clause wins over anything down here. I'm not a lawyer. Read your own terms first, and let your attorney or your professional-liability carrier see this before a client does.</p><p>Send it after you've run the floor backwards, on a day when the decision would survive a phone call. Sixty days is what I use, and it's usually enough for somebody to find a firm and get onboarded before anything is due:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

I'm writing to give you notice that we'll be finishing up as your bookkeeper on [date, at least 60 days out].

This isn't about anything you did. The work your business needs has moved away from what we're set up to do well, and continuing would mean giving you a version of us that isn't very good.

Here's how I'd like to land it. Everything through [month] gets closed and reconciled the way it always is. You'll get the full file, the reconciliations, and a written handover note your next bookkeeper can work from. If you want, I'll answer their questions about the file for the first thirty days. Questions about the file, not new work.

For who to go to, [category or firm name] would be a reasonable place to start.

[Your name]</code></pre></div><p>It must not re-litigate anything that went wrong, because that turns a notice into an argument and the argument doesn't change the date. It must not offer to fix the underlying problem on the way out. And it must not leave the handover vague, which mostly means naming the date the last close lands and saying what's in the file.</p><h3>When a seat opens</h3><p>Set this to fire the day a client relationship ends, not on a date you picked in advance. Paste it as the body of the reminder:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">A seat opened.

1. Open the list. Sort by how long each name has been on it.
2. Cross off anyone whose work doesn't match the seat that opened.
3. The top remaining name gets the email today, not this week.
4. If nobody on the list fits, the seat goes to the next inquiry that clears the floor. Write that down now so you don't fill it with the first thing that arrives.
5. Update the availability line on your page.</code></pre></div><p>The other check has no date on it at all. It fires on a count. Tick it off yourself every twentieth inquiry, and put this in it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Twenty inquiries since the last check.

1. Pull the last twenty out of your form's submission list.
2. Count how many you overrode the floor for.
3. Zero or one means the floor is holding.
4. Two or three means you're negotiating with it. Read those overrides and decide whether the number is wrong or you are.
5. Four or more means the number is wrong. Move it.</code></pre></div><p>Nothing in that list asks you to try harder. It asks you for a number.</p><h3>The prompt (review before you apply anything)</h3><p>A model can write you a rule. Whether you'd actually enforce one on a bad Thursday is not something it can know, and that's the part that decides whether the rule is real. So this drafts, and you pick which numbers are yours.</p><p>The routing rules, so you're not writing six thresholds from a blank page:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a bookkeeping firm and I'm writing client-acceptance rules.

My floor is: [months of books behind I will start from], [the work I won't do at any fee], [the deadline pressure I can't absorb].

Draft two things.

One: a routing table mapping the questions my intake form already asks to one of three outcomes, take it, queue it, or route it. Use my thresholds above. Where a threshold is missing, leave it blank and tell me what you'd need from me to fill it.

Two: four short emails. A decline for work that's the wrong kind, a decline for a job that's too far behind, a decline for the thing I won't do at any fee, and a queue confirmation that contains no date of any kind. Plain language, no apology in any of them.

Rules for you. Do not offer a free consultation, a free assessment, or a free analysis of anyone's books in any of the emails. Do not promise a date in the queue confirmation. Do not connect to anything, do not change my form or my site, and do not send anything to anyone. Show me the drafts and wait.</code></pre></div><p>Issue four's annex has a prompt that writes a pricing block as HTML for your site. Point it at the routing line above and it does the same job.</p><p>An unwritten floor defaults to yes. Every time, without you noticing it decided anything.</p>]]></content:encoded></item><item><title><![CDATA[Pick a Lane: Niching Without Starving]]></title><description><![CDATA[A niche is a referral trigger, not a prison. The four axes a lane runs on, and how to find yours in twenty minutes.]]></description><link>https://scalingclients.com/p/bookkeeping-niches</link><guid isPermaLink="false">https://scalingclients.com/p/bookkeeping-niches</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Wed, 02 Sep 2026 01:14:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Firms kept telling me they had room. I still couldn't tell which one to send a business to.</p><p>Their websites all said the same things. Full service. Small business specialists. Bookkeeping, payroll, tax, advisory. A list of industries long enough that it's the same as listing none.</p><p>That isn't a knock on any of them. A website gets written to reassure a buyer, and I wasn't a buyer. I was sorting, and nothing on the page let me put a name in one pile rather than the other. Hundreds have come to me about overflow work by now, and most of them could state their fit in one sentence. The sentence was generic almost every time.</p><p><a href="https://sdocpa.com/about?utm_source=scalingclients&amp;utm_content=sc-05">SDO CPA</a> is my firm. Full since June, waitlist the whole time. That's why I was reading those websites in the first place.</p><p>A niche is a referral trigger, not a prison.</p><p>Everybody hears the word and runs the same arithmetic. Narrow what you take, take less, earn less. That's the version that keeps general practices general, and it counts the wrong thing. It counts the work you're allowed to accept, which a lane never touches. What a lane changes is the work that finds you without you going after it.</p><blockquote><p><strong>What are bookkeeping niches, and how do you pick one?</strong></p><p>A niche is a description other people use to route work to you: an industry, a trigger event, the shape of the work, or what you refuse. It isn't a ranked list of industries, which is what most advice hands you and the least useful part of the answer. If you already have clients, the method starts with the list you've got rather than somebody's top ten: the work that repeats, the clients who arrived without you asking, the job that stopped being hard by the third time. Industry is the weakest of the four, because "restaurants" is a category, and a category doesn't tell a referrer whether the business in front of them is yours. You keep taking work outside the lane. You just stop advertising for it.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>A lane is what other people say about you</strong> - the line somebody uses when you're not in the room, and you go on taking off-lane work anyway.</p></li><li><p><strong>Industry is the weakest of the four axes</strong> - "restaurants" is a category, "three or more locations" is something a referrer can actually check.</p></li><li><p><strong>The evidence is already in your client list</strong> - three columns beside the names you have, not a market study.</p></li><li><p><strong>A full firm is looking for somewhere to send work</strong> - and it sorts on your answers, because your website was written for a buyer and it can't help.</p></li><li><p><strong>If nothing sorts cleanly, that's an answer too</strong> - pick the lane you want and start declining toward it, rather than waiting to discover one.</p></li><li><p><strong>The fear points the wrong way</strong> - an unlabeled firm gets only the work it went and fetched itself.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Twelve issues, one system each. This is five.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Twelve issues, one system each. This is five.</span></a></p><h2>The arithmetic everyone runs, and why it's backwards</h2><p>Cut your market by ninety percent and you need every client you can get. It's the obvious read and I ran it myself for years.</p><p>Now think about who's holding work they need to place. A firm at capacity. An attorney whose client just asked her something outside her scope, and who isn't going to look it up for him. None of them are shopping. They're sorting, and they need one line about you to sort on. Give them nothing and they don't send you a bad fit. They send you nothing, and you never find out it happened.</p><p>That's the real cost of staying general, and it's silent, which is why it never shows up in the arithmetic.</p><p>The second version of the fear is the better one. It goes: one industry takes a hit and I go down with it. Restaurants in 2020. That's the same mechanism running the other way. The firms and attorneys and bankers who can finally route to you are a spread of sources. And a general practice usually has a more concentrated pipeline than it thinks, because nearly everything came from the same two or three people who happen to know you.</p><p>And you're not signing anything. Nothing about a lane stops you taking a job next Tuesday.</p><h2>Bookkeeping niches run on four things, and industry is the weakest</h2><p>Pick any firm you'd send work to and ask what sentence you'd use to hand somebody over. There are only four kinds.</p><p><strong>Industry.</strong> "She does restaurants." Everybody reaches for this one and it's the weakest, because a category isn't a check. The person about to refer you has one specific business in front of them, and "restaurants" covers a food truck and a group with three hundred employees. <a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">The pricing issue</a> put it in a line: bookkeeping for restaurant groups running three or more locations competes with almost nobody. Look at which half of that is doing the work. It's "three or more locations," which is something the person holding the referral can actually check.</p><p><strong>The trigger.</strong> "Call her when the bookkeeper quits mid-year." The strongest of the four, and almost nobody uses it, because it's a moment rather than a market. Nobody thinks "ah, e-commerce." They think "this guy just got a letter from the IRS."</p><p><strong>The shape of the work.</strong> Cleanup or ongoing. Monthly or once a year. Books nobody has opened since 2020. Seasonal and compliance-only practices live here too, and no list of industries has a slot for them, though "she doesn't do monthly, she does the return and she does it properly" routes somebody perfectly well.</p><p><strong>What you refuse.</strong> "Don't send him anyone who wants it finished in a week." This is the second half of issue two's referable sentence, and it does more work here than it did there. A sender disqualifies before they select.</p><p>Three of those four have nothing to do with industry. A list of industries can only ever tell you one of them. The two kinds of work I've never been able to place in-house are complex international work and complex large-corporation work, and neither one is an industry.</p><h2>Where to look for yours</h2><p>I can't tell you what your lane is. I can tell you what a sender sees, because I've spent a summer on that end of it. I see a firm's answers. I never see anything usable on its website.</p><p>So the read happens on your own book. If you built the margin worksheet from the pricing issue, the rows are there and three columns finish it. If you didn't, it's your client list with three questions beside each name.</p><p><strong>How did this one arrive?</strong> Referral, search, an old colleague, no idea. "No idea" gets written down as unknown rather than guessed, because a guessed source sends you confidently down a lane that was never there.</p><p><strong>Would you take five more like this?</strong> Not "was it profitable." Would you take five more. Different question, and the gap between the two is where a lane hides.</p><p><strong>When did it stop being hard?</strong> The third client of a type is usually where you stop looking things up. Name the point a kind of work got easy and you've found capability, which is the only lane that survives a busy quarter.</p><p>Then count how many rows share a pattern, sort on that count, and read the top two. Candidate lane and backup, in about twenty minutes.</p><p>Under twenty clients, use the whole list. If you haven't personally seen an inbound inquiry in two years, do this with whoever handles intake and delivery: they're holding the answers while you're holding the calendar.</p><p>If nothing sorts, that's information rather than a verdict. There's no accidental lane to name, so you pick one instead. That's harder, because you're working forward from a decision rather than backward from evidence. Choose the work you'd take five more of and start declining toward it. Not all at once. The next three inquiries that aren't it get routed elsewhere, and inside a year the list sorts itself.</p><h2>The one place it has to be readable</h2><p>Three surfaces carry a lane and you've got homework on two. Your site has to name it or nobody finds you by it, which <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">the first issue</a> covers end to end. The sentence you hand a referrer is <a href="https://scalingclients.com/p/accountant-referral-program">the referable sentence</a> from issue two.</p><p>Add one question to your intake form: what made you start looking for a bookkeeper right now? Free text, one line, not a dropdown. A dropdown only gives back the options you already believed in.</p><p>Then leave it alone. Every inquiry for the next ninety days tags itself. At the end of the quarter you read the responses in one pass, and the trigger that keeps repeating is your lane. It usually isn't the one you'd have guessed, because your memory keeps your favorite clients and the form keeps all of them.</p><p>No intake form yet? Plenty of good firms don't have one. The same question goes in the reply you already send by hand.</p><p><strong>Do this before Friday:</strong> add the trigger question to your intake form, or to the reply you send by hand, and do it first because it's the only piece that keeps working after you close this. Then put three columns next to your client list: how they arrived, would you take five more, when it stopped being hard. Sort by how many rows share a pattern and read the top two. Then write your fit card from the annex and send it to one firm that's already told you it's full. <a href="https://scalingclients.com/p/when-to-turn-down-a-client">Turning away the ones who don't fit</a> is the issue after this one.</p><p>So: what's the lane you already have and have never written down? Or the one you picked and now quietly resent? Either one, send it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe. I write these for people who own the firm.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe. I write these for people who own the firm.</span></a></p><div><hr></div><h2>Operator annex</h2><p>The sheet is the only part of this that has to exist before the rest works.</p><h3>The three columns that turn a client list into a lane</h3><p>Three headers to the right of the margin worksheet, plus the two that do the sorting. Starting from nothing instead? Paste this as row 1 of a blank sheet and split it into columns on the comma:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client, How they arrived, Take five more?, When it stopped being hard, Pattern, Count</code></pre></div><p><strong>Pattern</strong> is the one-line description that covers this client and could cover others. "E-commerce, quarter behind on reconciliations." "First-hire service business." "Multi-entity, two to four companies." Write it in the same words every time it repeats. That's the whole trick and it's where people lose the exercise, because "e-commerce cleanup" and "ecomm catch-up" are the same pattern to you and two different patterns to a spreadsheet.</p><p>Don't type <strong>Count</strong> in. It's a formula. Put this in F2 and drag it down:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">=COUNTIF($E$2:$E$200,E2)</code></pre></div><p>Then sort the sheet descending on Count. The top two patterns are your candidate lane and your backup. Read those before anything else below.</p><p>Two rules for filling it honestly. An arrival source you don't know gets written as unknown, never as your best recollection, because a guess produces a confident wrong answer and a blank produces an honest one. And the five-more call gets made fast. If you catch yourself building a case for a client, the answer is no.</p><h3>The fit card</h3><p><a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">The first issue</a> gave you a block written to be understood, by you and by a prospect reading your site.</p><p>This one is written to be sorted. Same raw material, different reader. It goes to somebody holding work they can't take, who has about ten seconds and four questions, and those four are the ones I ask before I send anybody anywhere. Paste it into an email, or put it on a page and send the link:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">What I want: [work type, plus the trigger or shape that identifies it]
Who fits: [size band and structure, in numbers where you have them]
How rough I'll take it: [your ceiling, stated as a limit, not a feeling]
What I don't take: [the two or three things, plainly]</code></pre></div><p>Filled:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">What I want: cleanup and catch-up, usually a business a quarter or
more behind, usually after a bookkeeper left mid-year.

Who fits: 5 to 40 employees, one entity or a simple holding
structure, payroll already running somewhere.

How rough I'll take it: up to about two years behind, single state.
Past that I'll look, and I'll say no most of the time.

What I don't take: businesses under a year old, anyone who needs it
finished inside three weeks, cash-basis retail.</code></pre></div><p>The ceiling is the field people soften, and softening it costs them the referral. "We're flexible" gives a sender nothing. A ceiling is the field they disqualify on, and a firm with no ceiling anywhere reads as a firm that hasn't been burned yet.</p><p>If your work is seasonal or compliance-only, the card still works and the ceiling changes meaning. It becomes how deep into the season you'll still take an engagement.</p><p>Three places it goes: an email to any firm that has told you it's full, a short page on your site you can link to, and the answer you give when another professional asks what you do.</p><h3>Three ways to say no without closing the door</h3><p>Off-lane work still arrives, and it should. What you do with it is the whole difference between a lane and a prison.</p><p>Three versions, different lengths, because a stranger's inquiry and your best client's brother are not the same conversation.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">This isn't the kind of work I'm set up for, but [name] at [firm] is,
and I'll introduce you if that's useful.</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I'll be straight with you. This sits outside what I do well. I could
take it and you'd get a competent job, but you'd get a better one
from somebody who does this every week. Want me to point you at two
of them? No obligation either way, and if they're both booked, come
back to me.</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Not mine. Try [name].</code></pre></div><p>The short one only works where there's already a relationship. Outside that, use the first.</p><h3>The question that answers this for you in ninety days</h3><p>One field. Free text. On the intake form, or in the reply you send when somebody emails you cold:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">What made you start looking for a bookkeeper right now?</code></pre></div><p>That's it. Free text, because the useful answer is the one you didn't think to list.</p><p>If the form has room, add a second:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">How did you hear about us?</code></pre></div><p>Ninety days of that and you can stop guessing. Open the responses, read them in one pass, and tally the triggers rather than the industries. What you're after is the moment that repeats, because a moment is what a referrer notices and an industry isn't.</p><p>Two things to expect. The trigger that comes out on top usually isn't the one you'd have named. And a chunk of the answers will be useless. Fine. You need the shape of the pile, not every row in it.</p><p>No form yet? The same two questions go under your signature in the reply you send by hand. One folder, read it when the quarter ends. My own intake has the how-did-you-hear dropdown and a free text box but not the trigger question, so this is a change I'm making too.</p><h3>Two prompts (review before you apply anything)</h3><p>These prompts use a <strong>synthetic practice roster</strong>: made-up businesses and made-up facts, with no connection to a real engagement. Replacing names is not a safe harbor. Before using real-world information, assess your own data obligations and whether the disclosure or use is permitted. <a href="https://scalingclients.com/p/ai-for-bookkeepers">What else leaves the building, including from the tools you already pay for,</a> is its own issue now. Neither prompt writes anything anywhere, and nothing either one hands back is settled until you've put it next to the sheet.</p><p><strong>The twenty-minute sort, for when the list is too long to eyeball.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I run a bookkeeping firm. Below is a synthetic practice roster. Every
business and fact is made up. Do not write to any file and do not
connect to any system. Read it and hand the answer back to me here.

Each row is: practice row, industry, rough size, fee band, how they
arrived, would I take five more (yes/no), when the work stopped
being hard.

Northside trades, home services, 8 to 15 people, $750 to $1,000,
referral, yes, after the third month
Clearwater studios, creative services, 3 to 8 people, $1,000 to $1,500,
search, no, never
Maple service co., field services, 15 to 25 people, $1,500 to $2,000,
old colleague, yes, after the second month

1. Group the rows into clusters. Cluster on what would let a
   stranger route a new business into one group rather than another:
   the trigger that sent them looking, the shape of the work, the
   size band. Do not cluster on industry alone.
2. Rank the clusters by how many rows they hold, then by how many of
   those rows are marked yes.
3. For each of the top three, list the row letters it contains, and
   write the one sentence a referring firm would use to send me
   somebody in that cluster.
4. Tell me which clusters are too small to mean anything yet, and
   say so plainly rather than padding them out.

Do not give me a table of my services. I'm not asking what I do. I'm
asking what pattern my clients fall into.</code></pre></div><p><strong>The wording, for when you know the lane and can't say it.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">This is a synthetic practice roster. The businesses, size bands, and
structure are all made up.

Here are four answers about my firm, written badly:

What I want: [rough version]
Who fits: [rough version]
How rough I'll take it: [rough version]
What I don't take: [rough version]

Rewrite each as a single line another firm's owner could read in ten
seconds and use to decide whether to send me one specific business.
Keep my numbers. Do not add any I didn't give you.

Then draft a short page for my site with the same four lines plus one
sentence on what happens after somebody sends a name. Plain, no
salesmanship, and no offer of a free consultation or a free look at
anyone's books.

Show me the draft. Do not publish it and do not change anything on
my site. Tell me which file you would have changed.</code></pre></div><p>A vague fit card fails quietly. Nobody writes back to say it was vague; they just stop sending. If a firm you sent one to hasn't passed you a name in a quarter, the card is the first thing to suspect.</p>]]></content:encoded></item><item><title><![CDATA[What to Charge for Bookkeeping (and Why Hourly Keeps You Stuck)]]></title><description><![CDATA[Your price is a filter before it's a number. Publish a range, package the outcome, and reprice on a date.]]></description><link>https://scalingclients.com/p/how-much-do-bookkeepers-charge</link><guid isPermaLink="false">https://scalingclients.com/p/how-much-do-bookkeepers-charge</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Mon, 24 Aug 2026 20:44:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The bank feed had 400 uncategorized transactions in it on Monday and none on Tuesday, and the whole thing took me about an hour.</p><p>Then I sat with the invoice open, wondering whether an hour was really worth what I was about to type in.</p><p>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.</p><p>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.</p><p>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.</p><p>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.</p><p>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.</p><p>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.</p><blockquote><p><strong>How much do bookkeepers charge?</strong></p><p>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.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Your price picks your clients</strong> - a low one buys you a different client list, and different is the part people miss.</p></li><li><p><strong>Hourly punishes you for getting faster</strong> - the 400-transaction cleanup that ate an afternoon in year one takes an hour now, and hourly bills you for the hour.</p></li><li><p><strong>Publish a range</strong> - a hidden price reads as something being hidden, and a published range turns away the wrong prospects before they cost you a single meeting.</p></li><li><p><strong>Package the outcome, scope the work</strong> - sell "books current by the 15th, clean handoff at tax time" and write down what sits outside it.</p></li><li><p><strong>Say the scope sentence in week one</strong> - one line while everyone's happy is worth more than a hard conversation in month four.</p></li><li><p><strong>Reprice on a date you already own</strong> - one month a year, every client, decided in advance so you're not choosing a good moment.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe free. This is issue four of twelve.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe free. This is issue four of twelve.</span></a></p><h2>Publish the range</h2><p>Issue one gave the range one sentence inside <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">the system that fills a firm</a> and moved on. It never said how you land on the number you're publishing.</p><p>My own firm, <a href="https://sdocpa.com/about?utm_source=scalingclients&amp;utm_content=sc-04">SDO CPA</a>, has had a waitlist since June and is full. We <a href="https://sdocpa.com/pricing?utm_source=scalingclients&amp;utm_content=sc-04">publish our pricing</a> 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.</p><p>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.</p><p>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.</p><p>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.</p><h2>What business owners see when they compare on price</h2><p>Some of you reading this hire a bookkeeper rather than being one. Two minutes for you, then back to it.</p><p>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.</p><p>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.</p><p>That's most of what your price communicates. Not the digits.</p><h2>How much do bookkeepers charge? Four things set it</h2><p>Skip the surveys. Four things move a rate, and you control all four of them.</p><p><strong>Specialization.</strong> "Bookkeeping" competes with everyone who has ever opened a spreadsheet. Bookkeeping for restaurant groups running three or more locations competes with almost nobody, and <a href="https://scalingclients.com/p/bookkeeping-niches">which half of that sentence a referrer can actually route on</a> is its own issue.</p><p><strong>Response speed.</strong> Answering inside a day instead of inside a week is a real difference in the product, and it gets priced like one.</p><p><strong>Cleanup tolerance.</strong> 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.</p><p><strong>Deadline risk.</strong> If a late filing is your problem instead of the client's, you're carrying something heavy, and carrying it is worth money.</p><p>Write down where you sit on all four.</p><h2>Price the outcome, scope the work</h2><p>The pattern, in four parts.</p><p><strong>Package what the client ends up with.</strong> 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.</p><p><strong>Give an upfront estimate against a defined scope.</strong> Open-ended hourly is the thing you're replacing. An estimate, with what's inside it written down. <a href="https://scalingclients.com/p/how-to-sell-accounting-services">Last week's issue</a> was about saying the number on a call. This one is about what it covers.</p><p><strong>Say the scope sentence in week one.</strong> 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.</p><p><strong>Put the reprice on a calendar.</strong> 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.</p><h2>The raise</h2><p>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.</p><p>Skip your rising costs and skip inflation. They don't care, and over-explaining reads as asking permission for something you've already decided.</p><p>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.</p><p>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 <a href="https://scalingclients.com/p/accountant-referral-program">the referral loop</a> 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.</p><p><strong>Do this before Friday:</strong> 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.</p><p>What's your worst scope-creep story? The quick question that quietly turned into a second job. Send it to me. <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">The engagement-letter issue</a> is out now, and I'd still rather build the next round out of yours than mine.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Free. I don't send anything else.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Free. I don't send anything else.</span></a></p><div><hr></div><h2>Operator annex</h2><p>Six things below, in the order I'd build them.</p><h3>The range block for your site</h3><p>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.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">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.</code></pre></div><p>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.</p><h3>The client margin worksheet</h3><p>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.</p><p>Open a blank sheet and paste this as row 1, then split it into columns on the comma:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Client, Monthly fee, Hours per month, Effective rate, Last price change, Scope creep, Action</code></pre></div><p>Effective rate is a formula, not something you type. In D2, and filled down the column:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">=B2/C2</code></pre></div><p>Then 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.</p><p>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.</p><p>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.</p><h3>The raise email</h3><p>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:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Your monthly fee, starting [Month]</code></pre></div><p>Then the body:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[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]</code></pre></div><p>The two improvements have to be real and they have to be specific. "Better service" is worse than saying nothing. "Your P&amp;L lands by the 10th instead of the 15th" is a thing somebody can picture.</p><h3>Three ways to say the scope sentence</h3><p>Three versions of one promise, in three different voices.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">If the scope changes, you'll hear from me before the work happens, and we'll agree the number then.</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">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.</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Nothing outside what we agreed happens on its own. It comes to you first, and you decide before I start.</code></pre></div><p>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.</p><h3>The trigger you set once</h3><p>One repeating event a year, plus one you set the day a client signs.</p><p>The yearly one is ninety minutes, repeating, with a reminder a week ahead. Paste this as the event description:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">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.</code></pre></div><p>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.</p><p>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.</p><h3>Two prompts (review before you apply anything)</h3><p>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.</p><p>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:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">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.</code></pre></div><p>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.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">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.</code></pre></div><p>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.</p>]]></content:encoded></item><item><title><![CDATA[You Already Know How to Sell]]></title><description><![CDATA[The sequence you already run every March, pointed at a prospect instead of a client.]]></description><link>https://scalingclients.com/p/how-to-sell-accounting-services</link><guid isPermaLink="false">https://scalingclients.com/p/how-to-sell-accounting-services</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Mon, 24 Aug 2026 18:38:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"So what would this cost?"</p><p>You're twelve minutes into a first call and it's going fine. The business is a mess in the ordinary way, and you already know two things you'd fix in the first month. Then that question lands and something in your chest goes sideways, because you heard it as an accusation instead of a buying signal.</p><p>So one of three things happens. You go quiet and say you'd need to look at a few things first. You name a number lower than the one you meant, before anybody pushed on it. Or you say the sentence that has killed more work than any price ever has: let me send you some information.</p><p>Then nothing. And two weeks later you put it down to price, because price is the only explanation anybody ever hands you.</p><p>Here's the part that should bug you. Every March you do something harder than that call, and you do it well.</p><p>Somebody sits across from you convinced they owe money they don't have, scared and a little embarrassed about the shoebox. You take the frightening thing and put it in words they can hold. You tell them what happens next and roughly when. They leave calmer than they came in, and they tell two people about you.</p><p>Most people I know in this profession are very good at explaining something difficult to a nervous person. That is selling.</p><p>The gap isn't nerve and it isn't a personality you were supposed to be born with. You run that sequence beautifully with a client and you don't run it at all with a prospect, because nobody ever wrote it down for you. So on a sales call you improvise. Improvising under pressure looks like going quiet, or like discounting.</p><p>My own firm, <a href="https://sdocpa.com/about">SDO CPA</a>, has been full since June and runs a waitlist, so I say no for a living now. I've also spent the last few weeks asking other firms what work they actually want, which is this same conversation pointed the other way, and most of them couldn't answer. When I laid out <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">the system that fills a firm</a> a few weeks back, and then <a href="https://scalingclients.com/p/accountant-referral-program">the referral loop</a> last week, both of them ended in the same place. Demand shows up. Then somebody has to have the conversation.</p><p>One thing to square with the first issue. I told you to publish your ranges on an intake form and stop taking prospect calls, and that's still what I'd do at my own firm. The conversation just moves later. Somebody who has read your ranges and filled in your form still asks what it'll cost, because what they're really asking is whether you understand their situation well enough for the number to mean anything.</p><blockquote><p><strong>How do you answer "how much do you charge"?</strong></p><p>You answer it, in a range, on the call. Silence reads as hiding something and a fast discount reads as an opening bid. But answer it second. Before the number you want three things: what's going on in the business right now, what it costs them if nothing changes, and who signs. With those, a range is a diagnosis and it lands like one. Without them, any number is a guess you'll defend badly. If you genuinely can't range it on the first call, say exactly what you need in order to and when they'll have it. Never trade the number for a free look at the books.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>You already run this sequence every March</strong> - explaining something hard to a nervous person, in order, is the skill. You just don't run it on prospects.</p></li><li><p><strong>Qualify before you present anything</strong> - the same three questions every time, before any number and any scope.</p></li><li><p><strong>A diagnosis beats a menu</strong> - "here's what I'd do first, and why that first" asks them to trust you. A service list asks them to be the expert, which is why they called you.</p></li><li><p><strong>The ask is one next step with a date on it</strong> - most warm work goes cold on "let me know what you think."</p></li><li><p><strong>Follow up twice, spaced, useful both times</strong> - then stop. Silence after the second one is an answer, and it's cheaper to get than to wonder about.</p></li><li><p><strong>They're buying certainty about you</strong> - what you refuse to do proves that faster than a list of everything you can.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Free every Monday. One system per issue.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Free every Monday. One system per issue.</span></a></p><h2>The diagnosis sequence</h2><p>Four moves: qualify, diagnose, ask, follow up. Run them in that order and most of what feels like a sales problem stops happening to you.</p><p>None of this came out of accounting. I took it from businesses that sell things for a living, and one thing had to change before it survived contact with a firm owner. Somebody hiring you isn't buying a product. They're buying a few years of one person looking at their worst numbers. So the questions ask about the business rather than about budget and timeline, and the diagnosis has to be something you'd be willing to say to their face in March.</p><p><strong>Qualify before you present anything.</strong> Three questions, the same three every time, so you're not inventing them at minute twelve.</p><p>What's going on in the business right now. What happens if nothing changes. Who else is part of this decision.</p><p>The first gets you the mess. The second gets you the price, because the cost of doing nothing is the only number your fee is ever measured against. The third is the one everybody skips and it's the expensive one. You can run a perfect call with somebody who was never going to be allowed to say yes. So ask it in the first ten minutes, awkward or not.</p><p><strong>Present a diagnosis, not a menu.</strong> A menu hands the decision back to somebody who came to you because they couldn't make it. Fourteen bullet points of services is a menu, and so is a rate card with no opinion attached.</p><p>A diagnosis sounds like this: here's what I'd fix first, here's why it goes first, here's what happens after. Two sentences. You already do this with tax positions.</p><p>You'll be wrong sometimes and that's survivable. Being agreeable and unspecific is not.</p><p><strong>Ask for one next step, and put a date on it.</strong> Not "let me know what you think." That's a wish.</p><p>An ask sounds like: I'll send <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">the engagement letter</a> Thursday morning, and if it's signed by Monday I start on the first. Or, when they're clearly not ready: let's take twenty minutes Tuesday and decide whether this is a fit, and if it isn't I'll tell you who to call instead.</p><p>One next step, one date. You'd never end a client meeting without one, and both versions are written out in the annex.</p><p><strong>Follow up twice, spaced, useful each time.</strong> The first goes three business days later and carries the thing you promised on the call, because you did promise something. The second goes about a week later and carries one observation about their business you didn't say out loud the first time.</p><p>Both dates get set the moment the proposal leaves your outbox, not on the day they come due. Two calendar events, booked while you're still thinking about the person, messages already inside them. The annex has the shape; it's a two-minute job.</p><p>Then you stop. Two is the rule. A third starts costing you the thing you were trying to protect, and by then the silence has told you what you needed to know.</p><h2>What they're actually buying</h2><p>Nobody has ever hired a bookkeeper because the service list was thorough.</p><p>What a prospect is working out, the whole call, is whether you tell them the truth when the truth is inconvenient. Everything else is detail. Which is why the fastest trust move you have is naming what you don't do.</p><p>"I don't do tax returns, and I'll hand you to someone who does" costs you nothing and buys you a person who believes the rest of your sentences. A capability tour buys the opposite, because everybody they've ever hired said yes to everything.</p><h2>What you can hand off, and what you can't</h2><p>Later, and gladly: the scheduling link, the reminder that fires, the notes landing somewhere other than the back of an envelope, the second follow-up going out on time. That's plumbing, and plumbing belongs with software or with somebody who isn't you. Most of it you can <a href="https://scalingclients.com/p/build-one-firm-skill">build yourself in an afternoon</a> now.</p><p>If somebody else takes the inquiry before you do, the sequence still holds. It just starts one desk earlier: they collect the three answers, you make the diagnosis. Capture sheet for that is in the annex.</p><p>Not ever: the diagnosis conversation, and <a href="https://scalingclients.com/p/when-to-turn-down-a-client">the call on who's a fit</a>. Your judgment is the product in both. Hand them off and you've hired someone to be you badly, in front of the people deciding whether to trust you.</p><p><strong>Do this before Friday:</strong></p><ol><li><p>Write your three qualifying questions on one card and keep it where you take calls. Same three, every time.</p></li><li><p>Open your info email, the one you send after a first call. Rewrite it as four lines: their problem in their words, what you'd do first and why, a range, one next step with a date.</p></li><li><p>Send one overdue follow-up today, the one that's been sitting longest and quietly bothering you. Then before you close the tab, put its second date on your calendar with the message already written into it. That's the part that keeps working after this week.</p></li></ol><p>What's the sales moment you dread most: the price question, the follow-up, or the no? Hit reply and tell me which one. Whichever pile gets biggest becomes a future issue, and I read every one of them.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Take the next one too. It's free.&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Take the next one too. It's free.</span></a></p><div><hr></div><h2>Operator annex</h2><p>Below is the file I open before a first call.</p><h3>The call sheet</h3><p>Print it, duplicate it, whatever. The point is that you're reading questions instead of remembering them while somebody is talking at you.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Prospect:
Date:
Came from:

1. What's going on in the business right now?
   Answer:
   Read: usable / vague / not a real problem yet

2. What happens if nothing changes?
   Answer:
   Cost of doing nothing, in their words:

3. Who else is part of this decision?
   Answer:
   Decider on this call?  yes / no
   If no, next step is getting them on one.

Diagnosis, two lines max:
Range I gave:
Next step + date:
Follow-up 1 due:
Follow-up 2 due:</code></pre></div><h3>What the answers actually tell you</h3><p><strong>Question one. "What's going on in the business right now?"</strong></p><p>A usable answer has a date in it. "We're four months behind and the lender wants statements by the end of October." Now you have a mess and a clock, and the clock is doing your selling.</p><p>A vague answer sounds like "we just want to get more organized." Nothing to diagnose there. Ask the follow-up that saves the call: what made this the month you decided to deal with it? Something happened. It always did.</p><p><strong>Question two. "What happens if nothing changes?"</strong></p><p>A usable answer: "I miss the extension deadline again and I'm guessing at estimates for the third year running." Write it down in their words. That sentence is what your fee gets compared against, and you're going to quote it back to them.</p><p>A weak answer: "I guess it'd just carry on being annoying." Believe them. Low pain, low budget, and no amount of discounting turns that into a good client. It turns it into a client who calls you in April.</p><p><strong>Question three. "Who else is part of this decision?"</strong></p><p>Usable: "Just me." Or "me and my partner, and she'll want to see the number before anything."</p><p>The one to watch for: "I'll take it back to the team." Don't let that pass. Who's on the team, what will they want to know, and should you be on that call. Half the proposals that die quietly die in a room you weren't in.</p><h3>When they ask the price before you've scoped it</h3><p>This is the moment people discount. The reflex is to soften the number before anyone has objected to it, which sets the number at the bottom of your range and tells them the range was decorative.</p><p>The move is to answer, and to answer with the two things that move it:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Fair question, and you'll have a range before we hang up. Two things move it:
[thing one] and [thing two]. Tell me about [the one that moves it most] and
I'll narrow it while we're talking.</code></pre></div><p>Then deliver it with the edges attached, so the number reads as a diagnosis:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">For what you've described, [range]. It's the bottom of that if [condition],
and the top if [condition]. I'll know which once I've seen [the specific
thing you need to see].</code></pre></div><p>And the pair worth reading twice. The flinch:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">...which I know is probably more than you were expecting. I could
probably start at [lower number] and we can revisit in a few months.</code></pre></div><p>Holding the range:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">That's the range. If it's more than you want to spend right now, the smaller
version is [narrower scope] at [lower range]. Same standard of work, less of
it. What I won't do is the full job at the smaller number, because then I do
it badly and we both regret it.</code></pre></div><p>Nothing here is a fixed price. Ranges and estimates, always, and the number moves when the scope moves. What the number should actually be is a different problem from how you say it out loud, and <a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">that one has its own issue now</a>.</p><h3>Turning the info email into a diagnosis</h3><p>Three real rewrites. Different people, different lengths, different amounts of patience.</p><p><strong>One. The cleanup.</strong></p><p>What most firms send:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi [Name],

Great speaking with you today! As discussed, please find attached an overview of
our services. We offer monthly bookkeeping, cleanup work, payroll support, sales
tax filings, and year-end tax preparation. Pricing depends on scope of work and
transaction volume.

Let me know if you have any questions and I'd be happy to discuss further.</code></pre></div><p>What actually gets a reply:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi [Name],

Short version of what I heard: [the mess, in their words], and the thing setting
the clock is [the deadline they named].

I'd start with [the one fix], because until that's right everything downstream is
guesswork. That piece runs [range]. Once it's clean, ongoing is [range] a month.

Engagement letter comes over [day]. Signed by [day] and I start [date].</code></pre></div><p><strong>Two. The one who's already annoyed.</strong> Short call, short email, no throat-clearing.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

You've got [the specific problem] and somebody's already priced you for [the
thing that doesn't fix it]. That's why it hasn't gone away.

[The one fix], [range], done by [date].

Say go and I'll send paperwork today.</code></pre></div><p><strong>Three. The one who isn't ready.</strong> Don't fake a proposal. Say the real thing.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi [Name],

Being straight with you: [what they described] isn't work I'd take on right now,
and I don't think you'd be happy with what it cost.

What I'd do in your position is [the smaller, cheaper move], which is a
[timeframe] job, not a [timeframe] one.

If [the trigger] happens, come back and I'll pick it up. I'll remember the file.</code></pre></div><p>The shape underneath all three:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[One line: their problem, their words.]
[One line: what I'd do first, and why that goes first.]
[Range, and what it covers.]
[One next step, with a date.]</code></pre></div><h3>The two follow-ups</h3><p>Both short on purpose. Long follow-ups don't get read and they make you sound worried.</p><p>Follow-up one, three business days out:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Hi [Name],

Here's [the thing I said I'd send]. The part that matters for you is [one
sentence].

If you want to move, I can start [date]. If the timing's wrong, just say so and
I'll stop filling up your inbox.</code></pre></div><p>Follow-up two, about a week after that:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">[Name],

One thing I kept thinking about after we spoke: [the observation, specific to
their business].

Worth knowing either way. If this isn't the season for it, no hard feelings and
I'll leave it there.</code></pre></div><p>Two. Then stop. The permission to stop is most of the value here, because what keeps people from sending the first follow-up is knowing there's no agreed end to it.</p><h3>The part that runs while you're with a client</h3><p>Everything above only fires if you remember. So don't remember.</p><p>The moment the proposal leaves your outbox, before you close the tab, make two calendar events with the messages already inside them:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Event 1
  Title:  Follow up 1  &#183;  [Prospect]  &#183;  send [the thing I promised]
  When:   3 business days from today
  Notes:  [follow-up one, already filled in with their details]

Event 2
  Title:  Follow up 2  &#183;  [Prospect]  &#183;  one observation, then stop
  When:   7 days after Event 1
  Notes:  [follow-up two, already filled in]</code></pre></div><p>Two minutes at send time. Then it happens on a Tuesday you've forgotten all about, with the email already written, so the only thing left is to press send. No prompt for this one and none needed. It's two minutes and a habit.</p><p>Three places it can live, in order of how little setup they need:</p><ol><li><p><strong>Your calendar.</strong> Works everywhere, no setup, and it's already the first thing you open. Default choice.</p></li><li><p><strong>Send-later, if your mail has it.</strong> Write both follow-ups the same minute you send the proposal and schedule them for their dates. Now it isn't even a decision on the day, and you can still pull one back if they reply.</p></li><li><p><strong>Whatever sent the proposal.</strong> If it does reminders, put the two dates there so the record and the reminder sit in one place. Only worth it if more than one person at your firm touches a deal.</p></li></ol><p>The audit is event-triggered. Any time a prospect surfaces in your head and isn't on the calendar, put them on it right then, with the message written in. Carrying them around in your head is the failure mode this replaces.</p><p>There's no tracking spreadsheet in here on purpose. Your calendar already opens every morning. A spreadsheet opens when you remember it, which tends to be the same moment you remembered the follow-up anyway.</p><h3>The "what I don't do" block</h3><p>This goes in two places: a few lines near the bottom of a proposal, and a short section on whichever page prospects land on. The labels below are mine, for you. Don't paste them.</p><p>Six versions, so you can hear the range. Pick one voice and stay in it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">1. I don't do tax returns. I'll hand you to someone who does, and I'll stay on
   the file so nothing falls between us.
2. No cleanups shorter than three months. Under that you don't need me, you need
   a free afternoon.
3. One new client a month. If this month's taken I'll tell you the month I have.
4. I won't take work that needs to be finished in a week. It'll be wrong, and
   we'll both know why.
5. Pre-revenue startups aren't for me. Come back the month payroll starts.
6. I don't take clients who want the books to say something the bank statements
   don't.</code></pre></div><p>Six is more than anybody needs. Pick two, and pick the two you've genuinely said no to this year.</p><h3>If someone else takes the inquiry first</h3><p>Once your firm is past three or four people, the owner usually isn't the first voice a prospect hears. The sequence still works. It just starts one desk earlier, and the person at that desk needs to know what to collect.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">INQUIRY CAPTURE  &#183;  give to [owner] same day

Who called / wrote, and when:
How they found us:

What they said is going on (their words, not a summary):

What happens if nothing changes:

Who signs. Were they on the call?  yes / no

Anything we promised them, and by when:</code></pre></div><p>Two rules for whoever holds that sheet. Write their words, not a tidied version, because the tidied version is where the useful detail goes to die. And escalate same day, not Friday, if there's a deadline in the answer to question two.</p><h3>Two prompts (review before you apply anything)</h3><p>Both of these hand back a draft you'd otherwise write from scratch: the after-call email, and the block of work you don't take.</p><p>Same rule on both: the agent drafts, you publish. Nothing it writes reaches a client, a page, or a file until you've read it end to end and decided you'd sign your name to it.</p><p><strong>Prompt one: rewrite the email you send after a first call.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I want to rewrite the email I send after a first sales call. Draft only. Don't
publish anything, don't send anything, and don't create or change anything in any
account of mine.

The email I send today: [paste it].
A real call it would have followed: [paste your notes, or answer these three:
what's going on in the business, what happens if nothing changes, who decides].

1. Rewrite it as four lines: their problem in their words, what I'd do first and
   why that first, a range and what it covers, one next step with a date.
2. Give me three versions at different lengths. Say which one you'd send and why.
3. List every sentence you cut and what it was doing.
4. Flag anything that reads as a free review, a free look at the books, or a
   promise about a result. I can't say any of those.

Hand it all back. I'll choose one and send it myself.</code></pre></div><p><strong>Prompt two: write the block of work you don't take.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Help me write the "what I don't do" section for my firm. Draft only. Don't touch
my website, my forms, or anything that's live.

Work I've turned down in the last year: [paste the list, or paste the emails
where you said no].

1. Sort those into the three or four real reasons I said no. Ignore the polite
   wording I used at the time.
2. Write each reason as one plain sentence a prospect could read without feeling
   insulted. No apology and no hedging.
3. Give me a short version for a proposal and a slightly longer one for a page on
   my site.
4. Tell me which of these will cost me the most work, and say it plainly rather
   than talking me out of it.

Then stop there. I'll decide what goes up and I'll put it up myself.</code></pre></div><p>So read what it hands you before any of it goes up. You'll be holding those lines on days when holding them costs you the job.</p>]]></content:encoded></item><item><title><![CDATA[The Referral Loop: How Firms Get Referred on Purpose]]></title><description><![CDATA[Five moves, the scripts I actually send, and the fee question nobody agrees on.]]></description><link>https://scalingclients.com/p/accountant-referral-program</link><guid isPermaLink="false">https://scalingclients.com/p/accountant-referral-program</guid><dc:creator><![CDATA[Bobby Huang]]></dc:creator><pubDate>Mon, 24 Aug 2026 16:42:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VeDe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8c848e-3cf4-46eb-b8b3-fcd4dd39eb18_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The firm's been full since June. We've had a waitlist that whole time and I keep opening it and closing it.</p><p>Saying no is the easy part. The next sentence is where I fumble.</p><p>Someone fills out the intake form. Real business, real problem, and the honest answer is not us, not right now. So I want to send them somewhere good. But the second I put a name in an email, I own a piece of whatever happens next. If it goes sideways in March, nobody remembers the part where I said do your own diligence. They remember that I sent them.</p><p>A referral feels like a favor when you make it and like a position when it goes wrong.</p><p>So a few weeks ago I put the questions to my feed. One name or three? Anything in writing, or is it a warm intro and hope? Does money ever change hands, and if it does, do you tell the client? Sixty-odd comments came back, which told me the not-knowing is general.</p><p>Then the other half landed on me. I also need firms I can send work to. And when I went looking, most of them couldn't tell me in one sentence what work they actually wanted. Not because they're bad at the job. Because nobody had ever asked them to say it out loud.</p><p>Both directions. Everybody winging it.</p><p>Here's why word of mouth stalls. People refer a sentence.</p><p>"She untangles Stripe messes for e-commerce companies" travels. Somebody can repeat that at a dinner without you in the room. "He's a really good bookkeeper" dies on the way out of the mouth, because whoever hears it has no idea whether that means them.</p><p>If nobody can repeat what you do, your reputation stays in the room where you built it.</p><p>And then there's the part almost nobody says out loud. The reason you don't get referrals is that you never ask. The reason you never ask is nerve. It feels like begging, or like admitting you need the work, so the ask never happens and the whole channel runs on hope. That's not a skills problem. It's a nerve problem, and nerve is a much easier thing to fix.</p><p>I should say where I'm standing. My own firm, <a href="https://sdocpa.com/about">SDO CPA</a>, runs that waitlist, and I'm building the giving side of this in public right now because I didn't have it either. This is a report from the middle of the build. When I laid out <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">the system that fills the firm</a> a couple of weeks ago, referrals were the one part I named and then walked past. This is that part.</p><blockquote><p><strong>What does an accountant referral program actually look like?</strong></p><p>For most bookkeeping, accounting, and CPA firms, it's a fee arrangement bolted onto hope. You agree to pay somebody who sends you work, and then you wait. What actually produces referrals is the asking system underneath: name the work you want and the work you won't take, tell the people most likely to run into it, make the ask scheduled instead of a one-off, report back to whoever sent it every single time, and keep a list of who covers what so you can hand work off too. A fee is optional. If you pay one, pay it after the work is real. I pay a tax-return referral once the return is done and paid for, and a bookkeeping referral once the client signs and the first couple of months are delivered.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Reputation doesn't travel without a sentence</strong> - people repeat one specific line about you, never a general impression of your competence.</p></li><li><p><strong>The ask is a nerve problem</strong> - most owners who call word of mouth their main channel can't name the last time they actually asked anybody for a referral.</p></li><li><p><strong>The loop has five moves</strong> - name the work, tell the likely referrers, ask on a schedule, close the loop, keep a who-covers-what list.</p></li><li><p><strong>Closing the loop is the move everyone skips</strong> - people refer again when they find out what happened to the last one, and quietly stop when it disappears into silence.</p></li><li><p><strong>Being a good referral target is half the trade</strong> - a firm that says "we do everything" gets sent nothing, because there's nothing to repeat.</p></li><li><p><strong>If a fee is involved, tell the client</strong> - trust is the asset, and a hidden fee spends it.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe free: one issue every Monday&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe free: one issue every Monday</span></a></p><h2>The referral loop: what an accountant referral program looks like when it runs</h2><p>Five moves. Call it a loop because the last one feeds the first, which is what makes it compound.</p><p><strong>Name what you want, and what you won't take.</strong> You can't be referred for something you've never said out loud. If you did the <a href="https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach">three-sentence who-we-serve exercise</a> from the first issue, you've already written half of this. Most owners get halfway here and can describe the work they like. Almost nobody writes down the work they decline, and that half is what makes the first one usable. Entity types. Client size. How much cleanup you'll tolerate. The thing you will not do at any price. A referrer needs the fence as much as the field, because the fastest way to stop getting referrals is to get three bad ones and have to turn them all down.</p><p><strong>Tell the people most likely to run into it.</strong> Three groups. Your existing clients, who talk to more business owners in a month than you do in a year. The adjacent professionals: the attorney, the banker, the insurance person, the fractional CFO. And other firms that are already full. That third one surprises people. A firm at capacity is not your competitor that week. It's somebody sitting on work it can't take, looking for a place to put it, which is exactly the position I'm in right now. What a full firm does about that without posting a job is <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">the capacity issue</a>.</p><p><strong>Make the ask scheduled, not a one-off.</strong> The nerve problem doesn't get solved by getting braver. It gets solved by frequency and by putting the ask somewhere it recurs on its own, so you're not deciding to be brave every time. Your delivery moment. Your engagement rhythm. Your signature line. Ask ten times and the tenth one costs you nothing, because by then it's just how you talk.</p><p><strong>Close the loop, every time.</strong> This is the cheapest move and the one nearly everybody skips. Somebody sends you a name. Tell them what happened. You took it. You didn't take it, and here's why. They signed, and it's going well. People refer again when the last one came back to them as information, and they stop when it vanished. Costs you a two-line email. I got this wrong for years.</p><p><strong>Keep a who-covers-what list.</strong> Write it down before you need it, so that when a real person is sitting in your inbox you're reading notes instead of scrambling. A warm feeling about somebody is not a recommendation, and the difference matters the day a handoff goes wrong. If you have no overflow yet, this still applies: the list is for the work you decline and <a href="https://scalingclients.com/p/bookkeeping-engagement-letter">the work that's out of your scope</a>, which every firm has from the first client. Overflow is just the fifteen-person version of the same move.</p><p>The loop doesn't cover what happens when the referred person actually calls you. That turned out to be <a href="https://scalingclients.com/p/how-to-sell-accounting-services">a whole issue on the sales conversation</a>.</p><h2>The other side of the trade</h2><p>Half this system is being someone worth referring TO, and almost nobody works on that half.</p><p>I asked publicly whether any firms had room, and firms answered. That surprised me. Saying "we have capacity right now" out loud feels like admitting something, and it isn't. It's the most useful thing you can tell somebody in my position.</p><p>But having room isn't enough. When I follow up, I'm trying to answer four questions before I send anyone: what work do you actually want, what size client fits you, how much cleanup will you take on, and <a href="https://scalingclients.com/p/when-to-turn-down-a-client">what do you refuse</a>. A firm that can answer those in four sentences gets sent work. A firm that says "we do everything, send it over" gets sent nothing, because I have nothing to repeat about them and no way to tell whether the client is a fit.</p><p>That's not a knock on anybody. Nobody was taught to say it.</p><h2>Money and disclosure</h2><p>Most of what gets sold as an accountant referral program is really just this question, answered badly. So: if a fee is involved, tell the client. That's the whole rule.</p><p>The logic is the same logic they'd use on you. A referral is worth something because it carries trust, and the client is trusting that you sent them to the best fit rather than the best payout. A fee you didn't mention, found out about later, spends that trust in one sitting. A fee you named up front costs you a slightly awkward sentence and nothing else.</p><p>On timing, here's what I do rather than what anyone should do: I pay after the referred work is real. A tax-return referral pays out once the return is done and paid for. A bookkeeping referral pays once the client signs and the first couple of months are actually delivered. That's it. I'm not going to tell you what your state or your professional standards require, because that's a real question with a real answer and I'm not the person to give it to you.</p><p><strong>Do this before Friday:</strong></p><ol><li><p>Write your referable sentence. The test is whether a client could repeat it accurately without you in the room.</p></li><li><p>List five people most likely to run into that work. Clients, adjacent pros, firms you know are full.</p></li><li><p>Make one ask. Just one. Pick the easiest name on the list.</p></li><li><p>Start your who-covers-what list with two other firms you'd send work to. Overflow if you have it, declined and out-of-scope work if you don't.</p></li></ol><p>Do you tell clients when a referral fee is involved? Genuinely curious where people land on this one, because I don't think there's a settled answer. If you've never been on either side of a fee, that's an answer too, and I want to know what's kept you there. I read every reply, and they turn into <a href="https://scalingclients.com">future issues</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Get next Monday's issue free&quot;,&quot;action&quot;:&quot;subscribe&quot;,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Get next Monday's issue free</span></a></p><div><hr></div><h2>Operator annex</h2><p>You have the whole loop now. What follows is the raw material behind it: sentence templates, the scripts I actually send, the version that keeps asking while you're busy, two prompts, and the list skeleton. I keep this section current as my own scripts change.</p><h3>Five referable sentences you can steal</h3><p>A referable sentence has two halves, and the second half is the one people leave off. Half one is the work. Half two is the fence. Without the fence, the sentence sounds like everybody else's and the person repeating it can't tell whether the lead in front of them is yours.</p><p>None of these have revenue figures or client names in them. Specificity comes from constraints, not from bragging.</p><p><strong>Pattern 1: problem plus industry.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I fix [specific recurring mess] for [industry], usually when [trigger].
I don't take [category].

Filled: I untangle payment-processor deposits for e-commerce and
subscription businesses, usually when the books are a quarter or
more behind. I don't take single-month cleanups or anyone who wants
it done inside a week.</code></pre></div><p><strong>Pattern 2: entity complexity.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I handle [structure type] for owners running [number] related
entities. I don't take [the simpler thing everyone else sends me].

Filled: I handle multi-entity operators running two to four related
companies, usually a holding structure plus operating entities. I
don't take one-off returns with no ongoing bookkeeping attached.</code></pre></div><p><strong>Pattern 3: the cleanup specialist.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I take the books nobody else wants: [worst-case description]. I
don't take [the ongoing work that pays better], because [reason].

Filled: I take books nobody else wants, including two or three years
of unreconciled accounts and a prior bookkeeper who left mid-year. I
hand off ongoing monthly work after the cleanup lands, because
cleanup is what I'm fast at.</code></pre></div><p><strong>Pattern 4: stage of business.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I work with owners at [specific stage], usually the moment [event].
I don't take [the stage before or after].

Filled: I work with owners at their first real hire, usually the
month payroll starts and the shoebox stops working. I don't take
pre-revenue businesses or anyone already running a finance team.</code></pre></div><p><strong>Pattern 5: the deliverable.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I give [specific output] to [who needs it], on [cadence]. I don't do
[the adjacent thing people assume].

Filled: I give owners a monthly report they can actually read, by
the tenth, with a fifteen-minute call attached. I don't do tax
returns, and I say so on the first call so nobody's surprised in
March.</code></pre></div><p>Your version has to sound true before it sounds impressive, and the two pull in opposite directions more often than you'd think. Read your draft out loud to somebody who doesn't do this work. If they can repeat it back to you five minutes later, you're done. If they say "so, accounting?", the fence is missing.</p><h3>Three ask scripts</h3><p>Short enough that you'd actually send them. Pick one and send it this week.</p><p><strong>To an existing client.</strong> Send it after a delivery moment, when the value is fresh and specific. Never send it cold in the middle of a quiet month.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Quick one. We've got room for a couple more [type of work] clients
this quarter, and the ones I like best have come from people like
you rather than from the internet.

If anyone comes to mind, the fit is usually [one-line referable
sentence]. If nobody does, that's completely fine and this doesn't
need a reply.

Thanks for the last few months. [Specific thing that went well.]</code></pre></div><p><strong>To an adjacent professional.</strong> The trade here is symmetry. You're not asking for a favor, you're proposing a two-way lane, and you go first by telling them exactly what you'd send them.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">We keep running into the same clients from different sides. I'd
rather that be deliberate.

Here's what I'd send you: [specific description of the work you
regularly turn away that lands in their lane].

Here's what's useful to me: [your referable sentence, both halves].

If that's a fit, I'll put you on my list and check in before I send
anyone. No pressure either way.</code></pre></div><p><strong>To a firm that's at capacity.</strong> This is the newest one and the one I'm actively using. It works in both directions and it works at any size. If you have no overflow to trade, the trade is the work you decline.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Saw you mention you're full. Same here, which is why I'm writing.

I'm building a short list of firms I'd send overflow to before I
need it. Most of what I can't take is ordinary: [name the actual
mix, not "everything"].

Two questions if you're open to it. What work do you want more of
right now, and what do you not take? If it's a fit I'll add you,
and I'll always check with you before I put your name in front of
anyone.

Happy to answer the same two questions back.</code></pre></div><p>The at-capacity script is the one that surprised me. Firms answer it, and they answer it fast.</p><h3>The always-on ask</h3><p>The scripts above only fire when you remember to send one. This is the version that keeps asking while you're busy, and it's most of the difference between a firm that gets referrals and one that means to.</p><p><strong>Your signature, your invoices, your onboarding email.</strong> One line at the bottom of everything that already leaves your office. Choose one and leave it alone for a quarter.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">1.  Know someone whose books are behind? Send them my way.
2.  Room for two more [type of work] clients before year-end.
    Referrals welcome.
3.  Most of my clients come from people like you.
4.  Forward this to whoever it reminds you of. Or skip the forward
    and just send me the name.
5.  If the work's been good, the thing I actually want is a name.
6.  I take referrals from anyone, client or not: [link]
7.  I work best with [your referable sentence]. If that's somebody
    you know, here's where to send them: [link]
8.  Your first report lands on the 10th. If somebody you know is
    where you were three months ago, I'd take the introduction.</code></pre></div><p>Notice none of them apologize, and none of them promise anything in exchange.</p><p><strong>Your website.</strong> Two pieces. A line in the footer so it shows up on every page (6 or 7 above, with the link pointed at the second piece), and the page it points to. That page is short: who you take, who you don't, what happens after somebody sends a name, and the way to send it. The page qualifies for you, so a reader can decide not to send you a bad fit before anybody's time gets spent.</p><p><strong>Two ways to catch them.</strong> Say "email me" if you're one or two people and the volume is low. Zero setup, and a real person reads it. Move to a short form on your site the moment more than one person touches intake. It emails you, and everybody ends up sending the same five fields instead of whatever they felt like typing. Either route should ask: who's referring, who's being referred, what the work looks like, whether the person being referred already knows about you, and how the referrer wants to hear back.</p><p><strong>Track it, or you will drop someone.</strong> A sheet is fine.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Date | Referred by | Who they sent | The work | Status | Told them back? | Fee? Disclosed?</code></pre></div><p>Status and told-them-back are the two columns doing real work. They turn "close the loop, every time" into something you can see you haven't done. Open the sheet Friday morning: any row with a blank told-them-back older than a week is a two-line email you owe somebody.</p><p>This tracker is the inbound half, work coming to you. The who-covers-what list further down is the outbound half, work you send away. Keep them separate. Mixing them is how a name goes missing.</p><h3>Two implementation prompts (review before you apply anything)</h3><p>The first builds the always-on pieces above. The second builds the list below.</p><p><strong>Prompt one: the referral page and the intake form.</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I want a referral page and a matching intake form for my accounting firm.
Draft only. Do not publish anything, do not change my live site, and do
not create anything in any account.

My firm in one sentence: [your referable sentence, both halves].

1. Draft the page copy: who I take, who I don't, what happens after
   somebody sends a name, and how to send it. Short, plain, no
   salesmanship.
2. Draft the form fields and the exact question wording, covering who's
   referring, who's being referred, what the work looks like, whether the
   referred person already knows about me, and how the referrer wants to
   hear back.
3. Draft the confirmation message the referrer sees, and the short email I
   should send them within a day.
4. Take this line and rewrite it in my words: [paste one of the
   signature lines above].

Show me all four. I'll decide what goes live and I'll put it there myself.</code></pre></div><p><strong>Prompt two: stand up your list.</strong></p><p>This one builds the first version of your who-covers-what list out of what you already have. It reads and drafts, and it never writes to anything live. Nothing in the output is true until you've checked it against what the firm actually told you.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I want to build a referral registry for my accounting firm. Do not
write to any file, CRM, or email account. Draft only, and hand it
back to me.

1. Here are the firms and individuals I've referred work to or
   received work from in the past two years: [paste names, or paste
   the relevant email threads].
2. For each one, pull out what they actually cover, what size client
   they seem to work with, and anything they've said they don't
   take. If a field is unknown, say unknown. Do not guess.
3. Flag every entry where the only thing I have is a good
   impression rather than something they told me directly.
4. Output it as a table with these columns: firm, what they cover,
   client size, exclusions, who vouched, verified by me, last
   confirmed.

Then give me a short list of the entries worth confirming first,
ranked by how likely I am to need them in the next quarter.</code></pre></div><p>The boundary in that last line is the whole point of writing it that way. Gather, draft, stop. You read it, you fix what's wrong, you decide what's true enough to act on. An agent will happily hand you a confident table full of guesses, and the person who eats that mistake is the client sitting across from whoever you sent them to.</p><h3>The who-covers-what registry skeleton</h3><p>Seven columns. Each one exists for a reason.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">| Firm / person | What they cover | Client size | Exclusions | Who vouched | Verified by me | Last confirmed |
|---------------|-----------------|-------------|------------|-------------|----------------|----------------|
|               |                 |             |            |             |                |                |</code></pre></div><p><strong>What they cover</strong> gets recorded in their words. If you're paraphrasing, you're guessing.</p><p><strong>Exclusions</strong> is the column that saves you. A firm that takes S corps but not multi-state is a great referral for one client and a bad one for the next.</p><p><strong>Who vouched</strong> is there so you can tell six months later whether a name came from somebody you trust or from a comment thread.</p><p><strong>Verified by me</strong> turns a warm feeling into a fact. Did you talk to this firm about what they take, or did you write them down because they seemed nice? Only a yes here goes in front of a client without a caveat.</p><p><strong>Last confirmed</strong> exists because coverage drifts. A firm that had room in March can be full by June, or down the one person who did that work. Confirm before you send, and sweep the whole thing quarterly.</p><p>One boundary worth stating plainly, because it's the thing that made me nervous enough to build the list in the first place. A registry is a tool for making a good handoff. It does not transfer your judgment to a table, and it is not a promise about anybody's work. When I send a name, I say what I know, I say what I don't, and I tell the client to do their own diligence.</p>]]></content:encoded></item><item><title><![CDATA[How Bookkeepers Get Clients Without Cold Outreach]]></title><description><![CDATA[Client acquisition is an operating skill nobody taught you. The system my firm runs, and what to do before Friday.]]></description><link>https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach</link><guid isPermaLink="false">https://scalingclients.com/p/how-to-get-bookkeeping-clients-without-cold-outreach</guid><pubDate>Mon, 10 Aug 2026 12:30:13 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I opened LinkedIn this morning and found 121 pending invitation requests sitting in a queue I hadn't touched in weeks. I clicked the three newest ones, mostly out of morbid curiosity. A BDR firm promising me fifteen booked calls a month with accounting-firm decision-makers. An offshore team offering "full-cycle client acquisition" for bookkeeping practices. And a funnel strategist whose thumbnail had him pointing at a whiteboard covered in arrows.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kzl3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kzl3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 424w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 848w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 1272w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kzl3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;LinkedIn invitations queue showing 121 pending requests. The three most recent are vendors pitching client acquisition to accounting firms: a BDR firm, an offshore accounting partner, and a digital marketing strategist.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="LinkedIn invitations queue showing 121 pending requests. The three most recent are vendors pitching client acquisition to accounting firms: a BDR firm, an offshore accounting partner, and a digital marketing strategist." title="LinkedIn invitations queue showing 121 pending requests. The three most recent are vendors pitching client acquisition to accounting firms: a BDR firm, an offshore accounting partner, and a digital marketing strategist." srcset="https://substackcdn.com/image/fetch/$s_!Kzl3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 424w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 848w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 1272w, https://substackcdn.com/image/fetch/$s_!Kzl3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e4977c1-975a-4eb9-9480-8dea58294b77_1200x846.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">This morning's queue. Three for three.</figcaption></figure></div><p>Three vendors in a row, all selling the same answer to the same question: how to get bookkeeping clients. Think about what that means for a second. A whole industry exists to sell firm owners something nobody ever taught them to do themselves. I'm not knocking the vendors, honestly. It's just funny in the way true things are funny. Nobody in this profession teaches you where clients come from. So an army of people showed up to sell the answer back to us, one retainer at a time.</p><p>Here's the uncomfortable part. Being good at bookkeeping has almost nothing to do with getting bookkeeping clients. Nobody hires the best bookkeeper in their zip code, because nobody knows who that is. They hire whoever they heard about the week the books turned into a real problem and the pain got loud enough to do something about.</p><p>So where does demand actually come from? Being findable when someone finally looks. Being referable enough that someone else does the looking for you. And being specific, meaning a stranger can tell in about ten seconds whether you're for them or not. None of that is a bookkeeping skill. You won't find any of it in a QuickBooks certification or a CPA exam prep course either.</p><p>If you keep one sentence from this issue, keep this one: getting clients isn't hard. It's untaught. Almost everyone in this profession learned the technical work from someone else in the profession. And that person never once mentioned how to find a client, because nobody taught them either. The chain goes back decades.</p><p>This is where owners split into two camps. One camp hires an agency and hopes for the best. The other learns the system once, then decides which pieces to hand off.</p><p>What do you actually have to understand yourself before you delegate anything? Four things, and you only have to learn them once. Who your firm is for. What makes someone refer you instead of the firm down the street. How a stranger turns into a conversation. And <a href="https://scalingclients.com/p/how-to-sell-accounting-services">why a buyer picks you over the next estimate</a>, which comes down to trust rather than a feature comparison, and trust doesn't transfer through a vendor's slide deck no matter how good the deck is. Once you've got those four down, the mechanics are fair game to hand off. Running ads, producing the SEO content, designing the site, booking the calendar. All of it.</p><p>My test for anyone pitching me acquisition work is one question. Can I evaluate what they produce? If yes, fine, delegate it. If I can't tell their good work from bad work, I'm not delegating anymore. I'm hoping.</p><p>Write that on a sticky note if it helps. Most of those 121 invitations in my queue come from people betting I can't tell the difference.</p><p>I should say where I'm writing this from. My own firm, <a href="https://sdocpa.com/about">SDO CPA</a>, runs a waitlist, so what follows is a report from someone using this system right now, not a pitch for something I've only read about. If you searched how to get bookkeeping clients and landed here, this is the guide: read the system once, then do the Friday list at the end.</p><blockquote><p><strong>How do you get bookkeeping clients without cold outreach?</strong></p><p>Build an inbound system with four connected parts: a website that ranks for your niche and your city (and shows up in AI answers, where owners now ask), content that pre-sells how you think, an intake form with published price ranges instead of discovery calls, and a referral ask built into the practice itself. My firm runs this exact system and holds a waitlist. No ads, no cold email, no becoming an influencer.</p></blockquote><h2>Key Takeaways</h2><ul><li><p><strong>Getting clients isn't hard, it's untaught</strong> - the profession teaches the work and never the demand side, which is why an entire vendor industry exists to sell you the answer.</p></li><li><p><strong>Learn the system before you delegate any of it</strong> - if you can't evaluate a vendor's work, you're not delegating, you're hoping.</p></li><li><p><strong>The engine has four parts</strong> - findable (search plus AI answers), pre-selling content, intake instead of calls, and referrals wired in.</p></li><li><p><strong>Publish your price ranges</strong> - hiding the number costs more in wasted process time than it earns; transparent ranges filter price-shoppers before they reach your calendar.</p></li><li><p><strong>Start this week</strong> - the Friday list below has five actions, and the smallest one takes about four minutes.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe free: one issue every Monday&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Subscribe free: one issue every Monday</span></a></p><h2>Where bookkeeping clients actually come from</h2><p>Go search how to get bookkeeping clients right now and look at page one. It's a wall of numbered lists, most of them written by content marketers who have never landed a bookkeeping client in their lives. Getting a lead is one thing. <a href="https://scalingclients.com/p/how-to-sell-accounting-services">Closing a lead is a different thing entirely,</a> and almost none of that advice comes from anyone who's done both. So here's the system from someone who has. I'm giving you just enough to see how the pieces connect and feed each other, and I'm holding the full playbook back on purpose, because each piece below deserves its own issue. Today you get the shape of the thing.</p><p><strong>Be findable where owners already look.</strong> A website that actually ranks for the specific work you do in the specific place you do it. Not a generic "bookkeeping services" page that could belong to any of a thousand firms. Your Google Business Profile filled out, current, with a real photo instead of a stock calculator. And increasingly, <a href="https://scalingclients.com/p/ai-for-bookkeepers">showing up when someone asks an AI tool who to hire</a> for bookkeeping in their city, because owners genuinely search that way now, which surprised me the first time I watched it happen. None of this is accounting knowledge, by the way. I imported all of it from businesses outside this profession, businesses that solved findability years before accounting firms bothered trying.</p><p><strong>Content that pre-sells.</strong> <a href="https://scalingclients.com/p/marketing-for-bookkeepers">Before anyone talks to you, they read something you wrote. </a>And somewhere in the reading they decide, on their own, that you think about the work the way they want their bookkeeper to think about it. By the time an actual conversation happens they've half-decided. It doesn't take much either. One article on how you handle multi-entity cleanup. One post about the reconciliation mistake you see constantly. A prospect shows up already trusting your judgment on the exact thing keeping them up at night. That's the entire job of content as far as I'm concerned: letting people arrive convinced.</p><p><strong>An intake process instead of discovery calls.</strong> <a href="https://scalingclients.com/p/when-to-turn-down-a-client">I stopped taking calls from prospects</a>. Completely. The demand volume plus a real intake form does the filtering a call used to do, minus the hour each call used to cost me. <a href="https://scalingclients.com/p/how-much-do-bookkeepers-charge">Published pricing lives in this stage too</a>, and this is the part people push back on. My firm posts estimates as ranges, tied to what the intake form tells us about the work. The logic is the same logic a prospect would use on me: if you're not transparent about pricing, what are you hiding? Sure, hiding the number might squeeze a little more out of some deals. It also costs more in wasted process time than it ever earns back. I'd rather lose a price-shopper on page one of a form than after forty-five minutes on a call neither of us needed.</p><p><strong>Referrals as a built-in layer, not a separate hustle.</strong> <a href="https://scalingclients.com/p/accountant-referral-program">The ask lives in the site footer.</a> It lives in a line in the confirmation email. It lives in how the practice runs day to day, which means existing clients refer without anyone chasing them for it. And the people who refer get paid after the work is real. A tax-return referral pays out once the return is done and paid for. A bookkeeping referral, once the client signs and the first couple of months are actually in the books. There's a lot more to say here and <a href="https://scalingclients.com/p/accountant-referral-program">it deserves its own issue</a>. For now just notice it's wired into the system from the very start.</p><p><strong>Do this before Friday:</strong></p><ol><li><p>Write three sentences: who you serve, what you won't take, and what your perfect client looks like.</p></li><li><p>Run the findability audit. Search your niche and city the way a prospect would, then ask an AI tool "who should I hire for [your niche] in [your city]." Write down what shows up, and whether you're on the list.</p></li><li><p>Find the one spot in your intake where a ready prospect would stall (no form? a book-a-call wall with no other option?) and fix that one thing.</p></li><li><p>Write down every question a prospect asked you this month. That list is your content plan for the next few months.</p></li><li><p>Add one line about referrals to your email signature or invoice footer. It's the smallest possible version of the built-in layer above, and it takes about four minutes.</p></li></ol><p>What's the last thing a prospect asked you before they signed? I'm collecting these: the answers become <a href="https://scalingclients.com">future issues</a>.</p><p><strong>House ad, for something I build:</strong> Growthy is bookkeeping software I make. It's the layer I run on top of QuickBooks to keep my own firm's books current, and it's <a href="https://scalingclients.com/p/bookkeeping-workflow">cut my month-end close from about four hours to about 30 minutes</a>. <a href="https://scalingclients.com/p/how-to-grow-an-accounting-firm">That's what makes room to take on new clients at all</a>. Not required reading: <a href="https://growthy.com/signup/?utm_source=scalingclients&amp;utm_medium=newsletter&amp;utm_campaign=partner-program-pilot&amp;utm_content=sc-01">see what Growthy does</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scalingclients.com/subscribe?&quot;,&quot;text&quot;:&quot;Get next Monday&#8217;s issue free&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://scalingclients.com/subscribe?"><span>Get next Monday&#8217;s issue free</span></a></p><h2>Operator annex</h2><p>Everything above is the complete answer. Everything below is the reference material: worked examples, a worksheet, and the copy-paste prompts I actually use to run pieces of this myself. This is the part that gets maintained and expanded as the paid archive builds out. For now, it's here so you can act on this issue the same day you read it.</p><h3>Your three-sentence who-we-serve skeleton</h3><p>The first action item above asked you to write three sentences. Here's the fill-in-the-blank version, then two filled examples so you can see what "specific" actually looks like next to what "vague" looks like.</p><p>The template:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I serve: [type of business, size range, and situation].
I don't take: [a category of work or client you actively decline].
My perfect client looks like: [specific traits, not a job title].</code></pre></div><p>Filled example, a three-person bookkeeping shop:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I serve: service businesses with 2 to 15 employees, mostly contractors and
med spas, who are at least one full quarter behind on reconciliations.

I don't take: anyone asking for same-week cleanup on more than 18 months
of backlog, or anyone shopping three bookkeepers on price before a single
call.

My perfect client looks like: an owner who already knows the books are a
mess, has said so out loud to somebody else before finding me, and wants
monthly reporting they can actually read instead of a once-a-year
tax-time handoff.</code></pre></div><p>Filled example, an eight-person tax-and-bookkeeping hybrid firm:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">I serve: multi-entity operators with two to four related entities, usually
a holding structure plus operating companies, who've outgrown a
single-person bookkeeper but aren't ready to hire a full-time CFO.

I don't take: single-entity businesses with no ongoing bookkeeping
relationship attached to the tax work (no drive-by returns), or anyone
who wants each entity handled in a separate silo with nobody looking at
the whole structure.

My perfect client looks like: an operator managing real entity complexity
who wants one team that sees across the structure, not three vendors who
each see one piece of it and none of the whole.</code></pre></div><p>Notice what's missing from both: no revenue figures, no client names, nothing that reads like a case study. That's on purpose. The skeleton is about who fits. Specificity comes from constraints: entity count, backlog length, what you refuse.</p><p>Write your own version this week, tape it above your monitor, and use it as the filter for every inbound message. If a prospect doesn't match line one, you already know how the conversation ends. Save yourself the call.</p><p>One more thing worth saying here. Your version doesn't have to sound impressive. It has to sound true. The first draft I wrote for my own firm was three flat sentences with nothing clever in them, and it worked better than anything I'd tried before, because a prospect could read it and immediately tell whether they belonged. Vague language lets the wrong people waste your time. Specific language filters most of them out before they ever reach your inbox, which is the entire point.</p><h3>The findability-audit worksheet</h3><p>This turns first-week action item two into something you can actually run, step by step, the way I run it on my own firm every quarter.</p><p><strong>Step 1: The plain search.</strong> Open an incognito browser window (logged out matters, or the results get personalized to your own history). Search "[your niche] bookkeeper [your city]" and "[your niche] bookkeeping services near me." Note whether you appear on page one, organically, not in the paid results.</p><p><strong>Step 2: The Google Business Profile check.</strong> Search your business name directly. Confirm your profile appears with the map pack, current hours, a category that matches what you actually do, and at least one real photo, not a stock image of a calculator.</p><p><strong>Step 3: The AI-answer check.</strong> Ask three different AI tools the exact question a prospect might type: "Who should I hire for [your niche] bookkeeping in [your city]?" I use ChatGPT, Claude, and Perplexity, because they pull from different sources. Note whether you show up. If you do, check whether what it says about you is current and accurate. This step didn't exist two years ago. It matters now.</p><p><strong>Step 4: The competitor scan.</strong> Run the same three searches and write down who shows up instead of you. Look at their sites for the pattern: do they name a specific niche, do they publish anything about pricing, do they have reviews that look real instead of generic five-star boilerplate.</p><p><strong>Step 5: Log it and set a date.</strong> Use a table like this one, and put a recurring reminder on your calendar to redo the whole thing in 90 days. Findability drifts. What ranked in January doesn't automatically rank in April.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">| Query                              | Do you show up? | Who shows up instead | What's missing |
|-------------------------------------|------------------|------------------------|-----------------|
| "[niche] bookkeeper [city]"         |                  |                        |                 |
| "[niche] bookkeeping near me"       |                  |                        |                 |
| Google Business Profile search      |                  |                        |                 |
| AI tool: "who should I hire for..." |                  |                        |                 |</code></pre></div><p>What "good" looks like at the end of this: you show up organically for at least one of the four checks. Your Google Business Profile is complete and current. At least one AI tool names you, or a firm exactly like you, when asked the direct question. If none of the four are true yet, don't panic. Now you know exactly which one to fix first, instead of guessing.</p><p>A note on the AI-tool check, since it's the newest of the four and the one most owners skip. These tools answer from whatever's already public about you. A thin or outdated website makes you invisible to them the same way it makes you invisible to a human searcher, just faster and at more scale. Fixing step one and step two usually fixes step three on its own within a few weeks, because the same signals feed all three. Run this worksheet once, fix the worst gap, then run it again. Don't assume nothing changed.</p><h3>I ran the audit on my own firm. Here's what happened.</h3><p>I didn't want to hand you a worksheet I hadn't used. So I ran it on my firm, SDO CPA, on August 10, 2026. I used a fresh, logged-out browser. Search results move by date and location, so treat this as a snapshot, not a forever ranking.</p><p><strong>The broad Google search was weak.</strong> For &#8220;CPA for business owners Dallas,&#8221; SDO did not appear in the eight organic results shown on page one. That is the kind of search a business owner might try before they know what kind of CPA they need.</p><p><strong>The narrow Google search was strong.</strong> For &#8220;partnership tax CPA Dallas,&#8221; the SDO homepage ranked first. An SDO article also ranked fifth. The specific position is working better than the broad one.</p><p><strong>The Google Business Profile was easy to find, but its message lagged behind the website.</strong> The profile showed the website, directions, current hours, a 4.7 rating, and 47 reviews. But it still led with a broad mix of tax preparation, accounting, and bookkeeping. The website now leads with business tax work for S-Corps, partnerships, and C-Corps. Those two stories should match.</p><p><strong>The AI answer was better than I expected.</strong> I asked Google the prospect-style question, &#8220;Who should I hire for partnership and S-Corp tax planning in Dallas?&#8221; Its AI Overview named SDO as one of the local options. The SDO Dallas page also showed up second in the normal results.</p><p><strong>The ten-second homepage test was mostly a pass.</strong> A stranger can quickly tell who the firm serves and what work it does. The page names the entity types, the complex tax work, and the year-round planning. What it does not say as clearly is who should not apply.</p><p>So the result was not &#8220;do more marketing.&#8221; It was much smaller:</p><ol><li><p>Make the Business Profile description, categories, and services match the site's narrow position. Do not stuff extra keywords into the business name.</p></li><li><p>Add one short &#8220;not a fit if&#8230;&#8221; block near the intake form.</p></li><li><p>Run the same four checks again in 90 days before chasing a broad search term.</p></li></ol><p>That is why the worksheet matters. The broad search made the firm look invisible. The narrow search and AI answer showed that the right message was already getting picked up. Without the full audit, I could have fixed the wrong problem.</p><h3>First implementation prompts (review before you apply anything)</h3><p>These are copy-paste prompts I actually hand to Claude or Codex when I need to run a piece of this system myself. Some setups can browse the web and even click around inside a page for you; others just read and write text. Either way, every prompt below is built to research or draft first, never to push a change to a live site or a client file without you looking at it. Read what comes back. Approve it, edit it, or throw it out. Never let it touch anything live on your own.</p><p>Prompt one, auditing your own site's findability (research only, no edits):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">You have browser access. I want a findability audit of my firm's website
and search presence, not any edits.

1. Search "[your niche] bookkeeper [your city]" and "[your niche]
   bookkeeping near me" in an incognito-style session and tell me where
   my site (URL: [your URL]) appears, if at all.
2. Look up my Google Business Profile by searching my business name and
   report what's filled in, what's missing, and whether the category and
   hours look current.
3. Read my homepage and my services page and tell me, in plain language,
   whether a stranger could tell in ten seconds who I serve and what I
   don't take.

Give me a short list of gaps, ranked by how much they'd matter to a
prospect. Don't change anything. I'll decide what to fix.</code></pre></div><p>Prompt two, drafting a referral line (draft only, no publishing):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Draft one short line I can add to my email signature and my invoice
footer that asks happy clients to refer someone, without sounding
needy or transactional. My firm is [describe your firm in one
sentence]. Give me three options at different lengths: one for an
email signature (under 15 words), one for an invoice footer (under 25
words), and one slightly longer version for a website footer.

Do not touch my actual email signature, invoice template, or website.
Give me the text. I'll paste it in myself after I pick one.</code></pre></div><p>Prompt three, turning your question log into a content plan (draft only):</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">Here is a list of every question a prospect asked me this month: [paste
your list]. Group these into 3 to 5 topics. For each topic, give me one
working title for a short piece of content that would answer it, and
one sentence on who it's for.

This is a planning exercise. Don't draft the actual content yet, and
don't publish anything anywhere. I want the topic list first so I can
pick which one to write.</code></pre></div><p>The pattern across all three: research or draft, then stop and hand it back to you. That boundary is the whole point. An AI tool that can browse and write is a genuine capability shift for a firm owner who isn't a marketer or a developer, but it's still your name on the site and your client's data in the file. Review before you apply, every time, no exceptions.</p><h3>Run the audit on your own firm</h3><p>Want to run the same audit on your firm? Download the free three-page worksheet below. It includes the exact prompt, a blank scorecard, and the SDO CPA example.</p><div class="file-embed-wrapper" data-component-name="FileToDOM"><div class="file-embed-container-reader"><div class="file-embed-container-top"><image class="file-embed-thumbnail" src="https://substackcdn.com/image/fetch/$s_!lk9t!,w_400,h_600,c_fill,f_auto,q_auto:best,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a5d0582-daef-40ff-a94b-9ba3f973b3f0_1200x800.png"></image><div class="file-embed-details"><div class="file-embed-details-h1">Findability Audit Worksheet</div><div class="file-embed-details-h2">260KB &#8729; PDF file</div></div><a class="file-embed-button wide" href="https://scalingclients.com/api/v1/file/4933330b-d382-4a1c-a9fd-eef99472d76e.pdf"><span class="file-embed-button-text">Download</span></a></div><div class="file-embed-description">Run the same findability audit I used on SDO CPA. Includes the exact prompt, a blank scorecard, and the worked example.</div><a class="file-embed-button narrow" href="https://scalingclients.com/api/v1/file/4933330b-d382-4a1c-a9fd-eef99472d76e.pdf"><span class="file-embed-button-text">Download</span></a></div></div><p> </p>]]></content:encoded></item></channel></rss>