Files
André Padez c580ddbcb8 mock sales and subscription data, and the generator that makes it
two shapes, because a dashboard gets asked to do two things: daily orders with
seasonality worth charting, and a subscription list where 'active' is a
calculation over dates rather than a column.

both as .xlsx and .csv. the excel files are the realistic input and the csv
twins need no parser, so an app can read them with nothing installed.

the generator has no dependencies — an xlsx is a zip of xml and it writes one
directly. fixed seed, so a re-run is byte-identical and a diff means the
generator changed rather than the data drifting.
2026-08-25 20:16:44 +00:00

2.2 KiB
Raw Permalink Blame History

sample-data

Mock datasets for building and demonstrating dashboards. Everything here is generated — no real company, person, or number appears in it.

Two shapes, because a dashboard is usually asked to do two different things.

sales.xlsx / sales.csv — 6,402 rows

Two years of daily orders, 2024-08-01 to 2026-07-31.

Column
Order ID ORD-10000 upward
Date ISO, one row per order
Region North · South · East · West · Central
Category Hardware · Software · Services · Accessories
Product four per category
Channel Direct · Partner · Online
Sales Rep six names
Units, Unit Price, Revenue Revenue = Units × Unit Price

It has deliberate shape, so a chart of it proves something. A Q4 lift and a summer dip, quiet weekends, steady growth across the two years, and one region — East — pulling ahead only in the second year. Price ranges differ per category, so the mix moves the average.

subscriptions.xlsx / subscriptions.csv — 480 rows

A customer list, for the other half: cohorts, MRR, churn.

Column
Account ID, Company, Country eight countries
Plan, MRR Starter 19 · Team 79 · Business 249 · Enterprise 900
Seats
Started, Cancelled Cancelled is empty for live accounts
Status Active · Cancelled

Churn is not evenly spread — Starter churns about a third, Enterprise well under a tenth, which is the pattern anybody reading it expects to find. "Active" is a calculation over dates, not just a column to filter on, which is the point of including both.

Both formats, on purpose

The .xlsx files are the realistic input — people have spreadsheets. The .csv twins are identical data and need no parser, so an app can read them with nothing installed. Pick per what you are building; do not assume the Excel one has to be converted first.

Regenerating

generate.ts writes all four from a fixed seed, so a re-run is byte-identical and any diff means the generator changed. It has no dependencies — an .xlsx is a zip of XML and it writes one directly, which is why nothing had to be installed to produce these.

bun run generate.ts .