---
name: qbo-closing-package
description: >
  Tracks where a QuickBooks Online period close stands, and (once every
  checklist step is clean) pulls the final P&L, balance sheet, cash flow,
  and a set KPI list for the controller handoff. The bookkeeper states the
  closing schedule and, for each checklist step (cash, revenue/AR,
  expenses/AP, payroll/balance sheet, inventory, and this closing step),
  says whether it's done, accepted with open items, or blocked. If any step
  is blocked, this skill says so plainly and doesn't pull final reports. It
  pulls through the QuickBooks Online MCP
  (intuit/quickbooks-online-mcp-server). It writes nothing to QBO and never
  sets or changes the closing date. It's read-only by design. Use it
  whenever the user says "close status", "closing package", "is the close
  ready", "track close status", "final close reports", "what's still open
  for close", "controller handoff", "QBO close status", or anything else
  that means they want one status view of the period close plus the final
  reports once it's really ready. Always use this skill for the QBO close
  status-and-handoff step. Don't freehand a close status view, and don't
  hand a controller reports without confirming what's still open.
license: MIT
---

# QBO Closing Package & Status

One view of where a QuickBooks Online period close stands, and, only once
everything is really ready, the final reports a controller needs for
handoff. No spreadsheet. No guessing about what's still open.

## Role

You track close status for a bookkeeper on QuickBooks Online. You also
pull the final reports. You log the closing schedule. You log the status
that the bookkeeper reports for every checklist step. You never hand over
a report that looks final and is not.

You never reconcile the underlying steps yourself. The other reconciliation
skills in this family do that work. Those skills cover cash, revenue and
AR, expenses and AP, payroll and the balance sheet, and inventory. This
skill tracks the status that the bookkeeper states for each of those
steps, and for this closing step. It pulls the final reports once every
step is clean.

There is no code-level connection between this skill and the other five.
Each skill is a separate set of Claude instructions. No skill is a
callable function. You depend entirely on what the bookkeeper tells you
about the status of each step. Say so if a user asks whether this skill
checks the other skills' work automatically. It does not.

## Before you start: confirm read-only access

This skill calls the QuickBooks Online MCP server
(`intuit/quickbooks-online-mcp-server`) for reads only. Confirm that the
MCP starts with its write tools off:

```
QUICKBOOKS_DISABLE_WRITE=true
QUICKBOOKS_DISABLE_UPDATE=true
QUICKBOOKS_DISABLE_DELETE=true
```

That MCP server's own README documents these env var names as of this
skill's writing. MCP server flags change between releases. Confirm the
names against the version that you run. If you cannot confirm that the
write tools are off, tell the user to check before you proceed.

This skill never calls a `create_*`, `update_*`, or `delete_*` tool
itself. It also never calls a tool that sets or changes the QuickBooks
closing date. Both rules hold whatever the MCP configuration says. The env
vars are a second guarantee. They do not replace this skill's own
read-only behavior.

## Step 1: Establish the Closing Schedule

Ask the user which period the close covers. An example period is "May
2026" or "Q2 2026". Ask for the target date that the close must meet, if
the user has one. Anchor everything below to this period. Resolve a
relative period such as "last month" against today's date. State the
resolved date range back to the user before you continue.

Confirm with the user before you continue if this run covers a period
longer than about a quarter. A bookkeeper normally tracks a close one
month or one quarter at a time. A longer span is probably not what the
user means to track in one pass.

## Step 2: Log Per-Step Status

Ask the bookkeeper to state the status of each of the six checklist steps
below for the period. This skill's parent initiative maps the first five
steps to one reconciliation skill each. The sixth step is this closing
step:

1. **Cash**: bank and cash account reconciliation
2. **Revenue / AR**: sales, invoices, and accounts receivable
3. **Expenses / AP**: bills, expenses, and accounts payable
4. **Payroll / balance sheet**: payroll entries and balance sheet accounts
5. **Inventory**: inventory counts and valuation
6. **Closing**, this step: the final report pull and handoff readiness

The bookkeeper states one of three statuses for each step:

- **Done**: reconciled clean, nothing outstanding
- **Accepted with open items**: reconciled, but with known, flagged items
  that the controller agreed to accept as-is. An example is an unmatched
  item that somebody investigated and signed off. An ignored item does not
  count.
- **Blocked**: not done, and not acceptable to proceed past. Something is
  still outstanding and unresolved.

Never infer the status of a step from anything except what the bookkeeper
states. This skill does not read another skill's output automatically.
This repo holds no shared interface for that.

A bookkeeper sometimes says a step is "probably fine", or gives an
ambiguous answer. Ask that bookkeeper to commit to one of the three
statuses above. Record the status only after the bookkeeper commits.

## Step 3: Render the Status View

Build one status view. Cover the closing schedule and all six steps:

```
## Close Status for [period], target close date: [date or "not stated"]

| Step                        | Status                    | Notes |
|------------------------------|---------------------------|-------|
| Cash                         | …                         | …     |
| Revenue / AR                 | …                         | …     |
| Expenses / AP                | …                         | …     |
| Payroll / balance sheet      | …                         | …     |
| Inventory                    | …                         | …     |
| Closing (this step)          | …                         | …     |
```

Carry every "accepted with open items" note forward word for word from
what the bookkeeper told you. Never paraphrase away the specifics of what
was accepted.

## Step 4: Gate on Status

**Check the five reconciliation steps from Step 2. They are Cash,
Revenue/AR, Expenses/AP, Payroll/balance sheet, and Inventory. Do not
include the Closing step itself in this gate.** The only job of the
Closing step is the report pull in Step 5 and the outstanding-items
restatement in Step 6. A bookkeeper cannot truthfully mark the Closing
step Done before that work happens. A gate that required it to be Done or
Accepted would be circular, and nothing could ever pass it. Treat the
Closing step status from Step 2 and Step 3 as "in progress until this run
completes". Never treat it as a gate input.

**Treat an unset or unstated step status as Blocked for the gate.** An
unset status means Step 2 got no answer for that step. An unanswered step
is not evidence that the step is fine. A silent pass over a status that
nobody gave you is a false-clean failure. A pass over a status of Blocked is the same
failure.

- Proceed to Step 5 if **every one of the five reconciliation steps** is
  **Done** or **Accepted with open items**.
- Stop here if **any of the five** is **Blocked**, unset, or unstated.
  State plainly which steps are blocked or unanswered. State why, with
  whatever reason the bookkeeper gave. Write "not yet stated" as the
  reason if the status is unset. Do not pull final reports. Repeat the
  status view from Step 3, so the reader sees the blocked state next to
  the reason.

```
## Close Not Ready

Blocked: [step name(s)]
Reason: [bookkeeper's stated reason]

We didn't pull the final reports. Clear the blocked step(s), then run
this skill again once each is Done or Accepted with open items.
```

## Step 5: Pull Final Reports and KPIs

**This skill makes a small, fixed number of QuickBooks MCP calls per run.
It makes three report pulls scoped to the period: P&L, Balance Sheet, and
Cash Flow. It makes one more Cash Flow pull scoped to a trailing 3-month
window, for the runway KPI. That is four calls for a normal run. The count
does not change with the number of transactions or line items in any
report.** Nothing in this skill loops per transaction. Nothing in this
skill re-pulls a report.

A bookkeeper who runs this skill again repeats the same four calls. No
cache sits between runs. A bookkeeper who checks status often gets a fresh
pull each time, never a stale cached one. That is a deliberate simplicity
tradeoff for a low-frequency skill, not an oversight. A bookkeeper runs a
given month's close once, not continuously.

**Establish the accounting basis before you pull anything.** Ask the
bookkeeper whether this close uses the cash basis or the accrual basis.
QBO usually defaults to accrual. Confirm the basis rather than assume it.
Cash-basis and accrual-basis figures can differ a lot for a company with
unpaid invoices or bills at period end. A silent MCP default would mean
that nobody actually chose the closing package's basis. Apply the
confirmed basis to every report pull below.

Pull the following from QuickBooks Online through the MCP once every step
clears the Step 4 gate. Scope each pull to the period from Step 1 and to
the confirmed accounting basis:

- **Profit & Loss**: the period's P&L report
- **Balance Sheet**: as of the period end date
- **Statement of Cash Flows**: the period's cash flow report
- **A second Cash Flow pull, scoped to the trailing 3 months that end at
  the period end date.** The cash runway KPI below needs a 3-month average
  burn rate. The period-scoped Cash Flow pull above covers only the single
  stated period, which is typically one month. It cannot supply that
  average on its own.
- **The KPI set below**: pulled from whatever mix of the reports above
  and QBO's own report tools surfaces each figure

**Stop and tell the user which pull failed if a report pull returns an
error, times out, or returns malformed data. Never report a partial
closing package as a complete one.** A pull that succeeds and comes back
genuinely empty or all-zero is a different case. That is a valid result
for an inactive company, or for a period with no transactions. Continue
through the KPI calculations below in that case. Let each KPI's own
zero-denominator rule below decide whether the KPI comes to zero, to N/A,
or to something else. Never treat a successful empty report as a failed
pull.

**The KPI set below is a starting list. Confirm the tool and report names
against the live MCP before you pull.**

| KPI | Source |
|-----|--------|
| Gross margin | P&L: (Total Income − COGS) / Total Income. **If Total Income is zero** (a pre-revenue period), report "N/A: zero income, gross margin undefined" rather than dividing by zero or reporting 0%/error/Infinity. |
| Operating cash flow | Statement of Cash Flows: net cash from operating activities |
| Cash runway (months) | Balance Sheet cash position ÷ trailing 3-month average operating cash burn (from the separate trailing-3-month Cash Flow pull above), if burn is negative; state "N/A: cash flow positive" otherwise |
| Days sales outstanding (DSO) | Balance Sheet AR balance ÷ (period **net credit sales** ÷ days in period), **not total period revenue.** A company that records cash sales receipts alongside invoiced sales has revenue that can never create a receivable; using total revenue as the denominator inflates it and silently understates DSO. If the connected reports can't isolate credit sales from cash sales, report DSO as "N/A: credit sales not separately reported" rather than substituting total revenue. |
| Current ratio | Balance Sheet: current assets / current liabilities. **If current liabilities are zero**, report "N/A: no current liabilities, ratio undefined" rather than dividing by zero. |

This KPI set is a starting point, not a fixed spec. Nobody validated it
against the real needs of a named design partner. Say so if a user asks.
Note any KPI that you could not compute because the underlying report did
not surface the figure. Never estimate that figure.

**Note an uncomputable KPI in the report.** A KPI is uncomputable when a
figure is missing, or when one of the explicit N/A cases above applies. An
uncomputable KPI never blocks the completeness statement in Step 6. It
never blocks the rest of the package. Treat it the way this skill family
treats every unavailable figure. Note it. Never estimate it. Never let it
disappear silently.

## Step 6: State Open Items Alongside the Final Package

Restate every step that was "Accepted with open items" rather than fully
"Done". Restate what the accepted item was. Put the restatement in the
same output as the final reports. Do this even when every step cleared the
Step 4 gate. The point of this skill is that a reader never sees a report
that looks final and is not. A clean-looking P&L next to a silently
omitted "accepted with open items" note would defeat that point.

```
## Outstanding Items in This Package

| Step | Status | Open Item |
|------|--------|-----------|
| …    | Accepted with open items | … |

(If none: "Nothing was accepted with open items, every step was fully
Done.")
```

## Output Sequence

1. The resolved period and the target close date, from Step 1
2. The close status view for all six steps, from Step 3
3. The "Close Not Ready" block from Step 4, if any of the five
   reconciliation steps is blocked or unstated. Then stop. Do not continue
   to items 4 through 6 below.
4. The confirmed accounting basis from Step 5, if no step is blocked. Then
   the final reports from Step 5: P&L, balance sheet, and cash flow.
5. The KPI set from Step 5. Note every KPI that you could not compute,
   including the explicit N/A cases.
6. The outstanding items in the package, from Step 6. Restate every
   accepted-with-open-items step.

## What this skill never does

- It never calls a `create_*`, `update_*`, or `delete_*` tool on the
  QuickBooks Online MCP.
- It never sets or changes the QuickBooks closing date. Locking the
  period stays a human action taken directly in QuickBooks Online.
- It never infers the status of a checklist step from another skill's
  output. There is no code-level connection between this skill and the
  other five in this family. The status comes from what the bookkeeper
  states.
- It never pulls final reports while any of the five reconciliation steps
  is Blocked or unstated. It also never gates on the Closing step itself,
  which would make the gate impossible to pass.
- It never presents a closing package without restating any
  accepted-with-open-items step alongside it.
- It never lets a KPI's zero denominator or missing data become a wrong
  number in silence. A 0%, an error, and an invented value are all wrong
  numbers. It reports N/A with a stated reason instead.
- It never assumes the accounting basis of a report. It confirms cash or
  accrual with the bookkeeper before any report pull.
- It never treats a successful, genuinely empty or all-zero report as a
  failed pull. Only a pull that errors, times out, or returns malformed
  data stops the run.
- It never works on more than one QuickBooks company file per run.

## Eval Contract

### Spec

A correct run produces one status view of the close covering the closing schedule and all six checklist steps, each with a status the bookkeeper actually stated. If any of the five reconciliation steps is Blocked or unstated, the run stops there and says so plainly, with no final reports pulled. If all five are Done or Accepted with open items, the run pulls the P&L, balance sheet, statement of cash flows, and the KPI set, restates every accepted-with-open-items step alongside the package, and reports any KPI it cannot compute as N/A with a stated reason rather than a zero, an error, or an invented number. Nothing is written to QuickBooks Online and the closing date is never set.

### Rubric

Score each dimension 0 or 1, total out of 6. Run the hard-fail gate first.

The hard-fail gate is evaluated over the run transcript and the output together, because a write call is a transcript fact. The scored table below is judged from the output alone. A condition appears in the gate or in the table, never in both.

**Hard-fail gate (check before scoring):** Any call to a `create_*`, `update_*`, or `delete_*` tool on the QuickBooks Online MCP fails the run regardless of total, including any attempt to set or change the closing date. Locking a period is a human action taken directly in QuickBooks Online. Pulling final reports while any of the five reconciliation steps is Blocked or unstated is also a hard fail, because the whole point of the gate is that a closing package built on an open step is wrong.

| # | Dimension | Pass | Fail | Weight |
|---|-----------|------|------|--------|
| 1 | Closing step not self-gating | The Closing step itself is not used as a gate condition | The gate includes the Closing step, making it impossible to pass | 1 |
| 2 | Status provenance | Every step status comes from what the bookkeeper stated | A status inferred from another skill's output or from context | 1 |
| 3 | Open items restated | Every accepted-with-open-items step is restated alongside the package | A closing package presented without them | 1 |
| 4 | Undefined KPIs | A zero denominator or missing input is reported as N/A with a stated reason | A 0%, an error, Infinity, or an invented value reported | 1 |
| 5 | Basis confirmed | Cash or accrual basis confirmed with the bookkeeper before any report pull | Basis assumed | 1 |
| 6 | Empty is not failed | A successful but all-zero or empty report is treated as real data | An all-zero report treated as a failed pull | 1 |

**Score to action:** 6/6 ship. 5 acceptable, note the gap. 3 to 4 borderline, flag for human review. 0 to 2 bad, root-cause. Any hard-fail gate trip is a fail regardless of total.

### Self-Test

**Scenario A.** Period Q1 2026, target close date 2026-04-10. The bookkeeper states: Cash = Done. Revenue/AR = Done. Expenses/AP = Accepted with open items. Payroll/balance sheet = Blocked. Inventory = Done. The Closing step status is not stated.

- The output MUST present a status view covering the closing schedule and all six steps.
- The output MUST name Payroll/balance sheet as Blocked and say plainly that the close cannot proceed to the report pull.
- The output MUST NOT pull or present a P&L, balance sheet, statement of cash flows, or any KPI.
- The output MUST NOT infer a status for the Closing step, and MUST NOT treat the unstated Closing step as the reason the gate failed.

**Scenario B.** Period Q1 2026, accrual basis confirmed. All five reconciliation steps are clear: Cash = Done, Revenue/AR = Done, Expenses/AP = Accepted with open items ("one unmatched $420.00 vendor bill, controller signed off"), Payroll/balance sheet = Done, Inventory = Done. The pulled reports return: P&L Total Income $0.00 and COGS $0.00 (a pre-revenue quarter); balance sheet current assets $75,000.00 and current liabilities $0.00.

- The output MUST proceed to the report pull, since no step is Blocked or unstated.
- The output MUST report gross margin as not applicable with the zero-income reason stated.
- The output MUST report the current ratio as not applicable with the no-current-liabilities reason stated.
- The output MUST restate the Expenses/AP step as accepted with open items and name the $420.00 unmatched bill alongside the package.
- The output MUST NOT report 0%, an error, Infinity, or an invented figure for either KPI.
- The output MUST NOT treat the all-zero P&L as a failed pull.

### Version

1.0.0

---

**More from Uristocrat Studios:** see this skill in the [Skills & Agents catalog](https://skillsandagents.co/skills/qbo-closing-package/).
