Duplicate low stock alert emails: one alert per crossing
If you are searching for duplicate low stock alert emails, you have had the same SKU shout at you four times and stopped reading any of it. Restoc fires one alert per SKU per threshold crossing, on each channel you have switched on, and re-running the job does not send it again.
A screenshot of Restoc, which is not open yet, showing sample data. Nothing in it is a promise: what the product does is what this page says in words.

Why one crossing turns into five emails
A reorder alert is worth nothing if you do not believe it. The fastest way to stop believing it is to get the same SKU five times in a week.
The mechanics are simple enough to see from the warehouse floor. An alerting job wakes up, compares each SKU's stock against its reorder point, and sends a message for every SKU sitting under the line. If nothing records what already went out, the next pass sends again. The SKU is still under the line tomorrow. It is still under the line the day after. By Friday your inbox has the same candle variant eight times and you have trained yourself to skim past all of them, including the one for the SKU you actually needed to order.
There are three other ways repeats creep in.
- Retries. A send fails on a timeout. The job tries again later, which is correct, but if the first attempt half succeeded you get two messages for one crossing.
- Overlapping runs. Two passes of the same job run close together. Both read the same SKU, both decide it is below its reorder point, both send.
- Stock hovering on the line. A SKU dips one unit under, a return pushes it one unit back over, then it dips again. Each dip reads as new.
Only the last of those is a real event. The other three are bookkeeping failures, and they are the ones that cost you trust in the alert.
How Restoc keeps it to one alert per crossing
- The job compares stock against the reorder point
A background job checks each tracked SKU's current stock against its reorder point, which Restoc works out from your sales velocity window of 7, 14 or 30 days and the lead time you entered for that SKU.
- A crossing opens exactly one alert record
When a SKU crosses its reorder point, Restoc writes one alert record for it. Uniqueness is enforced on the SKU plus the date the alert was triggered, so a second pass that sees the same crossing cannot open a second record.
- Delivery goes out on the channels you set
The alert is delivered by email, and by Slack incoming webhook on Growth and above. Each channel gets one message for that crossing, not one per pass of the job.
- The record is marked delivered only on a successful send
A delivered flag guards the send. Once a message is away, later runs see the record as delivered and skip it. If the send failed, the record stays undelivered and is picked up again, so a retry replaces the lost message instead of adding to it.
- Re-running the job changes nothing
Running the alert job twice for the same SKU and the same crossing creates no duplicate rows and re-fires no email or Slack message. That behaviour is pinned by a test, not left to chance.
What that buys you
An inbox you still read
One email per SKU per crossing means the count in your inbox is the count of SKUs that need a decision. Four alerts is four purchase decisions, not one SKU shouting four times.
A Slack channel your team can scan
Shared channels punish repeats harder than inboxes do, because everyone sees them. Restoc posts a Slack message once per crossing on Growth and above, so the channel stays a short list rather than a scroll.
Retries without noise
A failed send is retried because the record is only marked delivered when a send succeeds. You get the alert you were owed, and only that one.
Safe to re-run
If a scheduled pass overlaps another, or an operator triggers the job by hand to clear a backlog, the uniqueness check and the delivered flag absorb it. No merchant pays for that in emails.
Held to a test, not a promise
The once-per-crossing contract is covered by an automated test that re-runs delivery for the same SKU and asserts no duplicate row and no second send.
What counts as the same crossing
| Situation | What Restoc does |
|---|---|
| The alert job runs again while the SKU is still below its reorder point | Nothing is sent. The crossing already has a delivered alert record. |
| A send failed on the first attempt | The record stays undelivered and is retried, so you get one message, late rather than twice. |
| Two passes of the job overlap on the same SKU | The uniqueness check on SKU plus trigger date means only one alert record exists to deliver. |
| You have email and Slack both switched on | One message per channel for that crossing. Two destinations, not two alerts. |
| Stock recovers above the reorder point, then falls under it again | A new crossing, and a new alert. That is a real event and it is meant to reach you. |
What this page does not cover
Restoc is not open yet, so none of this is offered as a track record. It is how the alert path is built and what the test holds it to.
Three related questions have their own pages rather than a paragraph here. How many alerts a store of your size should expect in a normal week is a volume question, and it depends on your SKU count and how fast you sell. What to check when no alert arrived at all is the opposite failure, and the order to check things in matters. And the weekly reorder report is the deliberate alternative to a running feed of messages: one list, once a week, with a suggested order quantity per SKU, exportable as CSV.
On plans, email alerts are included from Starter at $29 a month for up to 200 tracked SKUs. Slack alerts through an incoming webhook start at Growth, $59 a month for up to 1,000 tracked SKUs. Every plan carries a 60-day free trial. Nothing about duplicate suppression is held back for a higher tier: one alert per crossing is how the job works, on every plan.
Questions
Why do low stock alert apps send the same email repeatedly?
Usually because the alerting job re-evaluates every SKU on each pass and sends for anything currently below its threshold, without recording what it already sent. The SKU stays below the line for days, so the message goes out again on every pass. Retries and overlapping runs add more. Restoc records one alert per SKU per crossing and marks it delivered on a successful send, so later passes skip it.
Will a retry after a failed send give me two emails?
No. An alert record is only marked delivered when a send succeeds. A failed send leaves it undelivered so it is tried again, and a successful send closes it to further attempts. You get one message per crossing per channel, even if the first attempt did not get through.
If email and Slack are both on, is that a duplicate?
No, that is one alert reaching two places. Each channel you have enabled receives one message for that crossing. Slack alerts are part of Growth and above; email alerts are on every plan.
When does the same SKU alert me a second time?
When it crosses its reorder point again, which means stock recovered above the point and then fell back under it. That is a new crossing and a new decision about whether to order. Sitting continuously below the reorder point does not produce a second alert.
Can I get one daily or weekly digest instead of individual alerts?
There is no digest mode for alerts today, and we will not pretend otherwise. The weekly reorder report is the batched view: SKUs below their reorder point with a suggested order quantity, in the app and exportable as CSV. Alerts cover the crossing, the report covers the ordering session.
Does a re-run by support or a scheduler cause a flood?
It should not. Re-running the alert job for the same SKU and the same crossing creates no duplicate alert record and re-fires no email or Slack message. An automated test drives exactly that case.
Can I mute a single noisy SKU?
Not as a per-SKU mute, no. What you can change is the inputs: the store-wide sales velocity window of 7, 14 or 30 days, and the lead time on that SKU. On Pro you can override the velocity window for a single SKU, which is the right lever for an item that sells in bursts.