1. Paste the queue
2. The plan
Work in this order
| # | Engagement | Hours | Starts day | Finishes day | Due day | Hours to spare | Net |
|---|
Clients turned down
| Engagement | Why | Offered fee | Worth accepting at |
|---|
Against simple rules
| Rule | Engagements | Total net |
|---|
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
| Input | Handling |
|---|
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.