# Month-End Close Prep

> Reconciles bank, processor, AR and AP exports into a close packet with tie-outs shown. Unexplained variance is a finding — it never plugs. Never posts entries.

- Agent: Claude Code
- Plan: Starter (1 vCPU, 2 GiB RAM, 10 GiB disk)
- Forks: 0 · Stars: 0
- Creator: https://www.jurniti.com/creator-ca0ff2
- Tags: accounting, bookkeeping, claude-code, close, quickbooks, small-business
- Requires config (you provide): ANTHROPIC_API_KEY
- Skills: month-end-close

**To fork:** open https://www.jurniti.com/templates/month-end-close-prep and use the Fork action — it starts a Stripe Checkout for a new VM seeded with this template's persist disk (same flat plan price, no fork fee).

## README

# The bank is off by $340. Do not plug it.

It's the fifth of the month. The bank doesn't tie to the ledger, the Stripe
payout got booked net so the fees vanished into revenue, and two bills dated last
month were entered this month.

The temptation is one plug entry to make the $340 go away. That's how a real
problem stays invisible for a year.

## The rule this template exists for

**Unexplained variance is a finding, not a rounding error.** The rules file
forbids proposing a plug entry, ever. If the numbers don't tie, you get the exact
amount and a list of candidate causes — not a way to make it disappear.

## The six steps, in order

Order matters, because each step's output feeds the next:

1. **Bank reconciliation** — statement vs ledger, uncleared items aged, anything
   over 60 days flagged.
2. **Processor settlement** — gross vs net vs what actually landed. Fees are an
   expense, not a revenue reduction; a ledger booking net is a finding.
3. **AR aging** — 30/60/90+, past-90 flagged for a reserve conversation.
4. **AP / accrued** — unrecorded bills for the period. In-period bill entered
   next month is a cut-off error.
5. **Cut-off test** — the last five and first five transactions either side of
   the close date.
6. **P&L narrative** — variance vs prior month, with a cause per line over your
   materiality threshold.

## Tie-outs are printed

Every reconciliation shows both sides and the difference. "Reconciled" with no
arithmetic is an assertion, not a reconciliation.

The packet leads with **Exceptions** — the section your bookkeeper actually
reads — then each step, then a **For your CPA** list of questions you shouldn't
answer yourself, then **MISSING**: exports you never sent. A close packet built
without the AR aging isn't one, and it says so up front instead of quietly
proceeding.

## What you supply

Your own Claude Code login — and exports. Bank CSV, processor payout report,
trial balance / P&L / AR aging, dropped into `~/close/exports/`.

No QuickBooks API key. Exports are the input, which is exactly why nothing can
post to your books.

## The guard is a file, not a promise

`~/close/policy/CLOSE-RULES.md` carries `NEVER_POST_ENTRIES`, the no-plug rule,
the six-step sequence and your materiality threshold. The skill reads it before
every run. Leave the threshold blank and every variance gets reported — safe,
and noisy.

## Where this stops

It reconciles and drafts. It does not connect to QuickBooks, post journal
entries, or adjust the books.

It won't opine on tax treatment or deductibility — those route to your CPA on
purpose — and it will never tell you the books are closed. It prepared a packet;
a human closes.

Verified on build: the skill, the working tree, the `NEVER_POST_ENTRIES` guard,
the no-plug rule and the six-step sequence are present on a fresh fork. Running
it on your own exports is yours to do.
