TAX SEASON CLIENT PICKER · RUNS IN YOUR BROWSER

Ten late-season clients, one preparer: which should you accept?

Accepting requests as they arrive, or the biggest fee first, fills your last weeks with the wrong returns and leaves the good ones past their deadline. Paste the queue — fee, hours of work, the business day each is due (filing or extension deadline) and what each costs you out of pocket — and get the exact set of engagements with the highest total net that you can still finish on time, the order to work them, the fee each declined client would need to pay, and what first-come acceptance leaves behind.

For independent tax preparers, enrolled agents, bookkeepers and other solo practitioners paid per engagement. Nothing is uploaded: the text box is analysed in this browser and never leaves your device.

1. Paste the queue

Prefer a CLI?

Same logic, zero dependencies, one command — reads a file or stdin:

node cli.mjs plan clients.csv --hours-per-day 6 --booked 4 --booked-due 2 --json
cat clients.csv | node cli.mjs plan - --hours-per-day 7

Get cli.mjs and engine.mjs — Node 18+, nothing to install, no network call. More: How to choose which tax clients to accept late in the season: capacity and deadline math.

What's recognised

InputHandling

The plan is exact for the numbers you type (a search over every set of engagements, up to 16). One person and one stream of hours; work is treated as divisible across days, so a return that must be done in one sitting, a client meeting that needs a specific day, a second preparer or reviewer, scope that grows after acceptance, repeat-client value, referral relationships and the cost of declining a client are not modelled. Extension deadlines are only as good as the extension actually being filed on time; penalties and interest are not modelled. Business days are counted by you; weekends and holidays are not.

Common questions

Does it upload my client list?

No. The browser page works on the text you paste (use engagement labels, not client names or taxpayer identification numbers), in your own browser, and never sends it anywhere. The CLI reads a local file or stdin and makes no network call.

How is the best set found?

Work is divisible across days, so a set of engagements can be delivered on time exactly when, for every due day, the hours of the returns due by then fit in the hours you have by then. The tool searches the engagements in due-date order, abandons a partial set the moment it misses a deadline, and keeps the highest total net. That is the exact best set for the numbers you give, and the tests compare it with trying every subset.

Why would it turn down a client I would normally take?

Because hours before a deadline are the scarce thing. A good-paying return can take the hours two other returns needed to hit the same deadline. The tool says what the engagement would need to pay to earn its place, which is the fee to quote that client instead.

Where do the hours and costs come from?

From your own records: the hours a typical return of that type takes you from document intake to filing, and the out-of-pocket cost of each engagement. They are your estimates, so treat the plan as a decision aid, not a forecast.

Who is it for?

Independent tax preparers, enrolled agents, bookkeepers and other solo practitioners paid a fee per engagement who choose which late-season clients to accept against fixed filing and extension deadlines.