Excel Sales Dataset Generator
Build a realistic sales dataset in seconds. Pick the size, the seasonality and how messy it should be, then download a three-sheet Excel file to practice on.
1. How messy should it be?
Start here. Each option sets the fourteen fine-tuning controls for you, and you can still change any of them afterwards.
2. How big should it be?
The store, the catalog and the time span.
Data quality
The problems you would have to clean up in a real export.
Sales patterns
What the numbers do over time.
Discounts
How often orders are discounted, and by how much.
3. Where should I send it?
You get the download here as soon as it is built. The link goes to your inbox too, so you can close this page.
Free. No account needed.
Building your dataset
Generating the transactions, then writing the workbook.
0% QueuedYour dataset is ready
Want to go beyond pivot tables?
You can now run Python right inside Excel, for free. That is what I teach in my course, if you want to check it out.
What You Get
One .xlsx file with three related sheets, so you can practice joins and lookups instead of working on a single flat table.
One row per transaction, sorted by date. Store locations and payment methods follow a weighted mix rather than being spread evenly, so the totals look like a real till.
- Order_ID
- Transaction_Date
- Transaction_Time
- Store_Location
- Payment_Method
- Product_ID
- Quantity
- Unit_Price
- Discount_Rate
The catalog, across Electronics, Accessories, Office Supplies, Furniture and Apparel. Prices end in .99 or .95, the way retail prices do. Joins to Sales Data on Product_ID.
- ID
- Product_Name
- Category
- Unit_Price
- Supplier_ID
Who supplies what, each specializing in a category so the joins make sense. Joins to Products on Supplier_ID, which gives you a two-hop lookup to practice on.
- ID
- Supplier_Name
- Location
- Specialization
A fourth sheet, About This Dataset, records every setting you chose and lists six analysis ideas, so you can always tell which file is which.
What Makes It Realistic
Random numbers are easy to spot and boring to analyze. This data has patterns in it that are actually there to be found.
Seasons that belong to their category
Electronics climb into November and December, apparel moves with the change of season. Each category peaks when it should, not all in the same month.
Busier weekends, real opening hours
Friday to Sunday carry more sales than midweek, and every transaction gets a timestamp between 9am and 9pm, so time-of-day analysis has something to show.
A payment mix, not a coin flip
Card, debit, cash, mobile and gift card appear in the proportions a physical store actually sees, so a payment breakdown is worth charting.
Discounts with a reason behind them
Expensive items get fewer but deeper discounts, cheap items get smaller ones, and everything is discounted more during its own peak season.
No empty months
Every product gets at least one sale in every month it existed, so a pivot table never has holes in it and year-on-year comparisons line up.
Mess you asked for, on purpose
Turn up the data quality sliders and you get exact duplicate rows, blank cells, store names typed wrong, and the same supplier written three different ways.
What To Practice On It
Three sheets that reference each other give you more to work with than a single table ever does.
Pivot tables and dashboards
Revenue by month, category and store. Add Discount_Rate as a second measure and the seasonal discount pattern shows up immediately.
XLOOKUP across sheets
Sales Data has no product name and no revenue column on purpose. Look the name up on Products, then hop to Suppliers, then work out line totals yourself.
Power Query cleanup
Turn the messiness up and you have real work to do: remove duplicates, fill blanks, and group "Downtown", "Down Town" and "Dowtown" back into one store.
pandas and Python
pd.read_excel with sheet_name=None gives you all three at once. Merge them, resample by month, and plot the seasonality you configured.
Power BI and Tableau models
Products and Suppliers are proper dimension tables. Load all three and you have a star schema to build relationships and measures against.
Teaching and testing
Generate the same shape twice with different messiness for a before and after exercise, or make one big file to see where a workbook starts to slow down.
Every Control, Explained
What each setting changes in the file you open.
| Control | Range | What it changes |
|---|---|---|
| Size | ||
| Sales records | 100 to 10,000 | Rows on the Sales Data sheet. Every product still gets one sale a month first, so small numbers are raised to that floor. |
| Different products | 1 to 40 | How much of the 40-product catalog the store sells, spread across the five categories. |
| Suppliers | 1 to 20 | Rows on the Suppliers sheet. Each one specializes in a category so its products make sense. |
| Years covered | 1 to 4 | How many calendar years the transactions span. |
| First year | 10 years back | The earliest year in the data. Drag it back if you want dates in the past. |
| Data quality | ||
| Duplicate records | 0 to 30% | Rows copied exactly, the way a double import leaves them. Nothing marks them, so you have to find them. |
| Data entry errors | 0 to 30% | Store names typed wrong, so "Downtown" also appears as "Down Town". Good practice for grouping and fuzzy matching. |
| Missing values | 0 to 30% | Blank cells, mostly in Store_Location. What a real export from a real till looks like. |
| Inconsistent product names | 0 to 100% | The same product written more than one way, including in capitals, so a lookup on the name alone stops working. |
| Inconsistent supplier names | 0 to 100% | Ltd against Limited, Inc against Incorporated, and the occasional company shouting in capitals. |
| Sales patterns | ||
| Seasonal sales strength | 0 to 100% | How far each category climbs in its own peak months. At 0 the year is flat; turn it up and the December spike is unmissable. |
| Year-to-year consistency | 0 to 100% | How closely each year repeats the one before. Lower means bigger swings between years. |
| Outlier probability | 0 to 100% | How often a transaction lands far outside the normal range. Something to detect, or to decide to ignore. |
| Outlier magnitude | 0 to 100% | How extreme those outliers get when they do appear. |
| Price variation | 0 to 100% | How much the same product's unit price drifts between transactions, rather than being identical every time. |
| Discounts | ||
| Discount probability | 0 to 100% | The base chance any given order carries a discount at all. |
| Minimum discount | 0 to 100% | The smallest discount that can be applied. |
| Maximum discount | 0 to 100% | The largest discount that can be applied. |
| Seasonal discount boost | 0 to 100% | Extra discount chance during a category's peak season, on top of the base probability. |
Frequently asked questions
Yes. No account, no credit card, no trial. You give an email address because that is where the file is sent, and you can unsubscribe from anything that follows with one click.
Because every product is guaranteed a sale in every month of every year, so a pivot table never has empty cells in it. That floor is your product count times your year count times twelve. Ask for 100 rows with 40 products over 4 years and you get 1,920, because that is what the guarantee costs.
The readout under the sliders always shows the real number before you generate anything, and tells you when it had to round up. Duplicate records are added on top of it.
You can, and for twenty rows it is quicker. Past that it falls apart in a specific way: ask for sales data without a very long brief and what comes back is generic. Round prices, sales spread evenly across every month and every product, no weekend effect, no seasonal peak, every item selling like every other one. There is nothing in it to find, which is the one thing practice data has to have.
It also does not hold up at length. Ask for 5,000 rows and you tend to get a few hundred, or a script that produces them with the same flat distribution you were trying to avoid.
This runs one generator with the patterns already built in, so they are there whether you ask for them or not: categories peak in their own season, weekends outsell midweek, expensive items get fewer but deeper discounts, prices end in .99, and the mess is exactly as much as you asked for. Every row is consistent with every other one, all the way to 10,000.
A sample file is one fixed thing. It has the rows it has, the mess it has, and everyone practicing on it works on identical data. If you need it bigger, cleaner, dirtier or spread over four years instead of one, you are out of luck.
This builds the file to your spec each time, from 100 rows to 10,000, clean or deliberately broken. That matters most if you are teaching or setting an exercise: generate one clean copy and one messy copy of the same shape, or give everyone their own file so nobody can copy an answer.
No, and that is the point. Every row is generated, so there is no customer in it, nothing confidential, and nothing you need permission to publish. Use it in a tutorial, a course, a job application or a blog post without having to anonymize anything first.
One hour. The file is deleted from the server after that, so grab it while the page is still open or use the link in the email. If it expires, just generate another one, it takes a few seconds.
No. Every run uses fresh random values, so two files with identical settings still have different transactions in them. That is useful for setting an exercise nobody can copy the answer to, and it does mean you should keep a file you liked rather than expecting to rebuild it.
Because working it out is the exercise. You have Quantity, Unit_Price and Discount_Rate on every row, which is everything you need to build a line total, and doing it yourself is closer to the real job than reading a column somebody else calculated.
Yes. It is a standard .xlsx workbook, so Excel, LibreOffice, Numbers and Google Sheets all open it, and pandas.read_excel reads it directly. Pass sheet_name=None to load all three sheets into a dictionary of DataFrames in one call.
It sends you the download link, and it goes on my free users list so I can tell you about new tools and the occasional deal. One click unsubscribes, and I do not sell or share it. There is more detail in the privacy policy.
Now Automate The Analysis
You have the data. My Excel automation course shows you how to turn the reporting you do on it into a one-click Python workflow, in 3.5 hours, with nothing to install.
See the course