一键导入
low-stock-alerts
Set up automated alerts when products fall below custom thresholds so you can reorder before running out of stock
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Set up automated alerts when products fall below custom thresholds so you can reorder before running out of stock
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Manage supplier invoices and vendor payments with automated receipt matching, payment scheduling, early discount optimization, and reconciliation workflows
Enable wholesale and B2B sales with company accounts, custom catalogs, quote workflows, purchase orders, and net payment terms
Predict future inventory needs using historical sales data, seasonal trends, and reorder points to prevent stockouts and overstock
Launch a multi-vendor marketplace with seller onboarding, commission rules, automated payouts via Stripe Connect, and vendor dashboards
Control which products appear first in collections using automated ranking rules, manual overrides, and performance-based sorting algorithms
Sync your catalog and inventory across your own site, Amazon, eBay, and wholesale channels to sell everywhere from one system
| name | low-stock-alerts |
| description | Set up automated alerts when products fall below custom thresholds so you can reorder before running out of stock |
| category | catalog-inventory |
| risk | safe |
| source | curated |
| date_added | 2026-03-12 |
| tags | ["low-stock","alerts","reorder","notifications","demand-forecasting","replenishment","procurement"] |
| triggers | ["low stock alert","reorder point","out of stock notification","inventory replenishment","stock level alert","demand forecasting"] |
| tools | ["claude-code","cursor","gemini-cli","copilot","codex-cli","kiro","opencode"] |
| platforms | ["shopify","woocommerce","bigcommerce","custom"] |
| difficulty | intermediate |
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.
| 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 |
Built-in low stock notification:
Shopify sends an email to the store admin when inventory hits zero, but doesn't support configurable thresholds natively.
Setting per-variant thresholds with Stocky:
Customer "back in stock" notifications:
Configure global low-stock threshold:
10)Set per-product thresholds:
Advanced alerting with ATUM:
Demand-based thresholds:
Set per-product low stock threshold:
Configure who receives alerts:
For location-specific alerts:
For custom platforms, implement a background job that checks inventory levels against configured reorder points:
// 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 } });
}
}
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
For Shopify: Use Inventory Planner app — it computes velocity-based reorder points automatically from your sales history.
For WooCommerce: ATUM Inventory Management can be configured with supplier lead times and suggests reorder points based on sales velocity.
Once an alert fires, you want to notify your purchasing team or supplier automatically.
Shopify + Stocky: Stocky generates draft purchase orders when stock falls below the reorder point. Your team reviews and sends the PO to the supplier from within Stocky.
WooCommerce + ATUM (paid): ATUM can email the configured supplier directly when a product needs reordering, including the suggested quantity.
Email workflow (any platform): Set the low-stock notification email directly to your supplier's ordering inbox — include the SKU, product name, and suggested reorder quantity in the notification template.
| Problem | Solution |
|---|---|
| Alert fires repeatedly for the same SKU | Ensure the platform only sends one alert per incident until stock is replenished; Shopify and WooCommerce do this correctly by default; custom builds need a resolvedAt guard |
| Dynamic reorder point too high during off-season | Use a rolling 30-day window for velocity calculations; consider separate seasonal configurations for products with strong seasonality |
| Supplier emails go to spam | Use an authenticated sending domain (SPF, DKIM, DMARC) for your alert emails; transactional email providers (SendGrid, Postmark) improve deliverability |
| Alert threshold too low — too many false alarms | Start with a threshold at 2× your typical order quantity from the supplier, then tune based on how often you're actually running out before the reorder arrives |