Inventory management

Elevate, May 20-22-2025, Miami Beach, Florida

Learn about the InventoryEntry entity.

  • After completing this page, you should be able to:

    • Understand how inventory is associated to an SKU and the different representations of the InventoryEntry entity.
  • Inventory management is the backbone of successful commerce operations. It empowers businesses to meticulously track and control product availability, ensuring a seamless customer experience. While not all products demand rigorous inventory tracking (for example: digital downloads, services, and insurance), it's essential for most physical goods and products susceptible to stock-outs. Inventory management in Composable Commerce touches various aspects of the Project, including Products, Quotes, Carts, Orders, Order returns, and Order Edits. This module focuses on each of these areas, providing a comprehensive understanding of inventory management within the Composable Commerce ecosystem.

    Before we start, let's familiarize ourselves with the core component of inventory management in Composable Commerce: the InventoryEntry entity.

    Understand InventoryEntry

    The InventoryEntry entity acts as the single source of truth for the physical stock level of a specific Product Variant at a given location or channel. It's crucial to understand its structure and attributes.

    InventoryEntry attributes:

    • id: a unique identifier automatically generated by Composable Commerce for each InventoryEntry.
    • version: an integer representing the current version of the InventoryEntry. This value is used for optimistic concurrency control.
    • key: a user-defined, unique identifier for the InventoryEntry. Setting a key can be beneficial for simplifying queries and updates. For example, you could use a combination of the SKU and warehouse location as the key.
    • sku: the ProductVariant SKU associated with this InventoryEntry. This attribute links the inventory record to a specific Product Variant. Importantly, the SKU does not have to exist as a Product within Composable Commerce. This allows you to manage inventory for products even before they are fully defined in your product catalog.
    • supplyChannel: a ChannelReference that indicates the specific channel that supplies this inventory. This is important for multi-channel inventory management, allowing you to track inventory levels separately for different sales channels like online stores, marketplaces, or physical stores.
    • quantityOnStock: the total amount of stock currently available, calculated as availableQuantity + reserved. This represents the overall physical stock level.
    • availableQuantity: the portion of the quantityOnStock that is currently available for sale. This value is dynamically updated based on orders, reservations, and other inventory movements. It's crucial to use this field for determining what can be sold to avoid overselling.
    • restockableInDays: an informational field that represents the typical restocking frequency in days. This field's interpretation depends on your business logic and how you utilize it within your application. For instance, you might use it to display estimated restocking times to customers or to trigger automated replenishment processes.
    • expectedDelivery: an informational field that indicates the estimated date and time of the next restock. Similar to restockableInDays, its meaning is context-dependent and can be leveraged for various purposes within your inventory management workflows.
    • custom: allows you to add one or more Custom Fields to the InventoryEntry. This provides flexibility in extending the data model to store additional information relevant to your specific inventory management needs. For example, you could use Custom Fields to track batch numbers, expiry dates, or specific storage locations within a warehouse.
    • createdAt: a timestamp indicating when the InventoryEntry was initially created in the system.
    • createdBy: information about the user or system that created the InventoryEntry.
    • lastModifiedAt: a timestamp indicating the last time the InventoryEntry was modified.
    • lastModifiedBy: information about the user or system that last modified the InventoryEntry.

    Understand quantityOnStock

    The quantityOnStock attribute within an InventoryEntry is central to managing product availability effectively. However, its use can be tailored to your specific business rules and inventory management strategies.

    Here are some potential use cases for quantityOnStock:

    • Aggregated inventory: in scenarios with multiple warehouses or fulfillment centers, quantityOnStock can represent the total available stock across all locations. This aggregated view simplifies availability checks but requires careful management to avoid overselling from individual locations.
    • Virtual inventory: quantityOnStock can be used to represent a calculated value that goes beyond physical stock levels. This might include anticipated incoming shipments, pre-ordered items, or stock allocated for specific channels or promotions. Using virtual inventory allows for greater flexibility but demands accurate forecasting and management to prevent discrepancies between virtual and actual stock levels.
    • Buffered inventory: safety buffers, either positive or negative, can be applied to the quantityOnStock to mitigate risks associated with inventory fluctuations. Negative buffers account for potential delays in inventory updates or in-transit inventory, preventing overselling. Conversely, positive buffers might represent expected incoming stock, allowing for pre-orders or backorders.

    The key takeaway is that the effective meaning of quantityOnStock is determined by your business logic and how you leverage the inventory features provided by Composable Commerce. You should define what this value represents within your system and ensure consistent application of your chosen logic across all integrations and processes. This clarity is essential for accurate inventory reporting, effective order management, and preventing stock-outs or overselling scenarios.

    Product Variant availability: Strong vs. Eventual Consistency

    Product Variants have a system generated field named availability (of type:ProductVariantAvailability), containing all InventoryEntry records for a SKU. The values are added to the Product by the system using an eventually consistent approach. This means there's a distinction between the strongly consistent inventory data stored in InventoryEntry records and the aggregated representation of availability on the ProductVariant itself.

    InventoryEntry

    As the source of truth for inventory, updates to InventoryEntry are strongly consistent. This means that any changes made to an InventoryEntry are immediately reflected in the data. Use InventoryEntry for:

    • Order fulfillment: ensuring accurate stock deductions when an order is placed.
    • Real-time inventory views: Displaying current stock levels.

    ProductVariantAvailability

    The ProductVariantAvailability object on the ProductVariant is eventually consistent and provides a convenient summary of available quantities across all matching InventoryEntries for a given SKU. It simplifies availability checks without querying multiple InventoryEntry resources. However, updates to ProductVariantAvailability are asynchronous, meaning there can be a slight delay between an inventory change and its reflection in this field. Use ProductVariantAvailability for:

    • Product page displays: showing general availability information to customers browsing your online store. This can be useful for determining which Product Variants can be added to the Cart.
    • Non-critical availability checks: suitable for scenarios where a minor delay in availability information is acceptable.

    Choose the correct resource

    OperationRecommended resourceReason
    Order fulfillmentInventoryEntryGuarantees accurate stock information for critical operations.
    Real-time inventory updatesInventoryEntryProvides immediate visibility into stock changes.
    Displaying general availabilityProductVariantAvailabilitySimplifies data retrieval and is suitable for non-critical displays.
    Adding items to a CartInventoryEntryEnsures accurate availability check before checkout.

    Important considerations

    Impact of multiple InventoryEntries on Product size: keep in mind that having numerous InventoryEntries associated with a single SKU will increase the size of the Product JSON object. This is because the ProductVariantAvailability field, which aggregates data from all related InventoryEntries, is part of the Product data structure. If you have a large number of InventoryEntries per SKU, consider the potential impact on performance and API response times, especially for product-heavy operations. Refer to the documentation on product limits and advanced product modeling for strategies to manage this complexity.

    Availability in Product Search and Product Projections Search: the ProductVariantAvailability information is also reflected in Product Search and Product Projections Search to enable filtering and querying products based on availability. However, similar to the ProductVariant itself, the synchronization of availability data to Product Search and Product Projections Search is asynchronous. This introduces an additional layer of eventual consistency, meaning the availability information in Product Search and Product Projections Search might lag slightly behind the actual ProductVariantAvailability.

    Key considerations for Product Search and Product Projections Search:

    • Increased eventual consistency: be mindful that availability data in Product Search and Product Projections Search experiences a longer synchronization delay compared to the ProductVariant itself.
    • Filtering and querying: Product Search and Product Projections Search offer powerful filtering capabilities based on ProductVariantAvailability and channel-specific availability. This makes them valuable for complex product searches. However, keep in mind the eventual consistency when using these features and consider the potential for slight discrepancies between search results and real-time inventory levels.

    By understanding the different levels of consistency and the trade-offs between strong and eventual consistency, you can choose the appropriate strategy for using inventory data.

    The following diagram illustrates the synchronization flow:

    Loading...