Sample E-commerce Orders Dataset
A full year of synthetic online orders — 50,000 rows, 20 columns, every total reconciling against its own line items. Built for testing dashboards, demos and pipelines without putting real customer data anywhere near them.
- Rows
- 50,000
- Columns
- 20
- Format
- Parquet
- Size
- 1.3 MB
- Licence
- Public domain (CC0 1.0)
- Updated
- August 25, 2026
Source: Cotera — generated · Licence: Public domain (CC0 1.0)
| # | Order ID | Ordered at | Customer ID | Country | Channel | Device | SKU | Category | Quantity | Unit price | Discount | Shipping | Currency | Payment | Status | Order total | First order | Refunded | Days to deliver | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 100,000 | 2025-12-29 16:54:00 | 8,816 | customer8816@example.com | GB | organic_search | desktop | BEA-0065 | beauty | 1 | 26.59 | 0 | 9.57 | USD | apple_pay | delivered | 36.16 | false | 0 | 8 |
| 2 | 100,001 | 2025-03-14 07:37:00 | 7,352 | customer7352@example.com | US | paid_search | mobile | ELE-0007 | electronics | 1 | 75.51 | 0.10 | 0 | USD | card | delivered | 67.96 | true | 0 | 6 |
| 3 | 100,002 | 2025-08-13 00:11:00 | 6,105 | customer6105@example.com | GB | mobile | BEA-0175 | beauty | 2 | 56.17 | 0.25 | 12.22 | USD | paypal | delivered | 96.48 | true | 0 | 4 | |
| 4 | 100,003 | 2025-12-16 12:58:00 | 12,080 | customer12080@example.com | NL | mobile | APP-0231 | apparel | 1 | 133.04 | 0 | 0 | USD | card | processing | 133.04 | true | 0 | null | |
| 5 | 100,004 | 2025-04-03 02:23:00 | 5,980 | customer5980@example.com | US | organic_search | desktop | APP-0136 | apparel | 1 | 85.75 | 0 | 12.63 | USD | card | cancelled | 98.38 | false | 0 | null |
| 6 | 100,005 | 2025-08-25 04:14:00 | 4,730 | customer4730@example.com | US | organic_search | desktop | BEA-0224 | beauty | 1 | 69.41 | 0.10 | 0 | USD | apple_pay | delivered | 62.47 | true | 0 | 6 |
| 7 | 100,006 | 2025-05-17 09:41:00 | 9,122 | customer9122@example.com | CA | mobile | APP-0016 | apparel | 1 | 25.98 | 0.10 | 0 | USD | paypal | delivered | 23.38 | false | 0 | 1 | |
| 8 | 100,007 | 2025-10-18 10:55:00 | 1,623 | customer1623@example.com | AU | organic_search | desktop | ELE-0172 | electronics | 2 | 445.37 | 0 | 8.49 | USD | card | delivered | 899.23 | true | 0 | 11 |
| 9 | 100,008 | 2025-09-16 17:23:00 | 8,732 | customer8732@example.com | CA | organic_search | desktop | HOM-0237 | home | 1 | 199.65 | 0.10 | 0 | USD | paypal | cancelled | 179.69 | true | 0 | null |
| 10 | 100,009 | 2025-12-25 21:15:00 | 3,067 | customer3067@example.com | US | direct | desktop | HOM-0029 | home | 1 | 43.12 | 0 | 0 | USD | paypal | delivered | 43.12 | false | 0 | 3 |
| 11 | 100,010 | 2025-12-21 23:32:00 | 10,825 | customer10825@example.com | AU | organic_search | mobile | APP-0022 | apparel | 2 | 28.57 | 0.40 | 12.85 | USD | apple_pay | delivered | 47.13 | false | 0 | 2 |
| 12 | 100,011 | 2025-10-28 13:18:00 | 3,722 | customer3722@example.com | GB | direct | mobile | ELE-0231 | electronics | 2 | 578.22 | 0.15 | 9.68 | USD | card | delivered | 992.65 | true | 0 | 9 |
What’s in the file
20 columns over 50,000 rows. Distinct counts and null rates are measured from the file itself, not estimated.
| Column | Type | Description | Distinct | Null |
|---|---|---|---|---|
| order_id | numberBIGINT | Unique identifier for the order. Sequential from 100000.100000 → 149999 | 50,000 | 0% |
| ordered_at | timestampTIMESTAMP | When the order was placed, to the minute. Spans the whole of 2025.2025-01-01 11:41:00 → 2025-12-30 23:56:00 | 47,282 | 0% |
| customer_id | numberBIGINT | The buyer. Repeats across orders, which is what makes cohort work possible.1000 → 14999 | 12,854 | 0% |
| customer_email | textVARCHAR | Synthetic address on the reserved example.com domain — it can never reach a real inbox. | 12,854 | 0% |
| country | textVARCHAR | Two-letter shipping country. Eight markets, weighted towards the US. | 8 | 0% |
| channel | textVARCHAR | Attributed acquisition channel: organic search, paid search, email, paid social, direct or affiliate. | 6 | 0% |
| device | textVARCHAR | Device the order was placed on: mobile, desktop or tablet. | 3 | 0% |
| product_sku | textVARCHAR | Product identifier, prefixed with the first three letters of its category. | 1,440 | 0% |
| product_category | textVARCHAR | One of apparel, home, beauty, electronics, outdoor or grocery. | 6 | 0% |
| quantity | numberINTEGER | Units on the order. Heavily skewed towards one, as real baskets are.1 → 5 | 5 | 0% |
| unit_price | number (USD)DOUBLE | Price per unit before discount. Price bands differ by category.4.0 → 599.97 | 22,439 | 0% |
| discount_pct | numberDECIMAL(3,2) | Discount applied, as a fraction. Zero on roughly two thirds of orders.0.00 → 0.40 | 5 | 0% |
| shipping_cost | number (USD)DOUBLE | Shipping charged. Bimodal — free above a threshold, otherwise a real rate.0.0 → 12.95 | 488 | 0% |
| currency | textVARCHAR | Always USD. Present so joins and currency logic have something to key on. | 1 | 0% |
| payment_method | textVARCHAR | Card, PayPal, Apple Pay, Klarna or gift card. | 5 | 0% |
| status | textVARCHAR | Delivered, shipped, processing, cancelled or refunded. | 5 | 0% |
| order_total | number (USD)DOUBLE | quantity × unit_price × (1 − discount_pct) + shipping_cost. Reconciles on every row.2.95 → 2934.15 | 27,407 | 0% |
| is_first_order | booleanBOOLEAN | Whether this was the customer's first purchase. | 2 | 0% |
| refund_amount | number (USD)DOUBLE | Non-zero only on refunded orders, where it is the full order total.0.0 → 2217.77 | 1,953 | 0% |
| days_to_deliver | numberINTEGER | Days from order to delivery. NULL where delivery has not happened, rather than a zero that would lie.1 → 11 | 11 | 24.8% |
Things worth noticing
- Q4 carries 37.7% of the year: 18,864 of the 50,000 orders land in October, November and December. A forecast fitted on Q1 will under-call November badly, which is the point of testing against it.
- 12,854 customers placed the 50,000 orders, and the 7,408 who came back three or more times account for $7.76M of the $9.36M in order value — 82.9% of revenue from 57.6% of buyers.
- Average order value runs from $32.83 in grocery to $507.78 in electronics. The blended figure, $187.20, describes none of the six categories, which is exactly the trap a category breakdown is meant to catch.
- 4.0% of orders are refunded and refund_amount is populated only on those. Every other row is a true zero rather than a missing value in disguise — so a naive AVG and a considered one give different answers, on purpose.
Put an agent on it
Anything you were about to do with this file by hand is a job that runs every week forever. Each of these is a working prompt — open it and it is already loaded.
Weekly revenue digest
Every Monday, a short read on last week against the four before it — by channel, category and device — with the movements that matter called out rather than a wall of numbers.
Every Monday at 8am, read the orders data for the last complete week. Compare it against the four weeks before it and report: - Total order value, order count and average order value, each with the week-over-week change - The breakdown by channel, and any channel whose share moved more than 3 percentage points - The breakdown by product_category, flagging any category down more than 10% on its four-week average - Refund rate for the week, and whether it is outside the normal range Write it as five sentences a founder can read on their phone. Lead with whatever actually changed — if nothing did, say so in one line instead of padding. Post it to #revenue.
Refund spike watchdog
Watches the refund rate by category and SKU daily, and only speaks up when a rate breaks out of its own recent range — so the alert still means something in month three.
Every day, calculate the refund rate (refunded orders / total orders) for the trailing 7 days, overall and split by product_category and product_sku. Compare each against its own trailing 30-day rate. Alert only when: - A category's 7-day refund rate is more than 1.5x its 30-day rate AND has at least 20 orders behind it - Or any single SKU has 3+ refunds in 7 days For each alert include the SKU or category, both rates, the order counts, and the total dollars refunded. If nothing breaches, post nothing at all — do not send a daily "all clear".
Repeat-customer cohort report
Monthly cohorts by first-order month, tracking how much each one has spent since — the report every team says they want and nobody has time to rebuild each month.
Build a monthly cohort analysis from the orders data. Group customers by the month of their first order. For each cohort report: - Number of customers - Total and average order value in month 0, 1, 2, 3, 6 - Percentage of the cohort that placed a second order, and the median days between first and second - Which acquisition channel the cohort came from, and whether channel predicts repeat rate Call out the two cohorts with the strongest and weakest repeat behaviour and what distinguishes them. Deliver it as a table plus three sentences of interpretation, on the first of every month.
Every one of these runs against your own data too — swap sample e-commerce orders dataset for your warehouse, your CRM or a spreadsheet, and the agent is unchanged.
Load it yourself
The file is a plain parquet. Nothing here is specific to us.
-- No download step: DuckDB reads the parquet over HTTP range requests.
INSTALL httpfs;
LOAD httpfs;
CREATE VIEW sample_ecommerce_orders AS
SELECT * FROM read_parquet('https://cotera.co/datasets/sample-ecommerce-orders.parquet');
SELECT * FROM sample_ecommerce_orders ORDER BY order_id LIMIT 20;Frequently Asked Questions
WHAT ARE YOU WAITING FOR?
Ready to build?
Stop duct-taping tools.
Stop writing playbooks no one follows.
Start building agents that actually do the work—and do it well.
Cotera: For people who think busywork is boring.
"This is the best product ever when it comes to shipping. Ten on ten recommended. I just can't wait to see what happens with this product."
Rebecca Blount
Director, Customer Success