--- 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/).