Analysis 05 of 31 · E-commerce
Which products stopped selling, and how much did they used to bring in?
The short answer
7.3% Autumn 2010 revenue from products with no sale in autumn 2011
Share of the earlier revenue from products with no sale in the final 90 days
Autumn here means Sep 11 to Dec 9.
794 of 3,251 products that sold in autumn 2010 sold nothing in autumn 2011. In all, 1,567 had no sale in the last 90 days; over two years they brought in 8.3% of revenue. Sales data, not stock levels.
Which products had no sale in the last 90 days, what did they bring in, and does the busy autumn hide more stops?
- Public data
- Final 90 days: Sep 11 to Dec 9, 2011
- Sales only, no stock levels
Data as of · fixed dataset
Key figures
- 7.3%Autumn 2010 revenue from products with no sale in autumn 2011£254K; 794 of 3,251 products, Sep 11 to Dec 9
- 8.3%Revenue from products that stopped selling£1.58M of £18.93M, Dec 2009 to Dec 2011
- 1,567Products that stopped sellingof 4,725 products with a sale; none in the last 90 days
- 1.1%Prior-90 revenue from products that then stopped206 products sold in the prior 90 days and not in the final 90
Chart 1 of 5
Lead chart · two ways to measure the same stop
Against the same weeks a year earlier, products that stopped held 7.3% of that season's revenue; against the prior 90 days, 1.1%.
Does comparing the final 90 days with the 90 days before them flatter the products?
UCI Online Retail II · public data
Download CSV| Group | Against prior 90 days (% of revenue) | Against same weeks 2010 (% of revenue) | Products, prior 90 days | Products, same weeks 2010 |
|---|---|---|---|---|
| Stopped | 1.1 | 7.3 | 206 | 794 |
| Slowing | 12.0 | 29.0 | 347 | 745 |
| Steady or growing | 86.9 | 63.8 | 2,453 | 1,712 |
Chart 2 of 5
Products against revenue
33.2% of products stopped selling, and they brought in 8.3% of two-year revenue.
How many products stopped selling, and how much did they bring in?
UCI Online Retail II · public data
Download CSV| Group | Share of products (%) | Share of revenue (%) | Products | Revenue, two years (£) | Revenue, prior 90 days (£) | Revenue, final 90 days (£) |
|---|---|---|---|---|---|---|
| Stopped | 33.2 | 8.3 | 1,567 | 1,575,750.84 | 22,672.63 | -23.09 |
| Slowing | 7.3 | 7.0 | 347 | 1,331,743.44 | 244,085.73 | 73,264.55 |
| Steady or growing | 55.1 | 83.0 | 2,602 | 15,714,923.34 | 1,774,614.51 | 3,318,414.61 |
| New | 4.4 | 1.6 | 209 | 305,281.91 | 0.00 | 305,281.91 |
Chart 3 of 5
Stopped products by month of last sale
50.6% of the revenue from stopped products came from ones that last sold in 2011.
When did the stopped products last sell, and what did they bring in?
UCI Online Retail II · public data
Download CSV| Month of last sale | Revenue, two years (£) | Stopped products |
|---|---|---|
| 2009-12 | 8,235.19 | 130 |
| 2010-01 | 18,728.96 | 79 |
| 2010-02 | 16,854.62 | 57 |
| 2010-03 | 64,274.66 | 115 |
| 2010-04 | 31,216.85 | 61 |
| 2010-05 | 42,591.87 | 56 |
| 2010-06 | 45,239.54 | 58 |
| 2010-07 | 51,643.75 | 43 |
| 2010-08 | 88,755.66 | 73 |
| 2010-09 | 89,404.10 | 65 |
| 2010-10 | 83,273.06 | 78 |
| 2010-11 | 120,304.40 | 112 |
| 2010-12 | 117,840.80 | 82 |
| 2011-01 | 79,933.75 | 41 |
| 2011-02 | 63,090.40 | 36 |
| 2011-03 | 108,607.27 | 68 |
| 2011-04 | 115,010.64 | 100 |
| 2011-05 | 153,288.67 | 76 |
| 2011-06 | 56,506.50 | 64 |
| 2011-07 | 78,474.24 | 78 |
| 2011-08 | 99,616.61 | 72 |
| 2011-09 | 42,859.30 | 23 |
Chart 4 of 5
Top stopped products by past revenue
The ten stopped products with the most past revenue brought in £159,766; the biggest was the tea time cake stand in gift box.
Which stopped products used to bring in the most?
UCI Online Retail II · public data
Download CSV| Product | Revenue, two years (£) | Stock code | Last sale | Units sold | First sale |
|---|---|---|---|---|---|
| Tea time cake stand in gift box | 24,913 | 37503 | 2010-08-01 | 2,465 | 2009-12-01 |
| Red retrospot traditional teapot | 23,635 | 21527 | 2011-05-15 | 3,345 | 2009-12-01 |
| English rose design quilted throw | 17,398 | 84467 | 2010-07-27 | 816 | 2009-12-06 |
| Set of 3 coloured flying ducks | 15,791 | 35004C | 2011-03-07 | 3,062 | 2009-12-01 |
| Set/3 russian doll stacking tins | 14,084 | 85232B | 2011-02-11 | 3,086 | 2009-12-01 |
| Grow your own plant in a can | 13,714 | 22444 | 2011-05-19 | 10,132 | 2010-03-23 |
| Tea time tea towels | 13,312 | 47556B | 2011-04-18 | 5,205 | 2009-12-01 |
| Paper bunting coloured lace | 12,879 | 22088 | 2011-07-06 | 4,399 | 2009-12-01 |
| Large popcorn holder | 12,412 | 22198 | 2011-02-21 | 7,331 | 2009-12-01 |
| White cherry lights | 11,628 | 79323W | 2010-09-16 | 3,004 | 2009-12-01 |
Chart 5 of 5
The biggest slowdowns, even in the busy season
347 products slowed even in the busy season; the ten that fell most sold £64,374 less.
Which products are selling much less than they were?
UCI Online Retail II · public data
Download CSV| Product | Prior 90 days | Final 90 days | Stock code | Fall (£) |
|---|---|---|---|---|
| Party bunting | 34,182 | 12,620 | 47566 | 21,563 |
| Regency teapot roses | 14,544 | 5,532 | 23173 | 9,012 |
| Large zinc heart wall organiser | 4,833 | 8 | 23134 | 4,825 |
| Set 40 heart shape petit four cases | 5,773 | 977 | 23297 | 4,796 |
| Regency sugar bowl green | 6,903 | 2,459 | 23174 | 4,444 |
| Picnic basket wicker large | 5,132 | 821 | 22501 | 4,311 |
| 3 hook photo shelf antique white | 5,597 | 1,327 | 22171 | 4,270 |
| Small zinc heart wall organiser | 4,317 | 259 | 23135 | 4,058 |
| Assorted colours silk fan | 5,483 | 1,788 | 15036 | 3,695 |
| Paper bunting retrospot | 6,263 | 2,864 | 22090 | 3,399 |
Limits · Read with care
What this data can't show.
ContextAt Dasalla Trading Company I asked the same kind of question: I identified $300,000 in non-performing inventory through data analysis and presented it to leadership. This page asks it of public data. It uses none of that company's data and is not a record of that work.
- How much was on hand. This data has sales, not stock levels. It cannot say what was on a shelf, what was bought in, or what a product cost.
- Why a product stopped. A stop can be a choice, a supplier problem, the end of a season or a new code for the same thing. Nothing here records which.
- Whether it is one product or two. One product can carry more than one stock code, and a relaunch under a new code looks like a stop.
- Costs, margins and returns. Revenue is what customers paid, net of cancellations. There are no costs, no margins and no returns to a supplier, so the pounds are not profit.
- A season or an ending. Two years cannot tell a product that rests every winter from one that is gone. Chart 1 compares the same weeks a year earlier, which helps and does not settle it.
Download
The product table, as a workbook.
All 4,725 products with a sale: first and last sale, revenue in each window, units, and the group as a formula, so you can change the dates or the half-revenue threshold and watch the groups move. Built with Claude under Zachary's direction. Public data: UCI Online Retail II (CC BY 4.0).
Findings
What the charts say.
Against the same weeks a year earlier, 794 of 3,251 products (24.4%) that sold in autumn 2010 sold nothing in autumn 2011; they had brought in 7.3% of that season's revenue, and 745 more slowed. Autumn here is Sep 11 to Dec 9.
Comparing the final 90 days with the 90 before them flatters the products, because the final 90 are the busy season (1.81 times the revenue): it finds 206 stops holding 1.1% of the prior 90 days' revenue.
1,567 of 4,725 products (33.2%) had no sale in the final 90 days. They brought in £1,575,751 over two years, 8.3% of revenue.
Most are old stops: 1,009 last sold before 2011 (£778,363). The 558 that last sold in 2011 brought in £797,387, 50.6% of the stopped group's revenue.
The ten stopped products with the most past revenue brought in £159,766; the biggest, the tea time cake stand in gift box, brought in £24,913 and last sold Aug 1, 2010.
347 products slowed even in the busy season: £244,086 in the prior 90 days, £73,265 in the final 90.
Method
How the figures were built.
Steps
- Dropped non-product stock codes (POST, DOT, M, m, D, BANK CHARGES, AMAZONFEE, C2, PADS, CRUK, ADJUST, ADJUST2, S, B, TEST001/002, gift card vouchers) that represent postage, fees, manual adjustments, and test rows rather than real merchandise.
- Dropped rows with price <= 0 (6,207 rows); nearly all of these have no Customer ID and are internal adjustments, not customer sales.
- Dropped negative-quantity rows on invoices that do not start with 'C' (3,457 rows); a true return in this dataset is a cancellation invoice (prefix 'C').
- Removed 34,035 exact duplicate line items (after the rules above).
- A product is a stock code, upper-cased (so 85123a and 85123A are one product). One product can carry more than one code, or be relaunched under a new code, and the data cannot tell.
- A sale is a line on an invoice that is not a cancellation. Revenue is net of cancellations: cancellation lines (invoices starting with C) are negative and count against the date of the cancellation.
- Windows: final 90 days Sep 11 to Dec 9, 2011 (the last invoice is Dec 9 at 12:50); prior 90 days Jun 13 to Sep 10, 2011; the same weeks a year earlier Sep 11 to Dec 9, 2010.
- Stopped: sold earlier, no sale in the final 90 days. Slowing: sold in both windows and final-90 revenue under half of prior-90 revenue (prior-90 revenue above zero). New: first sale in the final 90 days. Steady or growing: the rest that sold in the final 90 days.
- 14 stock codes have only cancellation lines (net £263.88 below zero): they have no sale, so they are in no group and not in the totals.
1,067,371 rows in the source file, 1,021,254 after cleaning; 4,739 product codes after upper-casing, 4,725 with a sale. Every figure on this page comes from the chart tables in data/analyses/slow_movers.json, built from the full cleaned history; the table under each chart says how.
Checks
- The cleaning reproduces the live Online retail page: 1,067,371 source rows and 1,021,254 after cleaning; the last invoice is Dec 9, 2011 at 12:50.
- Every number on this page was recomputed by separate code (verify_slow.py: plain Python reading the original UCI zip, with no DuckDB and no intermediate files) and matches, product by product.
- The two queries below were run on the Live SQL table (13 months) in DuckDB 1.5.5 and return the figures shown under them; the full-history SQL was run on the cleaned table and returns the group counts and revenue on this page.
- Query 1 on the Live SQL table (13 months) returns stopped: 640 products, £186,205, 1.9%; slowing: 347 products, £737,143, 7.5%; steady or growing: 2,583 products, £8,542,619, 87.4%; new: 228 products, £305,561, 3.1%. These differ from the page's 25-month figures because the table starts in December 2010.
- Query 2 returns ten stock codes, the first three 47556B £6,045, 22783 £5,961, 22088 £5,512; the table has no product descriptions, so it shows codes.
The queries
The query runs on the table retail_orders (531,205 order lines, Dec 2010 to Dec 2011; it holds 13 months, so the counts these queries return differ from the page, which uses all 25). Open it in Live SQL, which runs DuckDB in your browser on the same public tables; the query loads ready to run.
Products by what happened in the last 90 days
Open in Live SQL-- Products by what happened in the last 90 days (Live SQL table: Dec 2010 to Dec 2011)
WITH p AS (
SELECT upper(stock_code) AS code,
min(invoice_date) FILTER (WHERE NOT is_cancelled) AS first_sale,
count(*) FILTER (WHERE NOT is_cancelled AND invoice_date BETWEEN DATE '2011-06-13' AND DATE '2011-09-10') AS sales_prior,
count(*) FILTER (WHERE NOT is_cancelled AND invoice_date >= DATE '2011-09-11') AS sales_final,
sum(line_revenue) FILTER (WHERE invoice_date BETWEEN DATE '2011-06-13' AND DATE '2011-09-10') AS rev_prior,
sum(line_revenue) FILTER (WHERE invoice_date >= DATE '2011-09-11') AS rev_final,
sum(line_revenue) AS rev_total
FROM retail_orders
GROUP BY 1
HAVING count(*) FILTER (WHERE NOT is_cancelled) > 0 -- at least one sale
), g AS (
SELECT *,
CASE WHEN sales_final = 0 THEN '1 Stopped'
WHEN first_sale >= DATE '2011-09-11' THEN '4 New'
WHEN sales_prior > 0 AND rev_prior > 0 AND rev_final < 0.5 * rev_prior THEN '2 Slowing'
ELSE '3 Steady or growing' END AS grp
FROM p
)
SELECT grp AS product_group,
count(*) AS products,
round(sum(rev_total)) AS revenue_gbp,
round(100.0 * sum(rev_total) / sum(sum(rev_total)) OVER (), 1) AS pct_of_revenue
FROM g
GROUP BY 1
ORDER BY 1
Top ten products that stopped selling, by past revenue
Open in Live SQL-- The ten products that stopped selling and brought in the most (Live SQL table: Dec 2010 to Dec 2011)
SELECT upper(stock_code) AS code,
max(invoice_date) FILTER (WHERE NOT is_cancelled) AS last_sale,
round(sum(line_revenue)) AS revenue_gbp
FROM retail_orders
GROUP BY 1
HAVING count(*) FILTER (WHERE NOT is_cancelled) > 0
AND count(*) FILTER (WHERE NOT is_cancelled AND invoice_date >= DATE '2011-09-11') = 0
ORDER BY sum(line_revenue) DESC
LIMIT 10
Caveats
- A UK online gift retailer selling mostly to wholesale customers. The data has sales, not stock levels, and the shop's busiest season falls in the final 90 days.
- The unit is the stock code. One product can carry more than one code, or be relaunched under a new code, and the data cannot tell, so some products here counted as stopped may be selling under another code.
- The data starts on Dec 1, 2009. A product's first sale here is its first sale in the data, not its launch, and 3,009 of 4,725 products have a first sale in December 2009.
- A gap of 90 days is not always an ending. Some products sell a few times a year, to a few wholesale customers, and a quiet quarter does not mean they are gone.
- The final 90 days (Sep 11 to Dec 9) are the shop's busiest season, so the prior-90 comparison flatters the products. Chart 1 shows the same-season comparison; data covering two years cannot fully separate a season from an ending.
- Slowing needs prior-90 revenue above zero, compared in whole pence (8 products sold in both windows but had prior-90 revenue of zero or less after cancellations, and sit in steady or growing). 149 products in steady or growing had no sale in the prior 90 days, only in the final 90.
- 14 stock codes have only cancellation lines, so they have no sale and are in no group. The last day of data, Dec 9, 2011, ends at 12:50.
Releases and revisions
- This is a fixed historical dataset (as of December 2011); it is not revised.
Sources
Data and licence
- Source
- UCI Online Retail II, Chen, D. (2012), UCI Machine Learning Repository
- Period
- Dec 2009 to Dec 2011 (final 90 days Sep 11 to Dec 9, 2011)
- Licence
- CC BY 4.0
- Charts
- 5, each with its data table and CSV
- Data file
- data/analyses/slow_movers.json
- UCI Online Retail II Chen, D. (2012), UCI Machine Learning Repository. Licence CC BY 4.0.
Licence: CC BY 4.0. Public data.
Download the chart data
Each CSV is made in your browser from the rows in that chart's table.
04Contact
Want this kind of analysis on your own data?
Open to e-commerce, data and operations roles. Los Angeles or remote.