Free tool

Free test data generator

Realistic, relational, fake data for development and testing — six modelled businesses, downloadable as CSV, JSON or PostgreSQL. No account, no sign-up, and no real person in any row. Pick a business, set a size, take the file.

The seed decides the data. Change it for a different dataset, keep it to get exactly these rows again — on any machine, any time.

Building a dataset…

Why generated data instead of a copy of production

Most test environments start the same way: somebody takes a dump of the live database because it is the fastest way to get data that looks right. It works, and it quietly makes every one of those environments as sensitive as the original — with a fraction of the access control, none of the retention discipline, and a copy on a laptop somewhere by the end of the quarter.

It is also the reason a lot of ordinary work stalls. A contractor cannot be given it. A support vendor cannot be shown it. A bug report cannot include it. Reproducing a customer issue means asking for permission rather than writing a test.

Generated data has none of those constraints, because there is nobody in it to protect. It can be committed, pasted into a ticket, handed to anyone, and kept forever. And it can contain the cases production does not happen to have this month — the refund larger than the order, the employee with no manager, the parcel that was scanned twice at the same hub.

What makes it different from random values

Referential integrity, not just columns
Every foreign key points at a row that exists. Join across all of it and nothing falls out. The page tells you when it checked, and what it checked.
Values that agree with each other
An order total equals its lines. A running balance reconciles across the whole ledger. A subscription's invoices stop when it ends. Contradictions are what break code, and generated data is only useful if it does not contain them by accident.
Distributions, not uniform noise
Spend follows a Pareto curve, product popularity a Zipf one, orders peak before Christmas and fall on weekends, and support resolution times follow priority. A query plan tuned against uniform data is tuned against a fiction.
The same seed gives the same rows
Deterministic from end to end — no clock, no Math.random, no network. Re-run it next year on a different machine and get the identical dataset, which is the only way a generated fixture can be asserted against.

The six datasets

Chosen because their data has genuinely different shapes, not different column names. A subscription business is state over time; a retailer is discrete transactions; a bank is an append-only ledger that has to balance; a hospital is a sequence of encounters hanging off a person; a carrier is an event stream with geography; an employer is a set of slowly-changing records. Code that works against all six has met most of the shapes it will meet in the wild.

Retail & e-commerce

The standard commerce star schema — customers, products, orders, order lines, payments and returns — with order totals that reconcile against their lines.

  • customersOne row per person who has an account.
  • productsThe catalogue. Cost is included so margin is computable.
  • ordersOne row per order. Totals reconcile against order_items.
  • order_itemsOrder lines. line_total = quantity × unit_price, less line discount.
  • paymentsWhat was actually taken. A captured payment equals the order total.
  • returnsReturned lines. Never more than was bought, never before the order.

SaaS subscriptions

Recurring revenue with trials, upgrades and churn — accounts, seats, subscriptions, plan changes, invoices, usage telemetry and support tickets.

  • accountsOne row per paying organisation.
  • usersSeats. Belongs to an account, never created before it.
  • subscriptionsThe contract. ended_at is null while it is still running.
  • plan_changesUpgrades and downgrades, with the MRR movement each caused.
  • invoicesOne per billing period. None is dated after its subscription ended.
  • usage_eventsProduct telemetry. Only occurs while the subscription is live.
  • ticketsSupport. Resolution time follows priority; satisfaction follows resolution time.

Healthcare encounters

Patients, providers, encounters, diagnoses, medications and observations, with age-appropriate conditions and plausible vitals — and codes from an invented scheme, not ICD or SNOMED.

  • patientsPeople. No real person is described by any row.
  • providersClinicians. Specialty drives which encounters they take.
  • encountersA visit. discharged_at is always at or after admitted_at.
  • diagnosesCoded against the pack's own SDS- scheme, not ICD or SNOMED.
  • medicationsPrescriptions, tied to the condition that prompted them.
  • observationsVitals and labs, with an abnormal flag derived from the value.

Retail banking

An append-only ledger that balances: customers, accounts, cards, merchants and transactions whose running balance reconciles exactly, with salary cycles, paired transfers and labelled fraud.

  • customersAccount holders.
  • accountscurrent_balance equals the balance_after of the last transaction.
  • cardsCard numbers are masked; nothing here passes a Luhn check, deliberately.
  • merchantsWhere the money went.
  • transactionsThe ledger. balance_after is computed forward and always reconciles.

Parcel logistics

An event stream with geography — hubs, vehicles, shipments and a scan trail per parcel, with clustered delays, failed delivery attempts and a status always derived from the last scan.

  • hubsSorting facilities. Capacity drives how often one falls behind.
  • vehiclesThe fleet, each based at a hub.
  • shipmentsOne parcel. status always matches the last scan on the trail.
  • scansThe trail. Strictly increasing in time within a shipment.
  • exceptionsWhy a shipment went wrong, tied to the scan that recorded it.

Workforce & HR

Slowly-changing records: departments, employees with a real management tree, contiguous compensation history, performance reviews and leave.

  • departmentsCost centres.
  • employeesPeople. manager_id points at someone hired earlier who had not left.
  • compensationContiguous, non-overlapping intervals. Exactly one current row per employee.
  • reviewsPerformance cycles. A poor final review makes an exit more likely.
  • absencesLeave taken. Always within employment, never on a weekend.

Questions

Is this test data generator really free?
Yes. No account, no email, no watermark, and no limit on what you do with what you download. The data is generated fresh for you; it belongs to you and needs no attribution.
Is the data safe to use? Does it contain real people?
Every value is invented by the generator. No row is derived from, sampled from, or matched against any real person, customer, patient or account. Names are assembled from name parts, identifiers are computed from the seed, and card numbers are masked and deliberately fail a Luhn check so they cannot be mistaken for live ones. Medical codes come from an invented scheme rather than ICD or SNOMED.
Why not just copy production data into my test environment?
Because a copy of production is production, with all the same obligations and none of the same controls. It widens the blast radius of any breach to every environment it reaches, it usually cannot be shared with contractors or support vendors, and it tends to outlive the reason it was copied. Generated data has none of those problems, and it can contain the edge cases production happens not to have this month.
What does the seed do?
The seed decides the data. The same seed, model, size and locale always produce byte-identical rows, on any machine and at any time. That is what makes a generated fixture usable in a test suite: the assertion you write today still passes tomorrow, and a colleague running it gets what you got.
How is this different from a random data generator?
Random values fill columns; they do not make a database. Here every foreign key resolves to a row that exists, order totals reconcile against their lines, a bank balance is computed forward across the ledger, a discharge never precedes an admission, and a manager was hired before the person they manage. Code that only ever sees unrelated random strings passes tests it should fail.
Can I use my own schema, or more rows than this page allows?
Not on this page — it is capped so it stays fast and free for everyone. Synthetic Data Studio is the same engine without the ceiling: your own tables and fields, any number of rows, field formats you dictate, deliberate data-quality problems to test against, MySQL and SQLite as well as PostgreSQL, and a command-line tool for CI.

The same engine, without the ceiling

Synthetic Data Studio

This page runs the pack you can buy, with the volume turned down and most of the controls removed. If what you actually need is your own schema at your own scale, reproducibly, in CI, that is the thing that does it.

See what it includesOne payment. No subscription.
  • Your own tables and fields, declared in JSON
  • Any number of rows — a million is a normal run
  • Field formats you dictate, so IDs match the ones your system issues
  • Deliberate data-quality problems: duplicates, orphans, bad dates, wrong types
  • MySQL and SQLite as well as PostgreSQL, plus TSV and NDJSON
  • A command-line tool and a verifier, for fixtures that CI can rebuild