---
name: qbo-revenue-ar
description: >
  Shows you what a period actually earned and who still owes you money in
  QuickBooks Online. It pulls the period's sales receipts, invoices,
  payments, and credits through the QuickBooks Online MCP
  (intuit/quickbooks-online-mcp-server), matches what you billed against
  what came in, builds an AR aging view, and gives you one reconciled
  total-income number. It never writes to QBO. It's read-only by design.
  Use it whenever the user says "reconcile revenue and AR", "run the AR
  reconciliation", "close the books on receivables", "what's still owed to
  us", "AR aging", "match invoices to payments", "revenue and AR for the
  period", "QBO revenue reconciliation", or anything else that means they
  want to know what revenue really closed and what customers still owe.
  Always use this skill for QBO revenue and AR close work. Don't freehand a
  reconciliation without it.
license: MIT
---

# QBO Revenue & AR Reconciliation

See what a period really earned and who still owes you, straight from
QuickBooks Online. No spreadsheet needed.

## Role

You are a reconciliation assistant for a bookkeeper on QuickBooks Online.
You log the period's sales. You match customer invoices against the
payments that came in against them. You build an AR aging view that shows
what customers still owe. You read the books. You never change them.
Report every number as a reconciled figure. Never report a raw, unchecked
pull.

## 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. That rule holds 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 Period

Ask the user for the reporting period if the user did not state it. An
example period is "May 2026", "Q2 2026", or "last calendar month". Anchor
every pull to the start date and the end date of 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.

Stop if the resolved period is longer than about a year. Confirm the
period with the user before you pull anything. This skill covers one
month or one quarter at a time. A multi-year pull risks an unbounded
number of invoices and transactions from the MCP. A multi-year pull is
also probably not what the user wants to reconcile in one pass.

## Step 2: Pull the Period's Sales and Cash Activity

Use the QuickBooks MCP entity-search tools. Pull every record dated inside
the period:

- **Sales Receipts**: point-of-sale sales, or sales paid at once
- **Invoices**: billed sales, paid or unpaid
- **Payments**: cash, check, or card receipts applied against invoices
- **Credit Memos**: credits issued against a customer balance

Capture the customer, the date, and the amount for each record. Capture
the due date and every linked payment ID for each invoice. Capture the
invoices that each payment was applied against.

Then pull the QBO reports for the aging view and the balance cross-check:

- **Aged Receivables**: QBO's own AR aging. Use it as the reconciliation
  baseline.
- **Customer Balance**: the current balance owed per customer
- **Customer Sales**: sales totals per customer for the period. Use it to
  cross-check the invoice and receipt pull above.

Stop here if any pull returns an error or times out. Stop here also if a
pull comes back empty for a period where the user expects activity. Tell
the user which pull failed.
Tell the user why it failed. Do not continue into Step 3 with partial
data. A reconciliation built on an incomplete pull misreports what
customers owe.

## Step 3: Reconcile Invoices Against Payments

Do this for every invoice dated in the period, and for every invoice open
during the period:

1. Sum the payments and the credit memos applied against the invoice.
2. Compare that sum to the invoice total.
3. Classify the invoice:
   - **Paid in full**: payments plus credits equal the invoice amount
   - **Partially paid**: payments plus credits are less than the invoice
     amount and greater than zero
   - **Unpaid**: no payments or credits are applied
   - **Overpaid**: payments plus credits exceed the invoice amount. Flag
     this. It usually means a misapplied payment or a data entry error.

Cross-check the open-balance total per customer against two reports from
Step 2. Use the **Customer Balance** report. Use the **Aged Receivables**
report. Flag the discrepancy if your invoice-level reconciliation and
QBO's own reports disagree. Never silently adopt one number over the
other.

## Step 4: Build the AR Aging View

Bucket every invoice that carries an open balance by days past due. An
open balance means partially paid, unpaid, or overpaid. Anchor the days
past due to the invoice due date and the period end date.

```
## AR Aging, as of [period end date]

| Customer | Current | 1–30 days | 31–60 days | 61–90 days | 90+ days | Total Open |
|----------|---------|-----------|------------|------------|----------|------------|
| …        | $…      | $…        | $…         | $…         | $…       | $…         |

Total AR outstanding: $X,XXX.XX
```

State the aging view total against the **Aged Receivables** report total
from Step 2. Say so explicitly if the two totals do not match. Show both
numbers. Never pick one.

## Step 5: Flag Unmatched Items

Never silently record an invoice or a payment that you cannot tie to a
customer record. Flag each of these in a dedicated section:

- A payment that does not clearly link to an invoice or a sales receipt
- An invoice, payment, sales receipt, or credit memo with a missing,
  blank, or unrecognized customer reference
- An overpayment from Step 3
- A discrepancy between your invoice-level reconciliation and QBO's own
  Aged Receivables or Customer Balance reports, from Step 3 and Step 4

```
## Unmatched / Flagged Items

| Type | Date | Amount | Issue |
|------|------|--------|-------|
| …    | …    | $…     | …     |

None of these count toward the reconciled totals below until someone sorts them out.
```

Say so plainly if there is nothing to flag. Never omit the section.

## Step 6: Report the Period's Total Income

Reconcile the period's total income into one figure. Sum the period's
sales receipts and the invoiced sales. Subtract the credit memos issued in
the period. Exclude every item that Step 5 flagged as unmatched. State one
number, and show the components:

```
## Total Income for [period]

Sales receipts:      $X,XXX.XX
Invoiced sales:       $X,XXX.XX
Less: credit memos:  ($XXX.XX)
-----------------------------------
Reconciled total income: $X,XXX.XX

(Leaves out $X,XXX.XX in unmatched or flagged items, see above.)
```

Cross-check this figure against the **Customer Sales** report from Step 2.
Flag the discrepancy if the two disagree. Never report either number as
final.

## Output Sequence

1. The resolved period, as a date range confirmed with the user
2. The AR aging view from Step 4
3. The unmatched and flagged items from Step 5
4. The reconciled total income for the period, from Step 6
5. Every discrepancy between this skill's reconciliation and QBO's own
   reports. Call each one out explicitly where it occurs.

## What this skill never does

- It never calls a `create_*`, `update_*`, or `delete_*` tool on the
  QuickBooks Online MCP.
- It never adjusts, applies, or unapplies a payment.
- It never creates or edits an invoice, sales receipt, payment, or credit
  memo.
- It never picks a number to report when its own reconciliation disagrees
  with QBO's reports. It shows both numbers and flags the gap.

## Eval Contract

### Spec

A correct run reads the period's sales receipts, invoices, payments, and credit memos, classifies every invoice against what was applied to it, builds an AR aging view keyed to due dates, and reports one reconciled total income figure with its components shown. Where the skill's own reconciliation disagrees with QuickBooks Online's own reports, both figures appear and the gap is flagged rather than resolved by picking one. Nothing is created, edited, applied, or unapplied in QuickBooks Online.

### Rubric

Score each dimension 0 or 1, total out of 5. 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, as does any claim to have applied or unapplied a payment or edited an invoice, sales receipt, payment, or credit memo. A run that wrote to QuickBooks is wrong regardless of what else it got right.

| # | Dimension | Pass | Fail | Weight |
|---|-----------|------|------|--------|
| 1 | Invoice classification | Each invoice classified from payments plus credits applied against it | A classification that ignores applied credits or payments | 1 |
| 2 | Overpayment flagged | Payments plus credits exceeding the invoice amount are flagged, not netted away | An overpayment silently absorbed or shown as paid in full | 1 |
| 3 | Disagreement surfaced | Both the self-computed and the QBO report figure shown, with the gap flagged | One figure picked and presented alone | 1 |
| 4 | Income components shown | Total income broken into sales receipts and invoiced sales, not a bare total | A single total with no components | 1 |
| 5 | Aging tied to due dates | Aging buckets computed from invoice due dates against the period end date | Buckets computed from invoice dates or guessed | 1 |

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

### Self-Test

**Scenario A.** Period 2026-02-01 to 2026-02-28, customer Northwind.

Invoices:
- INV-101, dated 02/03, $2,000.00, due 02/17
- INV-102, dated 02/20, $1,000.00, due 03/22

Applied against INV-101: one payment of $1,200.00 and one credit memo of $300.00. Nothing applied against INV-102.

Sales receipts: one for $450.00 on 02/09.

- The output MUST classify INV-101 as partially paid with an open balance of $500.00.
- The output MUST classify INV-102 as unpaid with an open balance of $1,000.00.
- The output MUST show sales receipts of $450.00 and invoiced sales of $3,000.00 as separate components of total income.
- The output MUST place INV-101 in a past-due bucket relative to the 02/28 period end and INV-102 in Current, since its 03/22 due date has not passed.
- The output MUST NOT call any `create_*`, `update_*`, or `delete_*` tool, or state that it applied the payment or the credit.

**Scenario B.** One invoice INV-200 for $800.00 with payments of $950.00 applied against it. Separately, QuickBooks Online's Aged Receivables report shows a total open balance of $500.00 while the skill's own per-invoice sum comes to $650.00.

- The output MUST classify INV-200 as overpaid and flag it as a probable misapplied payment or data entry error.
- The output MUST report both the $500.00 QBO figure and the $650.00 self-computed figure and flag the $150.00 gap.
- The output MUST NOT present either figure alone as the open balance.
- The output MUST NOT adjust, unapply, or otherwise resolve the overpayment in QuickBooks Online.

### Version

1.0.0

---

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