Intuit's sandbox companies are region specific QuickBooks Online companies filled with sample data, at most ten per developer account and active for two years (Create and test with a sandbox company). The sample data cannot be reset, nothing can be imported into or exported from a sandbox, payroll is not supported and live bank accounts cannot be connected (Sandbox FAQ). So an agent that touches the books is tested against someone else's sample ledger, which cannot become yours, cannot be reset, and after a few runs is a pile of everything the previous runs did. The QuickBooks world is a stateful QuickBooks mock built for testing agents: the same URLs, the same errors and the same state machine as the real API, on your machine, verified against the real system.
QuickBooks sandbox limits
Books are cumulative, which is exactly the problem. Every invoice an agent creates in a sandbox is there for the run after it, every payment it applies changes a balance the following test expected to be different, and the only reset Intuit offers deletes everything, sample data included. A world is a pseudonymized copy of your own company file, taken when you ask for it: the same customers and vendors, the same open invoices and balances, the same chart of accounts, under new names. Every run starts from those bytes, in milliseconds, and ends by throwing the world away.
A stateful QuickBooks mock: ledgers, invoices, reconciliation, tax categories
The world keeps customers, vendors, items, invoices, payments, bills, credit memos, journal entries, the chart of accounts and the tax categories on every line. It keeps QuickBooks' rules with them. A payment applied to an invoice reduces its balance and no further; a payment larger than the balance leaves a credit, not a negative invoice. An entry into a closed period is refused. Every object carries a version, and a write against a stale one is refused the way QuickBooks refuses it, so the agent that read once and wrote twice finds out. Everything the agent creates or changes stays in the world, so the second request sees what the first one did.
Test your AI agent against QuickBooks
Point the agent's QuickBooks client at the world. Nothing in the agent changes. The path is three commands: the first copies the company and writes the worlds folder, the second turns your own queue export into tasks, one per row, with the expected outcome on the rows where you know it, and the third runs the agent three times on fresh copies and writes the report. The three steps take about ten minutes; the GET ACCESS form on this page is where the QuickBooks world starts.
Grade what the agent did, not what it said
A run starts from a mark and ends with a diff: every invoice created or voided, every payment applied and to what, every credit memo, every journal line, in dollars. The transcript says the payment was applied to the March invoice; the diff shows it on the April one. The transcript says the duplicate invoice was voided; the diff shows the one the customer already paid gone. The transcript says the expense was recategorized; the diff shows the tax category unchanged and a memo added. The report says dollars wrong per run, gives every task a verdict and a reason, and replays the worst run to the byte.
Break it on purpose
Intuit throttles requests and refuses stale writes, and an agent working the books will meet both at the worst moment. In the world that moment is on your schedule: a 429 on every third call, a version conflict in the middle of a batch, an outage mid run, a slow API, an expired token. Does the retry logic post the journal entry twice? Does the agent report the invoice sent when the call never landed? Then move the clock, so invoices fall due and the period closes, and read the diff again.
QuickBooks test environment for agents, in CI
The same command that runs on a laptop is the CI step the first command wrote. No sandbox company to share, no sample data to work around: the world starts fresh inside the job, the agent runs every task, the report is the artifact, and nothing leaves the machine. Every world in the catalog takes the same path; NetSuite, Stripe and Zendesk are three more of them, and the docs are the path in full.