Bottom decile by revenue. Candidates for sunset / clearance / repositioning.
At a glance
The bottom decile of your active catalogue ranked by 90-day revenue. The list every quarterly merchandising review should start with: which SKUs are tying up working capital, taking up shelf space on collection pages, and earning their keep on neither acquisition nor retention.
| What it counts | GROUP BY product_id ORDER BY SUM(line_item.discountedTotal) ASC LIMIT bottom_decile. Each product (not variant) is one row, with its 90-day revenue summed across every line item that referenced it. |
| API endpoint | Admin GraphQL. Order.lineItems.edges.node.product joined with Product.id, status, variants[]. Products with status = ACTIVE only; archived and draft are excluded. |
| VAT / tax treatment | Follows the parent line item’s discountedTotalSet.shopMoney.amount, which is post-discount, pre-tax for taxesIncluded = false stores (US) and post-discount, post-tax for taxesIncluded = true stores (UK / EU). The card sums the field as Shopify reports it, no normalisation. |
| Shipping | Excluded. Line item revenue, not order revenue. |
| Discounts | Already deducted (the discountedTotal is post-discount). |
| Refunds | NOT deducted. A heavily-refunded product still shows its gross sales. To net out, pair this card with Top Refunded Products. |
| Cancelled / voided orders | Included. Line items on VOIDED orders still contribute. The card optimises for visibility, not financial reporting. |
| Currency | Multi-currency arithmetic sum WITHOUT FX conversion. Stores transacting in more than one currency get a meaningless ranking; filter to a single currency for clean reads. |
| Channels / sources | Not filtered. Online Store, POS, Buy Button, marketplace channels all contribute. A product that sells well in retail but poorly online still shows here. |
| Zero-sales products | Products with zero 90-day sales ARE included. They sort to the very bottom of the list with revenue = 0 and are typically the highest-priority sunset candidates. |
| Time window | 90D (single window, no vsP comparison) |
| Alert trigger | None. This is a curation tool, not an anomaly detector. |
| Roles | owner, operations |
Calculation
Worked example
A UK DTC homeware brand on Shopify, 612 active SKUs in catalogue. Period: 12 Feb 26 to 12 May 26 (90 days). The card surfaces the bottom decile, 61 products, but the operational story sits in the bottom 15:| Rank | Product | 90D revenue | 90D units | Inventory on hand | Last sold |
|---|---|---|---|---|---|
| 612 | Ceramic plant pot, charcoal, 30cm | £0 | 0 | 14 units | 04 Aug 25 |
| 611 | Linen napkin set, sage, 4-pack | £0 | 0 | 32 sets | 18 Sep 25 |
| 610 | Brass candle holder, small | £0 | 0 | 9 units | 12 Nov 25 |
| 609 | Wool throw, oatmeal | £0 | 0 | 6 units | 02 Dec 25 |
| 608 | Wooden tray, oak, large | £42 | 1 | 18 units | 28 Mar 26 |
| 607 | Glass vase, smoke, tall | £58 | 1 | 22 units | 14 Apr 26 |
| 606 | Cotton cushion cover, terracotta | £64 | 2 | 41 units | 03 May 26 |
| 605 | Marble coaster set, 6-pack | £75 | 2 | 28 sets | 09 Apr 26 |
| 604 | Ceramic mug, navy | £88 | 4 | 67 units | 11 May 26 |
| 603 | Stoneware bowl, blush, small | £95 | 3 | 19 units | 06 May 26 |
- Zero-sales SKUs are the priority. Products 609 to 612 have not sold in 4+ months. Combined inventory value at cost is roughly £1,400. Either the listings are broken (no images, hidden from collection, mis-tagged), or the products are genuinely dead. A 5-minute audit of the 4 PDPs answers the question.
- The next tier (608 to 612) is the discounting question. They sold 1 to 2 units in 90 days. Either the price is wrong, the photography is wrong, or these are seasonal items in the wrong season (oak tray in spring is plausible). A 30% clearance discount on these 5 SKUs would clear 200+ units of working capital at a manageable margin hit.
- Inventory on hand reveals the working capital bleed. Line 612 (charcoal plant pot) holds 14 units of stock against zero 90-day sales. At a typical homeware cost of £8 per unit, that is £112 of dead capital sitting on shelf. Multiply by the 30 worst SKUs and a typical merchant discovers £3,000 to £8,000 of dead working capital.
- The card excludes refunds, so survival bias is hidden. A product that sold 50 units but had 35 refunded shows £750 net sales but £2,000 gross on this card, ranking it well above its true performance. Always cross-reference Top Refunded Products before sunsetting; refund-heavy products are different problems (sizing, quality) from no-sales products (visibility, demand).
- Channel mix can defend the SKU. The wooden tray sold 1 unit online but might be doing 12 a month at the brand’s stockist or weekly market stall. POS and online both feed this card, but a wholesale SKU sold at trade-shows offline (not via Shopify POS) is invisible here. Check sell-through with the wholesale team before pulling.
Sibling cards merchants should reference together
The bottom-products list answers “what to cut”, but the decision needs context. Pair it with these:| Card | Why pair it with Slow-Moving Products | What the combination tells you |
|---|---|---|
| Top Products by Revenue | The mirror image. Compare top vs bottom decile widths. | A healthy catalogue has a 80/20 (top 20% drives 80% revenue). A flat catalogue with no clear winners signals merchandising drift. |
| Top Refunded Products | Products with high gross sales but high refunds may rank higher than they should on the bottom-products view. | Cross-reference before sunsetting. A refund-heavy product is a quality / sizing problem, not a demand problem. |
| Inventory Distribution | Shows working capital tied up by SKU. | Bottom-decile SKUs with high inventory on hand are the real working-capital bleed. |
| Stock vs Sales | Velocity ratio per SKU. | A bottom-decile SKU with 40+ units of stock and 0 velocity is a clearance candidate; one with 2 units and 0 velocity is just out of stock. |
| Products by Type | Tells you if entire categories are dragging. | If 30 of the bottom 61 share one productType, the whole category may be dying, not individual SKUs. |
| Collection Health | Are these products even visible to shoppers? | Zero-sales SKUs are often missing from collection pages, leaving them stranded in catalogue search-only purgatory. |
bigcommerce.bottom_products | Same definition for agencies running cross-platform clients. | Documentation cross-link, not a reconciliation. |
adobe_commerce.bottom_products | Same definition for Adobe Commerce stores. | Documentation cross-link. |
Reconciling against the vendor’s own dashboard
Where to look in Shopify Admin: The closest Shopify-native view is:Analytics → Reports → “Sales by product” (Under the Sales category. Sort the Net sales column ascending.)Pick the same 90-day date range. Sort Net sales ASC. The bottom of the list should mirror this card to within reconciliation tolerances. Other Shopify Admin views that look similar but are not the same:
- Reports → Sell-through rate: a velocity ratio (units sold / units stocked), not a revenue ranking. A high-priced low-volume luxury item can have low sell-through but high revenue and would not appear here.
- Products → All products → sort by Total sales: a product-list-level view, but Shopify’s product list does not always include zero-sales products by default; toggle the column visibility.
- Apps like Stocky, Inventory Planner: include incoming POs and forecast demand. They give you a forward-looking sunset signal; this card is purely backward-looking 90D.
| Reason | Direction | Why |
|---|---|---|
| Refund treatment | Shopify lower (Net sales view) | Shopify’s “Net sales by product” deducts refunds from the line item. This card sums gross. A product with high refund rate looks better here than in Shopify Admin. |
| Time zone | Boundary days | Shopify uses store time zone for the 90D boundary; Vortex IQ uses UTC. The first / last day of the window may differ by 1 to 24 hours of orders. |
| Channel filtering | Either | Shopify’s report can be filtered by sales channel; this card aggregates across all channels by default. POS-heavy SKUs look stronger in the Shopify all-channel view than in an online-only filtered view. |
| Multi-currency | Ours is wrong-shape | Shopify converts all sales to store currency; this card sums in original currencies without FX. Multi-currency stores should filter to a single currency in the OpenSearch index for clean reads. |
| Status filter | Theirs higher | Shopify’s report includes archived and draft products by default; this card filters to status = ACTIVE. The bottom of Shopify’s list is almost always recently archived stock. |
| Bundle accounting | Either | Shopify Bundles attribute revenue to the bundle SKU. Component SKUs sold via bundles can appear lower-velocity here than they really are. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_analytics.ga_top_products | Inverted ranking, the opposite tail of GA4’s product report | GA4 sees view-then-purchase events, not unit sales. A product with 0 GA4 page views will not even appear in GA4 reports, hiding the worst dead-stock cases. |
google_ads.google_low_performance_keywords | Cross-channel waste | Ad keywords pointing at slow-moving SKUs are the highest-ROI pause candidates. |
amazon_ads.amazon_oos_skus | Inventory truth check | A SKU on this list with active Amazon ads is dual-channel waste. |
Known limitations / merchant FAQs
Why is a product I just launched on the bottom-products list? Because the 90D window starts before launch. A product launched 14 days ago has only 14 days of sales attributed against a 90-day denominator, ranking it well below seasoned SKUs. Filter the list mentally for SKUs with acreatedAt older than 60 days, or wait until the product has a full 90-day track record before deciding.
Should I sunset every product on this list?
No. The list is the candidate pool, not the action list. A typical playbook:
- Filter for
created_at < 90 days ago(true low-velocity, not new launches). - Cross-reference against Inventory Distribution, products with high stock + zero sales are the urgent sunset candidates.
- Cross-reference against Top Refunded, refund-driven low net sales is a quality / sizing fix, not a sunset.
- Cross-reference against wholesale and retail channels, products may sell offline at trade fairs without showing in Shopify online sales.
- Survivors of the above are the genuine sunset / clearance candidates. Plan a 30 to 50% clearance discount for those.
presentmentCurrency before consulting the card. Most multi-currency Shopify Plus stores rank fine on the Top side (high revenue dominates), but the bottom decile can be distorted by currency mix.
Shopify Plus vs basic: any difference?
No definitional difference. Shopify Plus stores tend to have larger catalogues (thousands of SKUs), so the bottom decile is a longer list (a 5,000-SKU catalogue produces a 500-product bottom decile). The card returns the same shape; the merchant playbook is the same.
Refresh cadence?
The OpenSearch index updates from the Shopify GraphQL Bulk API on the standard reconciliation schedule (hourly for orders, daily for products). The 90-day rolling window updates at the same cadence. New product launches will appear in the catalogue within 24 hours of creation; their sales will appear within an hour.
B2B vs DTC, does the card behave differently?
B2B orders contribute the same way DTC orders do. A B2B-only product placed on a wholesale-only catalogue but with no recent wholesale orders will still appear here. A common B2B pattern is large infrequent orders (£5,000 every 90 days), in which case the product can swing from the top decile to the bottom decile and back depending on the timing of orders within the 90-day window. For B2B-heavy stores, expand the window to 180 or 365 days for stable rankings; this is on the configurability roadmap.
The card moved this week, what does that mean?
Bottom-decile membership turns over slowly. A product moving onto the list usually means a 60-day quiet period. A product moving off the list usually means it sold a few units this week. Track the number of zero-sales SKUs week-on-week; a rising count means dead inventory is accumulating, a falling count means clearance or sunsets are working.
Action playbook for the quarterly review:
- Pull this card with 90D window.
- Filter mentally to
created > 90 days ago. - Sort by
inventory on hand × cost(highest dead-capital first). - For top 20 dead-capital items: decide between clearance, repackaging (bundle into kits), or sunset.
- For the rest: schedule a re-merchandising review (collection placement, photography, copy, price test).
- Set a 30-day check-in to measure whether the action moved the SKUs off the list.