About Safety Stock and Available to Promise Inventory
Overview
ROM provides inventory visibility at either the enterprise level or at the seller level, depending on your setup and current touchpoint. This drives product visibility on webstores and confirms inventory through the lifecycle of the shopping experience. This topic explains how the ROM inventory touchpoints and safety stock rules interact to provide this visibility.
Inventory Touchpoints
Inventory visibility is available via the touchpoints shown in the following table.
Touchpoint | Purpose | Sender | Frequency | Level |
---|---|---|---|---|
ATP Feed | Used to "light up" products on a website (Category Listing, Search Results, and so on) when inventory is available to sell. | ROM sends to client. | Full daily extract, with delta updates every 30 minutes. | Seller level
|
Quantity Request API | Provides aggregated ATP inventory for a specific product within an Inventory Org or a Seller. Often requested when the shopper is viewing a Product Detail page and then adds the product to the cart.** | Webstore service call to ROM | On demand. | Inventory Org level or Seller level.* |
in-store Inventory Quantity API | Checks in-store inventory for an item in one or more stores. Often requested with In-Store Pickup fulfillment type orders. | Webstore service call to ROM | On demand. | Specific to a node specified by the webstore |
Inventory Detail API | Provides validation of inventory and estimated delivery date per line item. Identifies the sourcing locations for each item, which is necessary for origin-based taxes. Generally done when a shipping method is added to an order. | Webstore service call to ROM | On demand. | Specific to a node specified by the webstore |
Reservation API (Create Allocation API) | Soft allocates inventory immediately after the order is submitted. It holds the inventory from the time the shopper begins the submit order process and the time the order is created. It prevents overselling by stopping another shopping session from reserving the inventory while the current submit order is processing. | Webstore service call to ROM | On demand |
* The default is Inventory Org level. A separate configuration is required for ATP by Seller; for details, see Manage Node Groups. You should only use ATP by Seller if you sell in multiple countries, share the same product catalog across multiple countries, and have sourcing restrictions on where order lines can be sourced from based on the seller webstore that originated the order.
** When using the Quantity Request API:
- By Seller: Assign all nodes that are enabled for availability to a Node Group with a Seller ID.
- By Inventory Org: Leave the Seller ID field blank on all Node Groups.
ATP + Safety Stock
Safety stock acts as a buffer to ensure that not all inventory is promised online. This is a bigger challenge in an omnichannel environment than it is in a non-omnichannel environment. The ATP inventory calculation takes numerous variables into consideration, including safety stock. This section explains the safety stock calculation methods, safety stock rules, and how the rules interact with the ATP touchpoints.
Safety Stock Calculation Levels
Safety stock is normally calculated at the Inventory Org level; however, it can be calculated at the Seller level. The calculation level is set before launch; you cannot change it. Inventory Org level calculations affect all Sellers across the organization. Seller level safety stock is useful if your organization has Sellers located in different countries, where Sellers might need different safety stock levels due to fluctuations in demand or supply in each particular country.
Safety Stock Calculation Methods
ROM has two calculation methods:
- Deduct First: Ties safety stock to a node level. The safety stock is first deducted from each node, and then the remaining inventory is aggregated.
- Aggregate First: Does not tie safety stock to a node level. The inventory is aggregated across applicable nodes and then the safety stock is deducted.
For both calculations methods, when the supply quantity drops to negative after safety stock application, inventory is set to 0 for that level.
Deduct First Safety Stock Rules
ROM currently supports six Deduct First global safety stock rules. As you set up safety stock rules in the ROM user interface, keep in mind that:
- When you use these rules, you cannot configure safety stock at the Seller level.
- More than one Deduct First safety stock rule can be configured.
- When Deduct First safety stock rules are configured, the ATP Feed does not deduct any safety stock. The ATP Feed only considers the Aggregate First safety stock rule.
- Only one safety stock rule can deduct the supply quantity.
- When Deduct First safety stock rules are configured, the rule hierarchy is applied in the following priority order for both the Quantity Request and Inventory Detail calls:
- If a Node Item is set up, then use the Node Item safety stock rule.
- If no Node Item set up, and a Node Type Item is set up, then use the Node Type Item safety stock rule.
- If no Node Item or Node Type Item are set up, then use the Node Item Attribute safety stock rule.
- If no Node Item, Node Type Item, or Node Item Attribute are set up, then use the Node Type Item Attribute safety stock rule.
- If no Node Item, Node Type Item, Node Item Attribute, or Node Type Item Attribute is set up, then use the Global Node Type safety stock rule.
- If no Node Item, Node Type Item, Node Item Attribute, Node Type Item Attribute, or Global Node Type is set up, then use the Global Supply safety stock rule.
The following examples assume that ATP is being returned at the Inventory Org level.
Node Item Safety Stock
Definition | When To Use: |
---|---|
The most granular level of safety stock. Allot safety stock (quantity or percentage) for a SKU item, for a specific node, by fulfillment type (ISPU, STS, STH) for a supply type (Onhand, In Transit, Held, and so on).
| To protect inventory specific to an item within a node for in-store purchases. Example: Item X is popular in the southwest region of the US. Within the southwest stores, you can set safety stock to hold back extra for expected higher in-store purchases.
|
Example
SKU123 | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 100 | 20 | 20 | 0 |
Node Item Safety Stock | -- (none set) | 3 | 2 | 1 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed | The ATP Feed only looks at Aggregate First safety stock. | 100+20+20+0=140 |
Quantity Request API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 100-0=100 Node B: 20-3=17 Node C: 20-2=18 Node D: 0-1=-1 (net to 0) 100+17+18+0=135 (Aggregate number is returned.) |
Inventory Detail API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 100-0=100 Node B: 20-3=17 Node C: 20-2=18 Node D: 0-1=-1 (net to 0) |
Node Type Item Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock (quantity or percentage) for a SKU item, by node type (DC, Retail Store), by fulfillment type (ISPU, STS, STH) for a supply type (Onhand, In Transit, Held, and so on). | To protect inventory specific to an item within a node type for in-store purchases. Example: Item X is one of the most requested items for the holiday season. Within all retail stores, you can set safety stock to hold back extra for expected higher in-store purchases. And, you can set a smaller amount of safety stock for Distribution Center node types. |
Example
SKU123 | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 100 | 20 | 20 | 0 |
Node Type Item safety stock: Distribution Centers = none set Retail Stores = 2 | -- (none set) | 2 | 2 | 2 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed | The ATP Feed only looks at Aggregate First safety stock. | 100+20+20+0=140 |
Quantity Request API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 100-0=100 Node B: 20-2=18 Node C: 20-2=18 Node D: 0-2=-2 (net to 0) 100+18+18+0 = 136 (Aggregate number is returned.) |
Inventory Detail API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 100-0=100 Node B: 20-2=18 Node C: 20-2=18 Node D: 0-2=-2 (net to 0) |
Node Item Attribute Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock (quantity or percentage) by a defined item attribute, for a specific node, by fulfillment type (ISPU, STS, STH) for a supply type (Onhand, In Transit, Held, and so on).
| To protect inventory specific to an item attribute for specific nodes for in-store purchases. Example: A new collection is expected to sell quickly. Demand is anticipated to be high in regional areas. All items within the collection are identified by an attribute. |
Example
Attribute = Sarah Jessica Parker Collection | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 100 | 20 | 20 | 0 |
Node Item Attribute safety stock = Sarah Jessica Parker Collection | 5 | 2 | -- (none set) | 3 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed | The ATP Feed only looks at Aggregate First safety stock. | 100+20+20+0=140 |
Quantity Request API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 100-5=95 Node B: 20-2=18 Node C: 20-0=20 Node D: 0-3 = -3 (net to 0) 95+18+20+0=133 (Aggregate number is returned.) |
Inventory Detail API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 100-5=95 Node B: 20-2=18 Node C: 20-0=20 Node D: 0-3 = -3 (net to 0) |
Node Type Item Attribute Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock (quantity or percentage) by a defined item attribute, by node type (DC, Retail Store), by fulfillment type (ISPU, STS, STH) for a supply type (Onhand, In Transit, Held etc.) | To protect inventory specific to an item attribute by node types for in-store purchases. Example: A new collection is expected to sell quickly. You want to hold back the same quantity of safety stock for each store. All items within the collection are identified by an attribute. |
Example
Attribute = Sarah Jessica Parker Collection | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 50 | 12 | 12 | 12 |
Node Type Item Attribute Safety Stock = Sarah Jessica Parker Collection Distribution Centers = 1 Retail Stores = 2 | 1 | 2 | 2 | 2 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed | The ATP Feed only looks at Aggregate First safety stock. | 50+12+12+12 = 86 |
Quantity Request API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 50-1=49 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 49+10+10+10=79 (Aggregate number is returned.) |
Inventory Detail API | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 50-1=49 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 |
Global Node Type Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock (quantity or percentage) to all items, by node type (DC, Retail Store), by fulfillment type (ISPU, STS, STH) for a supply type (Onhand, In Transit, Held, and so on).
| To protect the same amount of inventory across all catalog items based on the node type. Examples:
|
Example
SKU 144 | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 50 | 12 | 12 | 12 |
SKU 288
| Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
Onhand inventory
| 8 | 4 | 6 | 5 |
Safety Stock |
|
|
|
|
Global Node Type safety stock: Distribution Centers = 1 Retail Stores = 2 | 1 | 2 | 2 | 2 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed: SKU144 | The ATP Feed only looks at Aggregate First safety stock. | 50+12+12+12=86 |
ATP Feed: SKU288 | 8+4+6+5=23 | |
Quantity Request API: SKU 144 | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 50-1=49 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 49+10+10+10=79 (Aggregate number is returned.) |
Quantity Request API: SKU 288 | Node A: 8-1=7 Node B: 4-2=2 Node C: 6-2=4 Node D: 5-2=3 7+2+4+3=16 (Aggregate number is returned.) | |
Inventory Detail API: SKU144 | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 50-1=49 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 |
Inventory Detail API: SKU288 | Node A: 8-1=7 Node B: 4-2=2 Node C: 6-2=4 Node D: 5-2=3 |
Global Supply Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock (quantity or percentage) for all items, across all nodes for a supply type (Onhand, In Transit, Held, and so on).
| To protect the same amount of inventory across all catalog items. Example: Hold two of all items. |
Example
SKU 144 | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
Onhand inventory | 50 | 12 | 12 | 12 |
SKU 288
| Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
Onhand inventory
| 8 | 4 | 6 | 5 |
Safety Stock |
|
|
|
|
Global Node Type safety stock = 2
| 2 | 2 | 2 | 2 |
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed: SKU144 | The ATP Feed only looks at Aggregate First safety stock. | 50+12+12+12=86 |
ATP Feed: SKU288 | 8+4+6+5=23 | |
Quantity Request API: SKU 144 | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order. | Node A: 50-2=48 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 48+10+10+10 = 78 (Aggregate number is returned.) |
Quantity Request API: SKU 288 | Node A: 8-2=6 Node B: 4-2=2 Node C: 6-2=4 Node D: 5-2=3 6+2+4+3 = 15 (Aggregate number is returned.) | |
Inventory Detail API: SKU144 | When Deduct First safety stock is configured, the rule hierarchy is followed in priority order.
| Node A: 50-2=48 Node B: 12-2=10 Node C: 12-2=10 Node D: 12-2=10 |
Inventory Detail API: SKU288 | Node A: 8-2=6 Node B: 4-2=2 Node C: 6-2=4 Node D: 5-2=3 |
Aggregate First Safety Stock Rules
ROM currently supports one Aggregate First global safety stock rule type: the Aggregate First rule.
- When the Aggregate First safety stock rule is configured, do not configure any other rules because the calculation method is different. The user interface allows you to configure other safety stock rules, but Radial does not recommend this practice.
- When the Aggregate First safety stock rule is configured, the ATP Feed deducts the configured safety stock.
- If the Safety Stock rule is set to Seller, then this rule aggregates the safety stock across all nodes/node types at the specified Seller. You can only set Seller level safety stock when you use this rules.
The following example assumes that ATP is being returned at the Inventory Org level.
Aggregate First Safety Stock
Definition | When To Use: |
---|---|
Allot safety stock as a quantity or percentage. Apply globally to all SKUs across all fulfillment node types/ nodes. | Inventory Org level safety stock: To have the safety stock applied across your entire enterprise inventory rather than tie it to a specific node/ node type. Seller level safety stock: To have the safety stock applied across a specific Seller's inventory rather than tie it to a specific node/ node type. When the safety stock value can be the same regardless of SKU. |
Example
| Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
---|---|---|---|---|
SKU123 | Node A (DC) | Node B (Retail Store) | Node C (Retail Store) | Node D (Retail Store) |
Onhand Inventory | 2 | 2 | 2 | 0 |
Aggregate First safety stock = Qty 1 |
|
|
|
|
Inventory Touchpoint | Description | Calculation |
---|---|---|
ATP Feed | The ATP Feed only looks at Aggregate First safety stock. | (2+2+2+0) - 1=5 |
Quantity Request API | When Aggregate First safety stock is configured, no other safety stock rules are considered. | (2+2+2+0) - 1=5 |
Inventory Detail API | When Aggregate First safety stock is configured, no safety stock is deducted. If non-aggregated safety stock rules are configured in addition to the aggregated global, the rule hierarchy is followed. | Node A = 2 Node B = 2 Node C = 2 Node D = 0 |
Seller Level Safety Stock
When an Administrator sets up safety stock rules and values with Seller Level Safety Stock, the values apply to the Seller that the Administrator is working with. Moreover, the Seller level values can only be set when the Aggregated Global Safety Stock Rule is used. The following examples show how Seller Level Safety Stock is allocated and sourced, and how the ATP inventory is calculated.
Note: Seller Level Safety Stock is set at the Inventory Org level by Radial Administrators.
Assume that SuperMart is the Inventory Org. SuperMart has three Sellers:
- SuperMart France (SM-FRA)
- SuperMart Germany (SM-GER)
- SuperMart Belgium (SM-BEL)
Safety Stock Settings by Seller
Seller | Inventory Org | Safety Stock Type | Safety Stock Value |
---|---|---|---|
SM-FRA | SuperMart | Quantity | 0 |
SM-GER | SuperMart | Quantity | 5 |
SM-BEL | SuperMart | Quantity | 3 |
Eligible Nodes for Sellers
Node - Item 711123 | Onhand | SM-FRA Eligible? | SM-GER Eligible? | SM-BEL Eligible? |
---|---|---|---|---|
123 - France DC | 60 | Y | ||
345 - France Store | 20 | Y | ||
456 - France Store | 20 | Y | ||
987 - Germany DC | 70 | Y | Y | |
765 - Germany Store | 10 | Y | ||
543 - Belgium Store | 5 | Y | ||
321 - Belgium Store | 6 | Y |
ATP Calculation
Inventory Touchpoint | Calculation | Notes |
---|---|---|
ATP Feed | SM-FRA: (60+20+20) - 0 = 100 SM-GER: (70+10) - 5 = 75 SM-BEL: (70+5+6) - 3 = 78 |
|
Quantity Request API | SM-FRA: (60+20+20) - 0 = 100 SM-GER: (70+10) - 5 = 75 SM-BEL: (70+5+6) - 3 = 78 |
|
Inventory Detail API | Node 123: 60 Node 345: 20 Node 456: 20 Node 987: 70 Node 765: 10 Node 543: 5 Node 321: 6 |
|
ATP by Seller
The following example illustrates how the ATP by Seller feature works with the Quantity Request API.
Setup
Assume that the following node groups have been set up to handle ATP by Seller.
Italy: Seller Id TMSEB2
- Node 100801- Italy DC
- Node 100802 - Rome, Italy Store
- Node 100803- Milan, Italy Store
Czech Republic: Seller Id TMSEB3
- Node 100804- Czech Republic DC
- Node 100805 - Prague, Czech Republic Store
Slovakia: Seller Id TMSEB4
- Node 100804 - Czech Republic DC
- Node 100806 - Bratislava, Slovakia Store
- Node 100807 - Trnava, Sloakia Store
Example of Seller ATP Being Returned
The following table shows the setup and sourcing restrictions.
Inventory Org | Seller | Store Fulfillment | DC Fulfillment | Sourcing Restrictions |
---|---|---|---|---|
TMSNA | TMSEB2 IT | Italy stores | Italy DC | Can only be sourced from Italy DC and Italy stores |
TMSNA | TMSEB3 CZ | Czech Republic stores | Czech Republic DC | Can only be sourced from Czech Republic DC and Czech Republic stores |
TMSNA | TMSEB4 SK | Slovakia stores | Czech Republic DC | Can only be sourced from Czech Republic DC and Slovakia stores |
Here's the onhand inventory and eligibility.
Node Item 7115566 | Onhand Inventory | Eligible - TMSEB2 IT | Eligible - TMSEB3 CZ | Eligible - TMSEB4 SK |
---|---|---|---|---|
100801 - Italy DC | 1 | Y | N | N |
100802 - Italy Store | 1 | Y | N | N |
100803 - Italy Store | 0 | Y | N | N |
100804 - Czech Republic DC | 1 | N | Y | Y |
100805 - Czech Republic Store | 1 | N | Y | N |
100806 - Slovakia Store | 0 | N | N | Y |
100807 - Slovakia Store | 0 | N | N | Y |
The Quantity Request API returns the following ATP at the Seller level.
Quantity Request for Seller Level ATP | ||
---|---|---|
SKU | Seller | ATP |
7115566 | TMSEB2 IT | 2 |
7115566 | TMSEB3 CZ | 2 |
7115566 | TMSEB4 SK | 1 |
If ATP by Seller was not configured, then the Quantity Request API returns the ATP at the Inventory Org level.
Quantity Request for Inventory Org ATP | ||
---|---|---|
SKU | Inventory Org | ATP |
7115566 | TMSNA | 4 |