Guides · Low stock alerts

Shopify low stock alerts: the free way, and the four places it breaks

Shopify Flow sends low stock emails for free on every plan. Here is how to set it up in about five minutes, and the four situations where a fixed threshold quietly stops working.

There are two different things people mean by "low stock on Shopify", and they need opposite tools.

  • You want to know, as the merchant, when a variant is running down so you can reorder. That is this guide.
  • You want the customer to see "Only 3 left!" on the product page. That is a theme change, not an alert, and the last section of this guide covers it in four lines.

If you are here for the first one, the honest answer is that Shopify can already email you, for free, on every plan. Set that up first. Then read the second half, because the free version has four specific failure modes and you should know which one is going to bite you before it does.

The free way: Shopify Flow, about five minutes

Shopify Flow is included on Basic, Shopify, Advanced and Plus. It is a first-party app you install from the App Store, and there is a ready-made template for exactly this.

  1. Install Shopify Flow from the Shopify App Store.
  2. Open Templates and pick Get notified by email when product variant inventory is low.
  3. Set the threshold. The template ships with 10.
  4. Set the email address the alert goes to.
  5. Turn the workflow on.

Under the hood it uses the Product variant inventory quantity changed trigger, adds a condition on the new quantity, and sends an internal email. You can open it and edit any of those three parts, which matters for what follows.

That is genuinely enough for a store with a few dozen SKUs, one location, and steady demand. If that is you, stop here. You do not need an app for this and nobody should sell you one.

Where the free version breaks

1. One number for every product

A Flow workflow has one threshold. Ten units is generous for a wedding dress and useless for a $4 lip balm that ships forty a week. Everything you sell shares the same line.

The workaround inside Flow is to duplicate the workflow and add a condition on a tag, so fast-mover products get a threshold of 60 and everything else gets 10. That works. It also means you now maintain tags on your catalogue by hand, and every new product starts in the wrong bucket until someone remembers.

The underlying problem is that a unit count is not a measure of urgency. Forty units is a crisis at eight sales a day and a dead asset at one sale a month. What you want to say is "tell me when I have less than three weeks of cover left", and a fixed number cannot express that.

2. It fires on every change, not once

The trigger fires when the quantity changes. It does not fire once when you cross the line and then go quiet.

So a variant sitting at 8 units with a threshold of 10 sends you an email at 8, another at 7, another at 6, another at 5. A busy Friday on a popular SKU produces a column of identical emails, and the useful ones about your other products are buried in it. Within two weeks you have a filter that files them all in a folder you stop opening, which is the same as having no alerts at all.

You can defend against this in Flow — add a tag when the first alert fires, condition on the tag being absent, remove the tag when stock goes back up — but you are now maintaining a small state machine in a visual editor, and you have to get the reset right or the alert never fires again.

3. Nothing happens if nothing sells

This one is counter-intuitive and it is the one that actually costs money.

The trigger is inventory quantity changed. A variant that is already at 2 units and does not sell for three weeks never changes quantity, so it never triggers anything. It is not "low stock" in Flow's eyes. It is invisible.

That is precisely the state you want a report on: things that are nearly gone and are sitting there, quietly not being reordered, because the last alert about them scrolled out of your inbox a month ago. A trigger-based system can only ever tell you about motion. It cannot tell you about a standing state.

4. Locations

The trigger is not location-specific. It fires on a change anywhere, and the quantity you get in the condition is the one you have to dig out yourself.

If you hold stock in a warehouse and a retail shop, "12 units total" can mean 12 in the warehouse and 0 in the shop — where a customer is standing right now. To read per-location numbers in Flow you have to walk productVariant / inventoryItem / inventoryLevels / available and match on location id, which is doable and is not something most merchants are going to build or maintain.

There is a longer version of this problem in multi-location inventory on Shopify.

What the reports give you instead

Flow is push. Shopify's Analytics → Reports section is pull, and it covers the state problem that Flow cannot see. Depending on your plan you get, among others:

  • Inventory remaining per product — an estimate of days until a variant runs out, based on its recent sales rate. This is the closest thing Shopify gives you to a velocity-aware view, and it is free.
  • Inventory sold daily by product — the average units per day you need for any reorder maths.
  • ABC product analysis — grades products by revenue contribution over 28 days, which tells you which stockouts are worth losing sleep over.
  • Month-end inventory snapshot and Month-end inventory value.

The catch is the obvious one: a report only helps on the day someone opens it. In practice that is the day after something went out of stock.

The rule of thumb

  • One location, few SKUs, steady demand → Shopify Flow's template. Free, five minutes, done.
  • Fast movers mixed with slow movers → Flow plus tags, and accept the maintenance.
  • Several locations, or demand that changes with the season → a fixed threshold is going to be wrong in one direction or the other most of the time, and the state you most need to see (nearly gone, not moving) is the one nothing reports on by itself.

That last case is why we build StockPilot: a threshold that can be expressed in days of cover rather than units, computed per location from real sales velocity, sent as one message rather than one per unit sold, and re-checked on a schedule so a stalled variant still surfaces. It has a free plan; it is $9/month after that.

And the other question: showing "Only 3 left" to customers

That is a storefront change and it needs nothing from this page. The inventory quantity is available in Liquid as variant.inventory_quantity when inventory is tracked, so a theme snippet like a conditional on variant.inventory_quantity <= 5 is all it takes. Most modern themes have a setting for it, usually called something like low stock notice or inventory threshold, in the product section of the theme editor.

If instead you want to email customers when a sold-out product comes back, that is a third thing again, and it is covered in low stock alerts vs back in stock alerts.


Checked against Shopify's documentation on 5 August 2026. Flow trigger behaviour, including the fact that the inventory trigger is not location-specific by default, is from Shopify's own trigger reference.

StockPilot watches this for you

One email when a variant drops below the level you set, per location, based on real sales velocity. No alert storms. Free plan, then $9/month.

Install on Shopify