Channel Inventory

This page is outdated. Please go to our new documentation under https://docs.fulfillmenttools.com/documentation.

Channel inventory is currently not fully operational as it is not considered in reservations and routing.

Summary

Channel inventory allows reserving inventory for specific sales channels or other purposes. Depending on the individual use case, different rules and time periods for stock assignment can be defined per channel. Reservations for specific channels are always performed on facility level.

Follow the below steps when introducing channel inventory for use cases:

Working with channel inventory

1. Manage availability channels

Availability channels in our platform are designed to represent sales channels or other topics inventory should be grouped by.

  • name: Each channel is characterized by a unique name for easy identification.

  • strategy: Depending on the priority of the distribution path, different strategies can be defined for stock reduction. In the UI this is referred to as "allocation type":

    • RESTRICT (Only stock that has been explicitly allocated to this channel is available for sales via this channel. As soon as the allocated stock is used up, no stock is available any more).

    • REGULAR (If an order is accepted via this channel, the allocated stock is first used up. Afterwards, stock that is has not been allocated to any channel is used.)

    • IRON_RESERVE (If an order is accepted via this channel, stock that is not assigned to any channel is used. Only after all other stock is used, the stock explicitly allocated to the channel is taken.)

Create a channel

Create a new Availability Channel

POST/api/availabilitychannels
Body
name*string
strategy*enum
REGULARIRON_RESERVERESTRICT
Response

The created Availability Channel

Body
created*string (date-time)
id*string
lastModified*string (date-time)
name*string
strategy*enum
REGULARIRON_RESERVERESTRICT
version*number
Request
const response = await fetch('/api/availabilitychannels', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "name": "text",
      "strategy": "REGULAR"
    }),
});
const data = await response.json();
Response
{
  "created": "2024-12-21T12:28:13.161Z",
  "id": "text",
  "lastModified": "2024-12-21T12:28:13.161Z",
  "name": "text",
  "strategy": "REGULAR",
  "version": 0
}

Update a channel

Channel name and strategy can be changed after creation.

Replace an existing Availability Channel

PUT/api/availabilitychannels/{availabilityChannelId}
Path parameters
availabilityChannelId*string
Body
name*string
strategy*enum
REGULARIRON_RESERVERESTRICT
version*number
Response

The replaced Availability Channel

Body
created*string (date-time)
id*string
lastModified*string (date-time)
name*string
strategy*enum
REGULARIRON_RESERVERESTRICT
version*number
Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}', {
    method: 'PUT',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "name": "text",
      "strategy": "REGULAR",
      "version": 0
    }),
});
const data = await response.json();
Response
{
  "created": "2024-12-21T12:28:13.161Z",
  "id": "text",
  "lastModified": "2024-12-21T12:28:13.161Z",
  "name": "text",
  "strategy": "REGULAR",
  "version": 0
}

Delete a channel

When deleting a channel, the allocated stock is added back to the general availability.

Delete an existing Availability Channel. PLEASE NOTE: This will also delete all groups and allocations under this channel.

DELETE/api/availabilitychannels/{availabilityChannelId}
Path parameters
availabilityChannelId*string
Response

The channel has been deleted

Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}', {
    method: 'DELETE',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "description": "Missing attributes were name, address, items",
    "requestVersion": 41,
    "summary": "One or more mandatory attributes were not provided.",
    "version": 42
  }
]

2. Manage allocation groups

Each allocation must belong to a group. Groups are used to organize allocations in facilities for a specific product and channel. They are also used to display related allocations as grouped together in the Backoffice.

  • Active: This value can be set to true or false, depending on whether the allocated stock should be currently considered in stock availability and routing. This allows for flexibility in managing which distribution paths are currently operational. If active is set to false, the allocated stock is added back to the general availability.

  • ActivePeriod: The allocated stock can be considered for a timespan which is defined on group level. Channel allocations are only considered in stock availability and routing if the current time is within the defined time period. If the activePeriod is not defined, the allocations are considered as soon as they are created.

  • tenantArticleIds: A group organizes allocations for a product, identified by the tenantArticleId. Although not technically forbidden we advise users to only define one product per group.

Create a group

Create a Group under Channel

POST/api/availabilitychannels/{availabilityChannelId}/groups
Path parameters
availabilityChannelId*string
Body
active*boolean
activePeriodAvailabilityAllocationPeriod (object)
tenantArticleIds*array of string
Response

The created Group

Body
active*boolean
activePeriodAvailabilityAllocationPeriod (object)
channelRef*string
created*string (date-time)
id*string
lastModified*string (date-time)
tenantArticleIds*array of string
version*number
Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "tenantArticleIds": [
        "text"
      ],
      "active": false
    }),
});
const data = await response.json();
Response
{
  "active": false,
  "activePeriod": {
    "end": "2024-12-21T12:28:13.161Z",
    "start": "2024-12-21T12:28:13.161Z"
  },
  "channelRef": "text",
  "created": "2024-12-21T12:28:13.161Z",
  "id": "text",
  "lastModified": "2024-12-21T12:28:13.161Z",
  "tenantArticleIds": [
    "text"
  ],
  "version": 0
}

Update a group

Status (active) and activePeriod can be changed after creation.

Replace a Group under Channel

PUT/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}
Path parameters
availabilityChannelId*string
groupId*string
Body
active*boolean
activePeriodAvailabilityAllocationPeriod (object)
version*number
Response

The replaced Group

Body
active*boolean
activePeriodAvailabilityAllocationPeriod (object)
channelRef*string
created*string (date-time)
id*string
lastModified*string (date-time)
tenantArticleIds*array of string
version*number
Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}', {
    method: 'PUT',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "version": 0,
      "active": false
    }),
});
const data = await response.json();
Response
{
  "active": false,
  "activePeriod": {
    "end": "2024-12-21T12:28:13.161Z",
    "start": "2024-12-21T12:28:13.161Z"
  },
  "channelRef": "text",
  "created": "2024-12-21T12:28:13.161Z",
  "id": "text",
  "lastModified": "2024-12-21T12:28:13.161Z",
  "tenantArticleIds": [
    "text"
  ],
  "version": 0
}

Delete a group

When deleting a group, the allocated stock is added back to the general availability.

Delete an existing Group and all its allocations under Channel

DELETE/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}
Path parameters
groupId*string
availabilityChannelId*string
Response

The Group has been deleted.

Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}', {
    method: 'DELETE',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "description": "Missing attributes were name, address, items",
    "requestVersion": 41,
    "summary": "One or more mandatory attributes were not provided.",
    "version": 42
  }
]

3. Manage allocations for channels

The core functionality of channels is realized through availabilityAllocationentities. These entities link channels to specific products (identified by tenantArticleIds) and assign a predetermined quantity of stock to each channel.

  • facilityRef: Each allocation can only allocate stocks from one facility to a channel.

  • initialStockQuantity: Defines the quantity of items that should be initially allocated to the respective channel within the facility.

Create an allocation

Create a new Allocation under Group

POST/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations
Path parameters
groupId*string
availabilityChannelId*string
Body
facilityRef*string
initialStockQuantity*number
Response

The created Allocation

Body
channelRef*string
created*string (date-time)
facilityRef*string
groupRef*string
id*string
initialStockQuantity*number
lastModified*string (date-time)
version*number
Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations', {
    method: 'POST',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "facilityRef": "text",
      "initialStockQuantity": 0
    }),
});
const data = await response.json();
Response
{
  "channelRef": "text",
  "created": "2024-12-21T12:28:13.161Z",
  "facilityRef": "text",
  "groupRef": "text",
  "id": "text",
  "initialStockQuantity": 0,
  "lastModified": "2024-12-21T12:28:13.161Z",
  "version": 0
}

Update an allocation

InitialStockQuantity and groupId can be changed after creation.

Replace an existing Allocation under a group

PUT/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations/{allocationId}
Path parameters
groupId*string
allocationId*string
availabilityChannelId*string
Body
groupIdstring
initialStockQuantity*number
version*number
Response

The replaced Allocation

Body
channelRef*string
created*string (date-time)
facilityRef*string
groupRef*string
id*string
initialStockQuantity*number
lastModified*string (date-time)
version*number
Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations/{allocationId}', {
    method: 'PUT',
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      "version": 0,
      "initialStockQuantity": 0
    }),
});
const data = await response.json();
Response
{
  "channelRef": "text",
  "created": "2024-12-21T12:28:13.161Z",
  "facilityRef": "text",
  "groupRef": "text",
  "id": "text",
  "initialStockQuantity": 0,
  "lastModified": "2024-12-21T12:28:13.161Z",
  "version": 0
}

Delete an allocation

When deleting an allocation, the allocated stock is added back to the general availability.

Delete an existing Allocation under Group

DELETE/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations/{allocationId}
Path parameters
allocationId*string
groupId*string
availabilityChannelId*string
Response

The Allocation has been deleted

Request
const response = await fetch('/api/availabilitychannels/{availabilityChannelId}/groups/{groupId}/allocations/{allocationId}', {
    method: 'DELETE',
    headers: {},
});
const data = await response.json();
Response
[
  {
    "description": "Missing attributes were name, address, items",
    "requestVersion": 41,
    "summary": "One or more mandatory attributes were not provided.",
    "version": 42
  }
]

Availability Calculation

Active allocations reduce the available amount of the specified tenantArticleId(s) for all other channels by the specified amount. Initially, other availabilities are reduced by the defined initialStockQuantity. If orders are received via a channel, the quantity of allocated stock is reduced depending on the channel strategy:

  • Restrict: Available on Stock is equal to the stock that has been initially allocated to the channel minus all stock that has already been sold over this channel since the allocation has become active

  • Regular: Available on Stock is all stock that is generally available plus stock that has been initially allocated to the channel, minus all stock that has already been sold over this channel since the allocation has become active

  • Iron Reserve: Available on Stock is all stock that is generally available plus stock that has been allocated to the channel. Stock that has already been sold over this channel is only deducted if no other stock for that product is generally available

API documentation

Last updated