How to fill a QuickBooks Online sandbox with a year of test data
A new QuickBooks Online (QBO) sandbox company gives you Intuit's small demo dataset. It's fine for clicking around, but it won't tell you how your integration behaves with a hundred customers, a year of invoices, partial payments and payroll. This guide uses the open-source easytestdata CLI to generate that year of books, load it into a sandbox, and remove it again.
You'll need Node.js 22.13 or newer and, for the loading steps, a free Intuit developer account with a sandbox company.
1. Preview the data (no install)
If you just want to see what gets generated, open the playground. It runs the same engine in your browser and shows the counts, a monthly revenue and expense chart, and the first rows of each table.
2. Generate it locally
Pick one of the 8 industry templates and one of the 8 scenarios (the --scenario flag). Here's a fast-growing SaaS company:
npx easytestdata generate --template saas --scenario rapid-growth --seed 42 --start-date 2025-09-01 --format csv --output ./sample-data
Without --start-date the CLI covers the last 12 full months, so the output would move with the calendar; pinning it to September 2025 makes the data span September 2025 to August 2026 on any day. You get one CSV per record type, with line items in their own files:
$ ls sample-data
bill_lines.csv deposits.csv journal_entries.csv sales_receipts.csv
bill_payments.csv direct_expenses.csv payments.csv transfers.csv
bills.csv employees.csv payroll_lines.csv vendor_credits.csv
credit_memos.csv estimates.csv payroll_runs.csv vendors.csv
customers.csv invoice_lines.csv purchase_orders.csv
deposit_lines.csv invoices.csv refund_receipts.csv
$ head -4 sample-data/invoices.csv
doc_number,customer,txn_date,due_date,amount
EZTD-INV-0001,Nguyen Media,2025-09-13,2025-10-13,10242.14
EZTD-INV-0002,Reyes Architects,2025-09-16,2025-10-16,9268.4
EZTD-INV-0003,Sullivan Distribution,2025-09-09,2025-09-24,6928
What's in this run:
- 90 customers, 10 vendors, 30 employees with realistic names, addresses, emails and phone numbers (for example Nguyen Media and Coleman Data Centers Co.)
- 1,080 invoices and 132 sales receipts totaling exactly $2,000,000.00 of revenue
- 952 customer payments: 785 invoices paid in full, 167 partially paid, 128 still open
- 120 bills, 102 bill payments, 48 direct expenses and 24 semi-monthly payroll runs, totaling $1,880,000.00 of expenses, which leaves the scenario's $120,000.00 target profit
- 58 credit memos, 4 refund receipts, 1 vendor credit, 205 estimates, 4 purchase orders, 89 deposits, 18 transfers and 17 journal entries
That's 2,854 transactions. Other scenarios are smaller: new-company produces around 450, healthy-small around 750, and quick-demo covers just three months for a fast first load. Use --format json if you'd rather have one file.
3. Connect your sandbox
In the Intuit developer portal, open your app's Development keys and add this redirect URI:
http://localhost:8085/callback
Then run auth with the app's Client ID and Client Secret. The CLI opens an OAuth flow in your browser; choose your sandbox company.
export QBO_CLIENT_ID=...
export QBO_CLIENT_SECRET=...
npx easytestdata auth
The connection is saved to .easytestdata.json in the current directory. It contains OAuth tokens, so add it to .gitignore.
4. Load
Do a dry run first to see what would be created, then load for real with the same flags:
npx easytestdata load --template saas --scenario rapid-growth --seed 42 --start-date 2025-09-01 --dry-run
npx easytestdata load --template saas --scenario rapid-growth --seed 42 --start-date 2025-09-01
EasyTestData creates the accounts, customers, vendors, employees and service items first, then each transaction type in dependency order, so payments reference their invoices and deposits reference their payments. Requests are batched and kept under QBO's API rate limit, so a large scenario takes a while. Start with --scenario quick-demo if you want a quicker first run.
5. Check it in QBO
In the sandbox, open the customer list, the A/R aging report and the Profit and Loss report for the generated period. You should see the customers, a spread of paid, partially paid and open invoices, payroll checks twice a month and a depreciation entry each month. The profit on the report lands a little below the $120,000 target; the FAQ explains why.
6. Clear it
When you're done, clear what EasyTestData created. 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). If you load several datasets with different --tag values, purge each by its tag.
npx easytestdata purge --mode generated
To start over with a different scenario in one step, use --clear-first on the next load:
npx easytestdata load --template construction --scenario cash-crisis --seed 7 --clear-first
Don't want to run it yourself?
The same engine is available as a web app. Run it on your own computer for free with no limits (npx easytestdata ui), or use EasyTestData Cloud, which is free. Everything is open source under Apache-2.0 on GitHub.