How to Set Up Minimum Stock Alerts in SAP Business One Step by Step - featured image

Publications

How to Configure Minimum Stock Alerts in SAP Business One Step-by-Step

Hector Pincheira

Hector Pincheira

CIO | CTO
Digital Strategy & Technology Innovation

items

The stockout nobody saw coming (and that cost a fortune)

There are few things more frustrating in an operation than discovering you ran out of a key product when a customer needs it. The order is lost, trust erodes and the sales team points at the warehouse, which points at purchasing, which points at the system. The reality is that minimum stock alerts in SAP Business One can prevent this scenario, but most companies do not configure them correctly — or simply do not use them.

In this tutorial you will learn to configure step by step the minimum stock alerts in SAP Business One, from defining levels in the item master to activating automatic notifications. In addition, I include queries with versions for SQL Server and SAP HANA that will help you diagnose and optimize your inventory management.

Why are minimum stock alerts in SAP Business One critical?

Stockouts: Every time a product is not available when it is needed, you lose direct sales and credibility. As a result, the customer looks for alternatives and often does not come back.

Overstock: With no defined levels, you buy «just in case» and end up with capital tied up in the warehouse. Therefore, your cash flow deteriorates silently.

Reactive decisions: Without alerts, the purchasing team works putting out fires instead of planning. In addition, the lack of visibility breeds distrust between areas.

Hidden cost: A stockout does not only lose the specific sale, it also triggers urgent purchases at higher prices, express shipments and overtime in production.

Step 1: Define minimum levels in the Item Master Data

The first step to configure minimum stock alerts in SAP Business One is to define the levels on each item. Go to Inventory → Item Master Data and in the tab Inventory data you will find three key fields per warehouse:

Minimum stock (MinStock): The quantity below which an alert is generated. It is your inventory red line.

Maximum stock (MaxStock): The ceiling you should not exceed in order to avoid overstock and tied-up capital.

Reorder point (ReorderPoint): The quantity at which you should launch a new purchase order considering the supplier's lead time.

The practical formula to define these values is: Minimum stock = Average daily consumption × Days of safety coverage. To calculate this you need real consumption data, which you can obtain with the query in Step 4.

Step 2: Activate the minimum stock deviation alert

Once the levels are defined, you need to activate the automatic alerts. Go to Administration → Alerts Management → User Alerts and look for the predefined alert «Deviation from Minimum Stock». Activate it and configure:

Frequency: How often SAP B1 checks the levels. For critical products, check daily. For the rest, weekly may be enough.

Recipients: Assign the alert to the purchasing manager and the warehouse supervisor. However, avoid sending it to too many people because it will lose impact.

Priority: Flag alerts for class A products as high priority so they stand out in the alert inbox.

Step 3: When the alert fires

The alert triggers when an inventory outgoing transaction (delivery, transfer, negative goods receipt) drops the stock below the defined minimum level. It is important to understand that the alert is reactive: it fires after the movement, not before.

Therefore, the reorder point becomes especially relevant. If you configure the reorder point correctly, you will be able to generate purchase orders before reaching the minimum stock. In addition, MRP can complement this with a proactive approach based on projected demand.

Step 4: Configure mass alerts with SQL queries

When you have hundreds of items with no minimum stock defined, configuring them one by one is unfeasible. This query identifies items with active stock but no minimum level configured and suggests a value based on real consumption over the last 6 months.

SQL Server version

SELECT
    T0.ItemCode              AS 'Code',
    T0.ItemName              AS 'Description',
    T1.WhsCode               AS 'Warehouse',
    CAST(T1.OnHand AS DECIMAL(15,2)) AS 'Current Stock',
    T1.MinStock               AS 'Current Minimum',
    ISNULL(Consumo.PromedioMensual, 0) AS 'Monthly Consumption',
    CAST(ISNULL(Consumo.PromedioMensual, 0) * 1.5 AS DECIMAL(15,0)) AS 'Suggested Minimum'
FROM OITM T0
INNER JOIN OITW T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN (
    SELECT ItemCode, Warehouse,
        CAST(SUM(ABS(InQty - OutQty)) / 6.0 AS DECIMAL(15,2)) AS PromedioMensual
    FROM OINM
    WHERE DocDate >= DATEADD(MONTH, -6, GETDATE())
      AND TransType IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
    GROUP BY ItemCode, Warehouse
) Consumo ON Consumo.ItemCode = T0.ItemCode
    AND Consumo.Warehouse = T1.WhsCode
WHERE T1.OnHand > 0 AND T0.InvntItem = 'Y'
    AND (T1.MinStock = 0 OR T1.MinStock IS NULL)
ORDER BY ISNULL(Consumo.PromedioMensual, 0) DESC

SAP HANA version

SELECT
    T0."ItemCode"              AS "Code",
    T0."ItemName"              AS "Description",
    T1."WhsCode"               AS "Warehouse",
    CAST(T1."OnHand" AS DECIMAL(15,2)) AS "Current Stock",
    T1."MinStock"               AS "Current Minimum",
    IFNULL("Consumo"."PromedioMensual", 0) AS "Monthly Consumption",
    CAST(IFNULL("Consumo"."PromedioMensual", 0) * 1.5 AS DECIMAL(15,0)) AS "Suggested Minimum"
FROM "OITM" T0
INNER JOIN "OITW" T1 ON T1."ItemCode" = T0."ItemCode"
LEFT JOIN (
    SELECT "ItemCode", "Warehouse",
        CAST(SUM(ABS("InQty" - "OutQty")) / 6.0 AS DECIMAL(15,2)) AS "PromedioMensual"
    FROM "OINM"
    WHERE "DocDate" >= ADD_MONTHS(CURRENT_DATE, -6)
      AND "TransType" IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
    GROUP BY "ItemCode", "Warehouse"
) "Consumo" ON "Consumo"."ItemCode" = T0."ItemCode"
    AND "Consumo"."Warehouse" = T1."WhsCode"
WHERE T1."OnHand" > 0 AND T0."InvntItem" = 'Y'
    AND (T1."MinStock" = 0 OR T1."MinStock" IS NULL)
ORDER BY IFNULL("Consumo"."PromedioMensual", 0) DESC

This query calculates the average monthly consumption of the last 6 months and suggests a minimum stock of 1.5 times that value. Adjust the multiplier according to your industry and the criticality of each item. As a result, you will get minimum levels based on real data instead of assumptions.

Step 5: Integrate with the Planning Wizard (MRP)

Alerts are reactive. For a proactive approach, complement them with the MRP (MRP → Planning Wizard). MRP analyzes future demand against current stock and generates purchase recommendations automatically.

For it to work correctly with your alerts, the lead times of each supplier must be up to date in the item master. In addition, the minimum order quantities must be configured if your supplier has minimum quantities. Therefore, the reorder point must be aligned with the formula: Daily consumption × Lead time + Safety stock.

Bonus query: Inventory coverage dashboard

This query complements the alerts by showing how many days of coverage each item has according to its recent consumption. It is essential for prioritizing purchases.

SQL Server version

SELECT
    T0.ItemCode              AS 'Code',
    T0.ItemName              AS 'Description',
    T1.WhsCode               AS 'Warehouse',
    CAST(T1.OnHand AS DECIMAL(15,2)) AS 'Current Stock',
    T1.MinStock               AS 'Minimum Stock',
    ISNULL(Consumo.PromedioDiario, 0) AS 'Daily Consumption',
    CASE WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 999
        ELSE CAST(T1.OnHand / Consumo.PromedioDiario AS INT)
    END                       AS 'Coverage Days',
    CASE
        WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 'No Movement'
        WHEN T1.OnHand / Consumo.PromedioDiario <= 7 THEN 'CRITICAL'
        WHEN T1.OnHand / Consumo.PromedioDiario <= 15 THEN 'LOW'
        WHEN T1.OnHand / Consumo.PromedioDiario <= 30 THEN 'NORMAL'
        ELSE 'AMPLE'
    END                       AS 'Status'
FROM OITM T0
INNER JOIN OITW T1 ON T1.ItemCode = T0.ItemCode
LEFT JOIN (
    SELECT ItemCode, Warehouse,
        CAST(SUM(ABS(InQty - OutQty)) / 180.0 AS DECIMAL(15,4)) AS PromedioDiario
    FROM OINM
    WHERE DocDate >= DATEADD(MONTH, -6, GETDATE())
      AND TransType IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
    GROUP BY ItemCode, Warehouse
) Consumo ON Consumo.ItemCode = T0.ItemCode
    AND Consumo.Warehouse = T1.WhsCode
WHERE T1.OnHand > 0 AND T0.InvntItem = 'Y'
ORDER BY CASE WHEN ISNULL(Consumo.PromedioDiario, 0) = 0 THEN 999
    ELSE CAST(T1.OnHand / Consumo.PromedioDiario AS INT) END ASC

SAP HANA version

SELECT
    T0."ItemCode"              AS "Code",
    T0."ItemName"              AS "Description",
    T1."WhsCode"               AS "Warehouse",
    CAST(T1."OnHand" AS DECIMAL(15,2)) AS "Current Stock",
    T1."MinStock"               AS "Minimum Stock",
    IFNULL("Consumo"."PromedioDiario", 0) AS "Daily Consumption",
    CASE WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 999
        ELSE CAST(T1."OnHand" / "Consumo"."PromedioDiario" AS INT)
    END                       AS "Coverage Days",
    CASE
        WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 'No Movement'
        WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 7 THEN 'CRITICAL'
        WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 15 THEN 'LOW'
        WHEN T1."OnHand" / "Consumo"."PromedioDiario" <= 30 THEN 'NORMAL'
        ELSE 'AMPLE'
    END                       AS "Status"
FROM "OITM" T0
INNER JOIN "OITW" T1 ON T1."ItemCode" = T0."ItemCode"
LEFT JOIN (
    SELECT "ItemCode", "Warehouse",
        CAST(SUM(ABS("InQty" - "OutQty")) / 180.0 AS DECIMAL(15,4)) AS "PromedioDiario"
    FROM "OINM"
    WHERE "DocDate" >= ADD_MONTHS(CURRENT_DATE, -6)
      AND "TransType" IN (13, 14, 15, 16, 18, 19, 20, 21, 59, 60, 67)
    GROUP BY "ItemCode", "Warehouse"
) "Consumo" ON "Consumo"."ItemCode" = T0."ItemCode"
    AND "Consumo"."Warehouse" = T1."WhsCode"
WHERE T1."OnHand" > 0 AND T0."InvntItem" = 'Y'
ORDER BY CASE WHEN IFNULL("Consumo"."PromedioDiario", 0) = 0 THEN 999
    ELSE CAST(T1."OnHand" / "Consumo"."PromedioDiario" AS INT) END ASC

Items in CRITICAL status (less than 7 days of coverage) need immediate action. In addition, note that in SAP HANA you use ADD_MONTHS instead of DATEADD e IFNULL instead of ISNULL.

Best practices for minimum stock alerts in SAP Business One

Review the levels quarterly: Consumption changes with seasonality. A fixed minimum stock all year long will leave you exposed in high season and with excess in low season.

Classify your items with ABC: Not all products deserve the same level of attention. Class A items (high value or high movement) need more conservative levels and more frequent reviews.

Document the exceptions: If an item behaves atypically (annual purchase, seasonal product), document it in the remarks field so the team understands why the minimum is set the way it is.

Monitor effectiveness: Keep a record of stockouts before and after implementing the alerts. However, activating them is not enough: you need to measure their real impact.

Conclusion: alerts are your inventory nervous system

Configuring minimum stock alerts in SAP Business One is not a one-week project: it is an operating habit that needs maintenance. The queries presented, available for both SQL Server and SAP HANA, give you the tools to diagnose your current situation, define levels based on real data and monitor coverage continuously.

As a result, your purchasing team will stop working reactively and start anticipating needs. The difference between a company that controls its inventory and one that suffers it lies in these configuration details.

Most Read

Pasajero mira un tablero de salidas en un aeropuerto, metafora de la dependencia de proveedores de IA
El Calendario Ajeno: la Dependencia de Proveedores de IA que Nadie Negocia
SAP Business One Procedimientos Almacenados: Reportes Reutilizables - imagen destacada del tutorial
SAP Business One Stored Procedures: Reusable Reports
SAP Business One Pending Orders - featured image of the tutorial
SAP Business One Pending Orders: SQL Query to Control Your Backlog
QlikSense yield analysis: breakdown of the loss
QlikSense Yield Analysis: the Waste Nobody Is Watching
QlikSense mobile dashboard: the three screens
QlikSense Mobile Dashboard: the Three Screens People Actually Open
SAP Business One Bank Deposits - featured image of the tutorial
SAP Business One Bank Deposits: Manage Checks and Collections Step by Step

RELATED ARTICLES