low-stock-alerts
Set up automated alerts when products fall below custom thresholds so you can reorder before running out of stock
What this skill does
# Low Stock Alerts
## Overview
Low stock alerts notify you when inventory drops below a threshold so you can reorder before running out. Every major platform has this built in — Shopify, WooCommerce, and BigCommerce all send email notifications when stock falls below a configured level. For more advanced needs like demand-based thresholds, supplier PO automation, or team notifications in Slack, dedicated apps add those capabilities without custom code.
## When to Use This Skill
- When products are unexpectedly running out of stock and missing sales
- When the current inventory workflow relies on manual checks rather than automated alerts
- When you want demand-based reorder points rather than fixed thresholds
- When the store has supplier lead times that need to be factored into when to reorder
## Core Instructions
### Step 1: Determine platform and choose the right tool
| Platform | Built-in Alerts | Recommended Extension |
|----------|-----------------|-----------------------|
| **Shopify** | Shopify sends an email notification when stock hits zero; very limited threshold control | Stocky (free, by Shopify) for configurable thresholds and PO automation; Back in Stock for customer notifications |
| **WooCommerce** | WooCommerce emails the store admin when stock drops below the configured low-stock threshold | ATUM Inventory Management for per-product thresholds, supplier emails, and reorder suggestions |
| **BigCommerce** | Built-in low stock notifications per product with configurable threshold | Multi-Location Inventory app for location-specific alerts |
| **Custom / Headless** | Build a background job that checks levels against reorder points | Required when platform has no native alerting or you need supplier email automation |
---
### Step 2: Platform-specific setup
---
#### Shopify
**Built-in low stock notification:**
Shopify sends an email to the store admin when inventory hits zero, but doesn't support configurable thresholds natively.
1. Go to **Settings → Notifications → Scroll to Staff order notifications**
2. Ensure the admin email is set — Shopify will notify this address when stock reaches 0
**Setting per-variant thresholds with Stocky:**
1. Install **Stocky** from the Shopify App Store (free)
2. Open Stocky and go to **Products**
3. For each product, set the **Reorder point** (the stock level that triggers an alert)
4. Set the **Reorder quantity** (how many units to order when the alert fires)
5. Stocky will flag products below their reorder point in the dashboard and can generate draft purchase orders automatically
**Customer "back in stock" notifications:**
- Install **Back In Stock** (paid) or **Klaviyo** from the App Store
- These apps show a "Notify me when available" button on out-of-stock products
- Automatically email opted-in customers when stock is replenished
---
#### WooCommerce
**Configure global low-stock threshold:**
1. Go to **WooCommerce → Settings → Products → Inventory**
2. Enter a value in **Low stock threshold** (e.g., `10`)
3. Enter your notification email in **Notification recipient(s)** — comma-separate multiple emails
4. WooCommerce sends an email when any product drops to or below this threshold
**Set per-product thresholds:**
1. Go to **WooCommerce → Products → [Product] → Inventory tab**
2. Enable **Manage stock?**
3. Enter a **Low stock threshold** specific to this product (overrides the global setting)
**Advanced alerting with ATUM:**
1. Install **ATUM Inventory Management for WooCommerce** (free)
2. ATUM's dashboard shows all products at or below their reorder point in one view
3. Per-product reorder point configuration under **ATUM → Product Settings**
4. ATUM can also email your supplier directly when a product needs reordering (paid feature)
**Demand-based thresholds:**
- Install **Inventory Planner** (Shopify/WooCommerce) for sales velocity-based reorder suggestions
- Inventory Planner analyzes your sales history and suggests reorder points based on lead time × daily velocity + safety stock
---
#### BigCommerce
**Set per-product low stock threshold:**
1. Go to **Products → [Product] → Inventory tab**
2. Set the **Low stock level** field
3. BigCommerce sends an automatic email notification to the store admin when stock crosses this threshold
**Configure who receives alerts:**
1. Go to **Store Setup → Store Settings → Miscellaneous**
2. Set **Low stock email address** to your purchasing team's email
**For location-specific alerts:**
- Install the **Multi-Location Inventory** app
- Set thresholds per location — useful when you stock the same SKU at multiple warehouses
---
#### Custom / Headless
For custom platforms, implement a background job that checks inventory levels against configured reorder points:
```typescript
// jobs/checkStockLevels.ts — run every 15-30 minutes via cron
export async function checkStockLevels() {
const levels = await db.inventoryLevels.findMany({
include: { reorderConfig: true, variant: { include: { product: true } }, location: true },
where: { reorderConfig: { isNot: null } },
});
const newAlerts = [];
for (const level of levels) {
const config = level.reorderConfig!;
const available = level.onHand - level.reserved;
// Dynamic reorder point based on sales velocity and lead time
let reorderPoint = config.reorderPoint;
if (config.useDynamicReorderPoint) {
const velocity = await calculateDailySalesVelocity(level.variantId, 30); // 30-day rolling average
reorderPoint = Math.ceil(velocity * config.leadTimeDays * 1.2); // 20% safety stock buffer
}
const alertType = available === 0 ? 'out_of_stock' : available <= reorderPoint ? 'low_stock' : null;
if (!alertType) continue;
// Only create a new alert if the previous one is resolved
const existingAlert = await db.stockAlerts.findFirst({
where: { variantId: level.variantId, locationId: level.locationId, alertType, resolvedAt: null },
});
if (!existingAlert) {
newAlerts.push({ level, config, available, reorderPoint, alertType });
await db.stockAlerts.create({ data: {
variantId: level.variantId, locationId: level.locationId,
alertType, triggeredAt: new Date(), availableAtTrigger: available,
}});
}
}
if (newAlerts.length > 0) await sendAlertNotifications(newAlerts);
}
// Calculate daily sales velocity from order history
async function calculateDailySalesVelocity(variantId: string, windowDays: number) {
const since = new Date(Date.now() - windowDays * 86400000);
const result = await db.orderLineItems.aggregate({
where: { variantId, order: { createdAt: { gte: since }, status: { in: ['completed', 'shipped'] } } },
_sum: { quantity: true },
});
return (result._sum.quantity ?? 0) / windowDays;
}
// Send consolidated alerts — group by supplier to avoid email spam
async function sendAlertNotifications(alerts: Alert[]) {
const bySupplier: Record<string, Alert[]> = {};
for (const alert of alerts) {
const key = alert.config.supplierId ?? 'merchant';
if (!bySupplier[key]) bySupplier[key] = [];
bySupplier[key].push(alert);
}
for (const [supplierId, supplierAlerts] of Object.entries(bySupplier)) {
const to = supplierId === 'merchant' ? process.env.MERCHANT_ALERT_EMAIL : (await db.suppliers.findById(supplierId))?.email;
if (!to) continue;
await emailService.send({ to, template: 'low-stock-alert', data: { alerts: supplierAlerts } });
}
}
```
---
### Step 3: Calculate dynamic reorder points (optional)
Fixed thresholds (e.g., "alert at 10 units") are simple but can be wrong — a product that sells 50 units per day needs a much higher threshold than one that sells 2 per week.
**Formula:**
```
Reorder Point = (Daily Sales Velocity × Lead Time Days) × 1.2 (20% safety buffer)
```
Example: Product sells 5 units/day, supplier lead time is 7 days
- Demand during lead time: 5 × 7 = 35 units
- Reorder point with safety buffer: 35 × 1.2 = 42 Related in catalog-inventory
product-content-enrichment
IncludedUse AI to auto-generate product descriptions, extract attributes, and tag images to enrich your catalog at scale using platform tools and AI writing apps
catalog-import-export
IncludedImport and export your entire product catalog in bulk using your platform's native tools or dedicated apps, with validation and scheduled sync support
product-bundles-kits
IncludedSell grouped products as bundles or kits with automatic inventory deduction, bundle pricing, and display logic using platform apps
product-categorization
IncludedBuild a clean product hierarchy with collections, categories, tags, and breadcrumb navigation using your platform's native tools
product-data-modeling
IncludedStructure your product catalog using your platform's native data model for variants, attributes, metafields, and product relationships
variant-matrix
IncludedGenerate and manage all size/color/material combinations for a product using your platform's variant tools with bulk price and inventory management