> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Slow-Moving Products, Shopify

> Bottom decile by revenue. Candidates for sunset / clearance / repositioning. How to read it, why it matters, and how to act on it.

**Metrics type:** [Supporting Metrics](/nerve-centre/overview#metrics-types-explained)  •  **Category:** [Ecommerce Platform](/nerve-centre/connectors#connectors-by-type)

> 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](/nerve-centre/kpi-cards/shopify/top-refunding-customers).                                                                                                 |
| **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

```
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:

| 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 |

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](/nerve-centre/kpi-cards/shopify/top-refunding-customers) 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:

| Card                                                                                      | Why pair it with Slow-Moving Products                                                                         | What the combination tells you                                                                                                             |
| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| [Top Products by Revenue](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/top-refunding-customers)          | 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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/stock-vs-sales-velocity)                 | 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](/nerve-centre/kpi-cards/shopify/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](/nerve-centre/kpi-cards/shopify/collection-category-count)            | 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`](/nerve-centre/kpi-cards/bigcommerce/slow-moving-products) | Same definition for agencies running cross-platform clients.                                                  | Documentation cross-link, not a reconciliation.                                                                                            |
| [`adobe_commerce.bottom_products`](/nerve-centre/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"](https://admin.shopify.com/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:**

| 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.                                                                  |

**Cross-connector reconciliation:**

This is a Shopify-internal merchandising metric. There is no direct cross-connector twin. The closest analytic peers are:

| Card                                                                                                     | Expected relationship                                       | What causes legitimate divergence                                                                                                                           |
| -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`google_analytics.ga_top_products`](/nerve-centre/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`](/nerve-centre/google_ads/google_low_performance_keywords) | Cross-platform waste                                        | Ad keywords pointing at slow-moving SKUs are the highest-ROI pause candidates.                                                                              |
| [`amazon_ads.amazon_oos_skus`](/nerve-centre/amazon_ads/amazon_oos_skus)                                 | Inventory truth check                                       | A SKU on this list with active Amazon ads is dual-channel waste.                                                                                            |

***

<details>
  <summary><em>Same-metric documentation cross-reference (for agencies running multiple platforms)</em></summary>

  The same definition lives on other commerce platforms. This is **not a reconciliation**, your Shopify store does not have a parallel store on BigCommerce or Adobe Commerce. These cross-links exist so agencies running multi-platform client books can navigate between identical metrics across the docs.

  * [`bigcommerce.bottom_products`](/nerve-centre/kpi-cards/bigcommerce/slow-moving-products)
  * [`adobe_commerce.bottom_products`](/nerve-centre/adobe_commerce/bottom_products)
</details>

## 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](/nerve-centre/kpi-cards/shopify/inventory-distribution), products with high stock + zero sales are the urgent sunset candidates.
3. Cross-reference against [Top Refunded](/nerve-centre/kpi-cards/shopify/top-refunding-customers), 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](https://app.vortexiq.ai/login) or [book a demo](https://www.vortexiq.ai/contact-us) to see this metric running on your own data.
