Claude
Skills
Sign in
Back

low-stock-alerts

Included with Lifetime
$97 forever

Set up automated alerts when products fall below custom thresholds so you can reorder before running out of stock

catalog-inventorylow-stockalertsreordernotificationsdemand-forecastingreplenishmentprocurement

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