Skip to main content
Card class: Non-HeroCategory: Ecommerce Platform
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 countsGROUP 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 endpointAdmin GraphQL. Order.lineItems.edges.node.product joined with Product.id, status, variants[]. Products with status = ACTIVE only; archived and draft are excluded.
VAT / tax treatmentFollows 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.
ShippingExcluded. Line item revenue, not order revenue.
DiscountsAlready deducted (the discountedTotal is post-discount).
RefundsNOT deducted. A heavily-refunded product still shows its gross sales. To net out, pair this card with Top Refunded Products.
Cancelled / voided ordersIncluded. Line items on VOIDED orders still contribute. The card optimises for visibility, not financial reporting.
CurrencyMulti-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 / sourcesNot 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 productsProducts 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 window90D (single window, no vsP comparison)
Alert triggerNone. This is a curation tool, not an anomaly detector.
Rolesowner, operations

Calculation

GROUP BY product name ASC SUM(revenue)
  WHERE date BETWEEN [period_start, period_end]

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:
RankProduct90D revenue90D unitsInventory on handLast sold
612Ceramic plant pot, charcoal, 30cm£0014 units04 Aug 25
611Linen napkin set, sage, 4-pack£0032 sets18 Sep 25
610Brass candle holder, small£009 units12 Nov 25
609Wool throw, oatmeal£006 units02 Dec 25
608Wooden tray, oak, large£42118 units28 Mar 26
607Glass vase, smoke, tall£58122 units14 Apr 26
606Cotton cushion cover, terracotta£64241 units03 May 26
605Marble coaster set, 6-pack£75228 sets09 Apr 26
604Ceramic mug, navy£88467 units11 May 26
603Stoneware bowl, blush, small£95319 units06 May 26
Five things to notice:
  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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:
CardWhy pair it with Slow-Moving ProductsWhat the combination tells you
Top Products by RevenueThe 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 ProductsProducts 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 DistributionShows working capital tied up by SKU.Bottom-decile SKUs with high inventory on hand are the real working-capital bleed.
Stock vs SalesVelocity 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 TypeTells 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 HealthAre 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_productsSame definition for agencies running cross-platform clients.Documentation cross-link, not a reconciliation.
adobe_commerce.bottom_productsSame 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.
Why our number may legitimately differ from Shopify Admin:
ReasonDirectionWhy
Refund treatmentShopify 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 zoneBoundary daysShopify 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 filteringEitherShopify’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-currencyOurs is wrong-shapeShopify 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 filterTheirs higherShopify’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 accountingEitherShopify Bundles attribute revenue to the bundle SKU. Component SKUs sold via bundles can appear lower-velocity here than they really are.
Cross-connector reconciliation: This is a Shopify-internal merchandising metric. There is no direct cross-connector twin. The closest analytic peers are:
CardExpected relationshipWhat causes legitimate divergence
google_analytics.ga_top_productsInverted ranking, the opposite tail of GA4’s product reportGA4 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_keywordsCross-channel wasteAd keywords pointing at slow-moving SKUs are the highest-ROI pause candidates.
amazon_ads.amazon_oos_skusInventory truth checkA 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 a createdAt 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:
  1. Filter for created_at < 90 days ago (true low-velocity, not new launches).
  2. Cross-reference against Inventory Distribution, products with high stock + zero sales are the urgent sunset candidates.
  3. Cross-reference against Top Refunded, refund-driven low net sales is a quality / sizing fix, not a sunset.
  4. Cross-reference against wholesale and retail channels, products may sell offline at trade fairs without showing in Shopify online sales.
  5. Survivors of the above are the genuine sunset / clearance candidates. Plan a 30 to 50% clearance discount for those.
Multi-store / multi-region, how does this card work? Each Shopify store is a separate Vortex IQ integration. The card runs per store. If you sell the “same” product on the UK and US storefronts under separate SKUs, each store’s bottom-products list is independent. To see a global view, sum at the parent-product level outside the card today; a global cross-store rollup is on the roadmap. Multi-currency, how does the ranking work? Poorly, on stores transacting in more than one currency. The card sums revenue in original currency without FX conversion, so a £100 sale and a €100 sale add to 200 (currency-blind). For accurate multi-currency reads, filter the OpenSearch index to a single 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:
  1. Pull this card with 90D window.
  2. Filter mentally to created > 90 days ago.
  3. Sort by inventory on hand × cost (highest dead-capital first).
  4. For top 20 dead-capital items: decide between clearance, repackaging (bundle into kits), or sunset.
  5. For the rest: schedule a re-merchandising review (collection placement, photography, copy, price test).
  6. Set a 30-day check-in to measure whether the action moved the SKUs off the list.

Tracked live in Vortex IQ Nerve Centre

Slow-Moving Products is one of hundreds of KPI pulses Vortex IQ tracks across Shopify and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.