QuickBooks with AI: Invoice, Report, and Reconcile from a Chat

Most small-business accounting is repetitive operational work. Create an invoice for last week's hours, send it to the customer, and record the payment when it hits the bank. Pull a P&L for the quarter, export an aged-receivables report, check which customers are 30+ days overdue. Batch-update item prices, void an invoice that was sent to the wrong contact, reconcile what changed this week across customers, invoices, bills, and payments.
Each of those is a 5–10 minute task in the QuickBooks UI and a 20-second task as a chat message — if your AI agent can actually call the QuickBooks API. This guide is the use-case version of "AI + QuickBooks": what you ask, what the agent does, what comes back. The protocol underneath is MCP (Model Context Protocol), the bundle is /skills/quickbooks on MCPBundles, but the framing here is workflow-first.
Create, send, and track invoices without opening QuickBooks
You ask: "Create an invoice for Acme Corp — 10 hours of consulting at $200/hr, due net-30. Send it to their billing email."
Your AI does: Looks up the Acme Corp customer record by name. If there are multiple Acme entries, it narrows by most recent activity or asks you to pick. Creates an invoice with one line item: 10 hours × $200 = $2,000, sets payment terms to net-30, and calculates the due date from today. Reads back the invoice details (invoice number, customer, total, due date) so you can confirm, then sends it directly from QuickBooks to the customer's billing email on file. Returns the invoice ID and a QuickBooks UI link so you can review if needed.
Follow-up 10 days later: "Did Acme pay invoice #1234?" Your AI reads the invoice, sees balance > 0, and tells you it's still open.
Follow-up 30 days later: "Find all overdue invoices and show me the total outstanding by customer." Your AI runs a query for DueDate < today AND Balance > 0, groups by customer, and returns a ranked list with aging buckets (0–30 days, 31–60, 61–90, 90+).
Pull financial reports on demand
You ask: "What's our P&L for Q1 2026?"
Your AI does: Calls the Profit & Loss report tool with start date 2026-01-01 and end date 2026-03-31. QuickBooks returns revenue, cost of goods sold, expenses, and net income — structured by account. Your AI summarizes the headline numbers: total revenue, total expenses, net profit (or loss), gross margin percentage. If you ask "which expense category grew the most vs Q4?", it fetches Q4 P&L and compares line-by-line.
The same workflow applies to Balance Sheet ("What's our cash position as of April 1?"), Cash Flow ("Show me cash inflows and outflows for the last 90 days"), Aged Receivables ("Who owes me money and how overdue?"), Aged Payables ("What bills are we behind on?"), and Trial Balance ("Show me debits and credits across all accounts").
Every report is a single tool call. Your AI reads the structured output and answers your question — no CSV export, no pivot tables, no copy-paste from the QuickBooks UI.
Batch-update entities when prices change
You ask: "Our hourly consulting rate just went up to $250. Update all items in QuickBooks that have 'Consulting' in the name."
Your AI does: Queries all items where Name LIKE '%Consulting%', returns the matches (likely "Consulting Services", "Senior Consulting", "Technical Consulting", etc.). Loops through each item, reads its current sync_token (QuickBooks' optimistic-lock version number), updates the unit price to $250, and writes the change back with the token. QuickBooks validates each write against the token to prevent overwriting concurrent edits. Your AI returns a summary: "Updated 4 items" with the names and new prices.
The same pattern works for batch customer updates ("Add a 2% late fee to all overdue invoices"), vendor updates ("Change payment terms to net-45 for all suppliers in the Construction category"), and account reclassification ("Move all 'Office Supplies' expenses from 2024 to the new 'SG&A' parent account").
Track what changed for reconciliation
You ask: "What invoices, payments, customers, and bills changed in the last 7 days?"
Your AI does: Runs four queries in parallel — one for each entity type — filtering MetaData.LastUpdatedTime > (today - 7 days). Returns a grouped summary: "12 invoices modified (3 new, 9 paid/updated), 5 customers added, 18 payments recorded, 2 bills updated." If you ask "Show me the details for the 9 updated invoices", it expands just that subset with invoice numbers, customer names, amounts, and what changed (status, balance, due date, etc.).
Useful for weekly reconciliation, auditing who edited what, and catching accidental changes before they snowball. Your AI filters the noise and surfaces the transactions that matter.
Void, credit, and refund without breaking the audit trail
You ask: "Void invoice #5678 — we sent it to the wrong customer."
Your AI does: Reads invoice #5678 to confirm it exists and hasn't already been voided. Calls the void-invoice tool (which sets the invoice status to Voided and zeroes the balance without deleting the record — QuickBooks' audit-trail requirement). Returns confirmation: "Invoice #5678 voided. Original amount $1,500 zeroed, record retained."
Credit memos work the same way: "Issue a $200 credit to Acme Corp for the late delivery" creates a CreditMemo entity linked to the customer, which QuickBooks applies against their next invoice or refunds if requested.
Refunds require a two-step dance: create the credit memo, then create a RefundReceipt pointing at it. Your AI handles both in sequence: "Refund Acme Corp $500 for the cancelled project" creates the credit, issues the refund receipt, and marks the original invoice as settled.
The SQL-like query language
QuickBooks API reads use a SQL-esque query syntax: SELECT * FROM Invoice WHERE CustomerRef = '42' AND TxnDate > '2026-01-01' ORDER BY TxnDate DESC. Your AI generates these queries based on your natural language:
- "Find all invoices for Acme Corp in Q1" →
SELECT * FROM Invoice WHERE CustomerRef.Name = 'Acme Corp' AND TxnDate >= '2026-01-01' AND TxnDate <= '2026-03-31' - "Show customers added in the last 30 days" →
SELECT * FROM Customer WHERE MetaData.CreateTime > '2026-03-15' - "List all unpaid bills" →
SELECT * FROM Bill WHERE Balance > '0'
The AI reads the results, interprets the structured JSON, and answers your question in plain language. You never see the query syntax unless you ask.
Setup
Setup uses QuickBooks' OAuth2 flow:
- Enable the QuickBooks bundle on MCPBundles
- Authorize the app to your QuickBooks Online company (OAuth prompts you to select which company and grant permissions)
- The credential receives scoped permissions — read and write access to customers, invoices, payments, items, reports, etc.
- Ask your AI: "What's our current cash position?"
Your AI calls the QuickBooks API as your account with the permissions you granted. No manual token management, no API key rotation.
FAQ
Can my AI access my live QuickBooks data?
After OAuth completes, the agent has direct access to your QuickBooks Online company data. For testing or onboarding, flip the credential to sandbox mode so calls land against an Intuit sandbox company instead of production books.
What about multi-entity accounting?
Each credential binds to one QuickBooks company, so multi-entity setups need a separate credential per entity. The agent can ask which company you're working on and switch context between calls.
Is there a sandbox mode?
Toggle "Use QuickBooks sandbox API" in credential settings to route every call to Intuit's sandbox environment. Sandbox companies are free Intuit-provided test books, so you can rehearse workflows without touching live data.
Can my AI send invoices to customers?
The send-invoice tool emails the invoice directly from QuickBooks to the customer's billing address on file. The full pattern is two calls — create the invoice, then send it — and the agent chains them automatically when you ask for both.
How does the sync-token model work?
Every write needs a fresh sync_token from QuickBooks to prevent overwriting concurrent edits. The agent reads the entity first, captures its current token, and includes it in the write call. That handshake happens automatically; you only see tokens if you're chasing a low-level bug.