Back in Stock Alerts is live on the Shopify App Store. See the listing →
From the blog

Why restock alert emails fail at the exact moment they matter

The four reasons back in stock alerts go missing or don't help: bad webhooks, burst sends, no audit trail, and Markets mismatches. How to check your own app.

06/30/2026

An envelope stalled on a warehouse conveyor belt, representing a restock alert email that never reached the customer

If you run a back in stock program long enough, you will eventually hit the same complaint from a customer: “I signed up for an alert and never got one.” Sometimes that is a spam filter. Often it is something more structural, and it is worth understanding the structure, because it is the same structure behind every app in this category, not a flaw unique to any one of them.

There are four places this breaks. Restock detection can miss the event entirely. The send itself can get throttled or blocked at the moment it matters most. Nobody, including the merchant, can tell what actually happened because there is no record of it. Or the alert sends perfectly and the customer still cannot buy the product, because it is not available in their market. Each one is checkable, and each one is fixable.

Failure mode 1: the webhook that did not fire

Most back in stock apps detect a restock the same way: they subscribe to Shopify’s inventory_levels/update webhook and wait for Shopify to tell them inventory changed. This is the right first step. It is not, on its own, a complete system.

Shopify’s own documentation on webhooks is direct about this: “Webhook delivery isn’t always guaranteed, and your app can miss or mishandle events for other reasons, such as handler failures or downtime.” That is not a hedge buried in fine print. It is the framing Shopify uses to introduce the topic of webhook reliability to developers building on their platform. Shopify’s stated recommendation for handling this is equally direct: “For redundancy, use reconciliation jobs to periodically fetch data from Shopify so that your app stays consistent with Shopify’s data.”

Read plainly, this means: if an app only listens for the webhook and does nothing else, it has built its core detection mechanism on a channel its own platform vendor says is not guaranteed. When a webhook delivery is missed (a timeout, a brief outage on either side, a burst of simultaneous inventory updates that overwhelms a handler), nothing else in the system knows the restock happened. No poll checks the actual inventory count. No process asks “did we miss anything in the last hour.” The restock just silently does not trigger any alert, and the first anyone hears about it is a customer asking why they were not notified, or worse, nobody asking at all, because most customers who get ignored do not follow up. They just buy from someone else.

Shopify’s guidance to run periodic reconciliation jobs alongside webhook subscriptions exists precisely because this failure mode is expected, not exotic. A reconciliation job, a scheduled check that polls actual inventory state on a fixed interval independent of whether any webhook fired, catches restocks a dropped webhook missed. It is Shopify’s own recommended backstop, not a competitive flourish.

How to check your own app: ask your provider, directly, whether restock detection runs on webhook alone or on webhook plus a scheduled reconciliation check. If the answer is unclear or defensive, that is itself informative. This is a fair, specific technical question, and a team that has actually built the backstop will answer it plainly and fast.

Failure mode 2: the send that got throttled

Say detection works and the restock event fires correctly. The next failure mode shows up on the sending side, and it is arguably more common because it is guaranteed to happen at your highest-stakes moment: the instant a popular item comes back and hundreds or thousands of subscribers all need an email within minutes of each other.

Email infrastructure treats a sudden burst of outbound mail from one sender as a signal worth watching. Google’s bulk sender guidelines and most major mailbox providers ask senders to warm up new domains and IPs gradually, ramping volume over roughly two to six weeks for typical sending and longer for very high volume, because mailbox providers use sending pattern as one input into spam filtering decisions. A domain that has been sending a slow trickle of email and then blasts several thousand messages in a single burst looks, to a receiving mail server, similar to a spam event, regardless of whether the content is legitimate. The practical result: deliverability drops right when volume spikes, which is exactly when a restock alert matters most.

This is why queued, paced sending, releasing a large batch in controlled waves rather than firing it all at once, is standard practice in bulk email generally, not a Shopify-specific trick. Google’s own sender guidelines warn against sending in bursts for exactly this reason. An app that blasts its entire subscriber queue synchronously the moment a webhook fires is optimizing for speed in a way that actively works against deliverability at the volumes that matter.

There is a second layer here specific to multi-tenant apps: a back in stock app is typically sending on behalf of many merchants from a shared sending infrastructure. If one merchant’s list has a high bounce rate or spam-complaint rate, that can affect sender reputation for the shared domain more broadly, depending on how isolated each merchant’s sending is. This is an operational detail most merchants never think about until an email stops arriving with no explanation.

How to check your own app: ask whether there is a batch size or send-pacing control you can see or set, and ask what happens on a restock that triggers, say, two thousand notifications at once. A specific answer (a described pacing mechanism, a warmed sending domain) is a good sign. A vague answer (“we handle that”) is not evidence either way, but it is a reason to ask a more specific follow-up.

Failure mode 3: nobody can tell you what happened

The first two failure modes are technical. This one is procedural, and it is the one that turns a one-off miss into a trust problem: when an email does not arrive, can the merchant, or the app’s own support team, actually find out why?

Without a send-level audit trail (a per-subscriber record of queued, sent, delivered, and clicked, tied to the specific product and variant), a missing email is undiagnosable. Support has no way to distinguish “we never triggered a send for this restock” from “we sent it and it bounced” from “we sent it and it landed in spam.” Each of those has a different fix, and none of them are visible without a log that ties a specific customer to a specific send event.

This matters more than it sounds like it should, because the fix is cheap relative to what it prevents. Logging send state is not a hard engineering problem. It gets skipped anyway, because it does not show up in a product demo and does not feel urgent until the first time a merchant asks “did my customer actually get this,” and the honest answer is “we don’t know.”

How to check your own app: ask for a specific example. Pick a subscriber and a product from a recent restock and ask your provider to show you what happened to that specific alert. If they can produce a timestamped answer, the audit trail exists. If they can only tell you the restock triggered “some” sends with no per-subscriber detail, there is a real gap in what you can diagnose the next time a customer complains.

Failure mode 4: back in stock, but not in your market

If a store sells internationally with Shopify Markets, product availability is not a single global switch. Shopify’s own documentation on catalogs explains that a catalog can have a publication attached to it, and that publication controls what a customer in a given market can actually buy: “customers that belong to the associated market or company location have access to view and purchase only the products and collections within the publication.” A product can be fully restocked, sitting at a healthy inventory count, and still be unpurchasable to a customer in a specific country, because that product was never published to that market’s catalog.

This is a separate thing from inventory. Inventory answers “do we have any.” Market publication answers “can this specific customer buy it.” A restock alert system that only watches inventory levels has no way to know the second one changed, or that it was ever missing in the first place. Shopify’s Storefront API treats this as a contextual question on purpose: as of API version 2024-04, availability fields are meant to be queried per market country using the @inContext directive, which only exists because the same product can return a different answer depending on which market is asking.

Here is where it breaks for a customer. Someone in Germany signs up for a restock alert. The item comes back in stock at the warehouse level. The app fires the alert, correctly, because inventory did increase. The customer clicks through and lands on a product page that shows the item as unavailable, because the product was never added to the publication tied to the German market’s catalog, or a market-specific change has not caught up yet. From the customer’s side this looks like a broken promise: they got the email, they clicked, and the thing still is not for sale to them. From the merchant’s side everything technically worked. The alert sent, the click tracked, the inventory number was right. Nothing flagged an error, because in the narrow sense nothing failed.

Shopify’s own tooling has a documented gap here that makes this harder to catch automatically. The same catalogs documentation notes plainly that “there are no webhooks that are associated with changes to catalogs or price lists.” So even an app that wanted to watch for a product being unpublished from a market’s catalog has no event to subscribe to, the way it does for inventory. It would have to poll catalog and publication state directly, which is a different and less common integration than the inventory webhook most back in stock apps are already built around.

Being direct about it: Kelso does not check market or catalog publication state today. Our detection is inventory-based, the same as most apps in this category. That is a real gap, not a competitive point, and a merchant selling through Shopify Markets should know to ask about it whichever app they use.

How to check your own app: if you sell in more than one market, pick a product and a market where you know the product is unpublished or restricted, and ask your provider whether their restock alert logic checks catalog and publication availability for that market before sending, or whether it only checks inventory count. If the honest answer is “just inventory,” that is not necessarily a dealbreaker, but it means you should expect this exact complaint from customers outside your main market, and you will want a manual way to catch it in the meantime.

What this adds up to

None of these failure modes are exotic edge cases. The first three are the predictable behavior of webhook-only detection, unpaced sending, and undocumented delivery: design choices that are each individually reasonable shortcuts and, combined, describe why “the email just didn’t send” keeps showing up as a recurring complaint in this category. Fixing those three is not a moonshot. It is a reconciliation poll behind the webhook, a queued sender with pacing controls, and a log table that records every send. The fourth is different in kind. It is not a shortcut anyone took, it is a mismatch between where inventory lives and where a product is published, and it only shows up once you sell into more than one market. None of it is glamorous. All of it is checkable, in a conversation with any provider, in about five minutes.

Kelso’s approach to the detection half of this is a two-path design: the inventory webhook fires for speed, and a scheduled reconciliation poll runs behind it and catches whatever the webhook drops, matching Shopify’s own recommended pattern rather than treating the webhook as sufficient on its own. If your current app can’t answer these questions and you’re weighing a switch, our free back in stock plan is $0 a month with no credit card needed, and it includes a full send audit log so you can check exactly what happened to any alert yourself.

The short version

Ask any back in stock app four questions: does detection run on webhook alone or webhook plus a reconciliation poll, is sending paced or blasted, can you trace one specific subscriber’s alert from queue to delivery, and if you sell in more than one market, does it check that the product is actually purchasable in the customer’s market before it sends. The answers tell you more about whether alerts will actually arrive, and actually help, than any feature list or star rating will.

Better than asking is proving it. You can run the first three checks on your own store in about ten minutes with a spare email and a cheap product: here is how to test your back in stock alerts before you trust them.

Back in Stock Alerts

Stop losing restocks

Kelso emails your customers the moment a sold-out product is back. It's live on the Shopify App Store, and free to install.

Free to install. Plans from $0, upgrade only if you outgrow it.

Founding 50

The first 50 stores to install lock today's price for as long as they stay subscribed. No countdown, the count is real.

More from the blog

Keep reading

07/14/2026

Back in stock alerts for a specific size or color, not the whole product

Why a product-level notify-me trains customers to ignore you, how variant-level back in stock alerts work on Shopify, and a five-minute test to check which one you actually have.

07/11/2026

How to test your back in stock alerts before you trust them

Restock alerts fail quietly, and you usually find out from a sales dip, not an error message. Here is a ten-minute self-test any merchant can run on any app to prove alerts actually fire and land before you rely on them.

07/09/2026

4 back in stock email templates you can copy today

Four real back in stock email templates for Shopify, from a basic restock alert to a win-back for something long out of stock, plus what makes a restock subject line actually get opened

07/07/2026

SMS opens faster than email, but that is not the whole back in stock story

A plain comparison of SMS and email restock alerts on Shopify: real open and conversion numbers, actual per-message SMS costs, opt-in law, and when each channel makes sense.

07/05/2026

How to add a back in stock button to your Shopify product pages

Three real routes for adding a notify-me button when a variant sells out: theme code, Shopify's native workarounds, and a purpose-built app block, plus what to check before you trust any of them.

07/05/2026

Stocky is shutting down August 31. Here's what small Shopify stores can do

Stocky's shutdown timeline, what breaks and when, the supplier data you need to export now, and an honest roundup of native, budget, and enterprise alternatives for small Shopify stores.

07/04/2026

Your restock email is late, and that is deciding who gets the sale

How demand decays after a restock, why batch pacing and send speed both matter, and how to audit your back in stock app's actual send latency, timestamp by timestamp.

07/02/2026

Back in stock apps for Shopify: what the pricing actually costs at scale

A line-by-line pricing teardown of Swym, Appikon, Amp, STOQ, Notify!, and Kbite, plus what per-subscriber vs. per-send metering means for your actual monthly bill as your list grows.

06/28/2026

How to migrate your back in stock waitlist to a new app without losing subscribers

A practical walkthrough for moving a back in stock waitlist between Shopify apps: exporting your data, matching CSV columns, verifying the import, and timing the cutover around a restock.