Skip to content
Open source · Apache-2.0

Fill your QuickBooks Online sandbox with realistic test data

Fill a QuickBooks Online (QBO) sandbox with a year of connected invoices, bills, payments and payroll, then clear it with one command. Sandbox companies only — we show you the line of code that guarantees it.

Star on GitHub The playground needs no account. Filling a sandbox needs a free Intuit developer account and sandbox company.

8 industry templates 8 scenarios 15 transaction types Deterministic seeds
$ npx easytestdata generate --template saas --scenario rapid-growth --seed 42 --start-date 2025-09-01 --format csv --output ./sample-data

Generating files needs no account. Same seed and dates, same data, on any machine.

See the books before you connect anything

Real output from the open-source engine, generated in your browser. Change the template or scenario and it regenerates instantly.

Seed 42

Customers
90
Vendors
10
Invoices
1,080
Bills
120
Revenue vs expenses by monthRevenueExpenses
$0$50K$100K$150K$200KSep 25Sep 25: revenue $163,777, expenses $152,912Oct 25: revenue $165,589, expenses $154,492Nov 25Nov 25: revenue $168,648, expenses $161,827Dec 25: revenue $166,516, expenses $156,944Jan 26Jan 26: revenue $166,048, expenses $161,312Feb 26: revenue $168,066, expenses $153,923Mar 26Mar 26: revenue $164,684, expenses $158,645Apr 26: revenue $165,077, expenses $155,406May 26May 26: revenue $170,894, expenses $149,648Jun 26: revenue $165,531, expenses $157,294Jul 26Jul 26: revenue $168,195, expenses $157,923Aug 26: revenue $166,974, expenses $159,674

A few of the 2,854 generated transactions

DateTypeAmount
Sep 1, 2025Payroll−$53,266.67
Sep 3, 2025Bill−$3,163.54
Sep 6, 2025Estimate$9,268.40
Sep 6, 2025Deposit$710.38
Sep 13, 2025Invoice$10,242.14
Sep 15, 2025Sales receipt$752.53
Open the full playground Tables, charts, JSON and CSV downloads, and the matching CLI command.

Not just random rows

The data is synthetic, but the accounting relationships are real, so reports and integrations behave the way they will with a customer's books.

Financially coherent

Invoices and sales receipts add up to the revenue target; bills, expenses and payroll add up to the expense budget. Payments point at real invoices.

Industry-specific

Each template sets its own service items, expense categories, cash-vs-invoice mix, payment timing and estimate/PO rates.

The messy stuff

Partial payments, unpaid invoices, credit memos, vendor credits and refund receipts: the edge cases that break integrations.

Deterministic seeds

Same template, scenario, dates and seed produce the same data every time, so bugs reproduce across machines and CI runs.

One-command cleanup

Everything is tagged EZTD. Purge deletes the transactions it added, makes its customers, vendors, employees and items inactive (accounts stay), and never touches records you made by hand (details).

JSON and CSV too

No QBO sandbox yet? easytestdata generate writes the same plan to JSON or CSV for fixtures and seed scripts.

From empty sandbox to a year of books

1

Connect a sandbox

Authorize a QBO sandbox company with Intuit OAuth, from the CLI (easytestdata auth), the app on your own computer, or EasyTestData Cloud. Sandbox companies only, by design.

2

Pick a template and scenario

8 industries and 8 scenarios, from a quick three-month demo to a fast-growing company or messy books full of credits and refunds. Or set revenue, target profit, customers and dates yourself.

3

Load, test, clear

Records load in dependency order within QBO's API rate limits, with live progress. A typical 12-month run is 250–2,950 transactions depending on the scenario.

See each step with the commandsNew to QBO sandboxes? Read how to create, reset and fill one.

Why you can trust it in your sandbox

Not a promise, a design. Here is what keeps EasyTestData away from real books.

One line of code refuses production

assertSandboxBaseUrl in qbo-client.js throws for any API host other than sandbox-quickbooks.api.intuit.com. Every request goes through it. The production QuickBooks address doesn't appear anywhere in the source code; the tests use it only to prove the check rejects it.

Intuit's keys only open sandboxes

EasyTestData uses Intuit development keys, and Intuit only lets development keys authorize sandbox companies. Your real company can't be connected even by mistake.

One OAuth scope, nothing else

The only permission requested is com.intuit.quickbooks.accounting. No payments, no payroll service, no profile data beyond what QBO returns for the sandbox company.

What's stored, and when it's gone

In the web app, on EasyTestData Cloud or on your own computer: the sandbox's realm ID, its company name, and the OAuth tokens encrypted with AES-256-GCM. Disconnect the sandbox and they're deleted. The CLI keeps its tokens in a local file on your machine.

Tagged going in, cleared by tag going out

Every generated record carries the EZTD tag (in a document number, memo or note field, never the display name). Purge deletes the tagged transactions and makes the tagged customers, vendors, employees and items inactive, because QuickBooks doesn't allow deleting those. Accounts it created stay. Load two datasets with different tags and you can clear them separately. Anything you entered by hand is never touched.

The whole thing is open source under Apache-2.0, so you can read every line: easytestdata/easytestdata.

Open source first. Cloud if you want it.

Every package, including the web app, is Apache-2.0 and free. Run it on your own computer with no limits, or let us run it for you on EasyTestData Cloud.

On your computer

  • ✓ Apache-2.0, every package
  • ✓ No limits on connections, jobs or records
  • ✓ No account or sign-in, your own Intuit app
  • ✓ One command: npx easytestdata ui
Run it locally

EasyTestData Cloud

  • ✓ Free, with generous limits to prevent abuse
  • ✓ Nothing to install or operate
  • ✓ Teams included
  • ✓ Same open-source code as the local app
Start free on Cloud

No credit card, no paid plans. Is it really free?

Stop hand-entering test data.

or star it on GitHub and run it locally with no limits.