Accurate Fulfillment Dates

Before ordering a product, a shopper may appreciate visibility as to when they would receive it. The Kibo Composable Commerce Platform can calculate accurate fulfillment dates for each product that allow you to offer promised dates to your shoppers. These dates are provided for you to do further calculations with as needed and display on the storefront's product details pages.

These dates are returned from the Get Inventory API and Order Routing’s Candidates and Suggest APIs, and are supported for all shipment types and all products with current and/or future inventory.

This feature is available with a version of the Get Inventory API built on RIS (the Real-Time Inventory Service). It is not enabled for all clients yet. Kibo will be transitioning all clients to the new version of Get Inventory. Contact Kibo Support if you have any questions.

Product Fulfillment Dates

Fulfillment dates are generally calculated based on the date when the product is available at the fulfillment location + the processing time it takes to prepare the shipment. If transfers are required for an item, then the transfer time will be factored into the calculation as well.

  • Processing time: This is approximately how many hours a location takes to fulfill an item such as completing a pick, preparing the shipment, and so forth.
  • Transfer time: This is the approximate time taken to transfer a product from the transfer location to a destination location, measured in either hours or days. This transfer time is irrespective of what location it is sending the transfer to. For example, a warehouse will have the same transfer time to any of the stores it is transferring to.

The rest of this section explains how these values are used to calculate BOPIS and STH fulfillment dates, as well as how to set the processing and transfer times in location settings.

Buy Online Pickup In Store

The fulfillment date for BOPIS products refers to when it will be ready for pickup. This is calculated differently depending on the transfer and available inventory scenario.

  • With Transfers Disabled: Fulfillment Date = Current Date + Processing Time
  • With Transfers Enabled and Available Inventory: Fulfillment Date = Current Date + Processing Time 
  • With Transfers Enabled and No Available Inventory: KCCP will return all location candidates from the Get Candidates API with a “transfer fulfillment date” field, which is Current Date + Transfer Time + Processing Time
    • You are responsible for using this information to display the fulfillment date. Kibo recommends using the above information to calculate a date range, as opposed to giving shoppers the exact fulfillment date. This is because the transfer location is not finalized until after the order is placed, so it may have a different fulfillment time than originally estimated and displaying a date range will provide a buffer to account for that. You can use the sum of the BOPIS location's Fulfillment Date and the Transfer Fulfillment Date to determine the final fulfillment date.

If you have a transfer location, you will need to set the Direct Ship Processing Time even if your location is not Direct Ship enabled. This is because the Processing Time used in calculating the Transfer Fulfillment Date at the transfer location references the Direct Ship Processing Time.

For example, you could display the below messaging on the product details page:

  • Available for in-store pick up today after 3 PM
  • Available for in-store pick up after August 21

Ship to Home

The fulfillment date for Ship to Home products refers to when it will be ready to ship to the customer. The calculation depends on whether there is current inventory available or if future inventory will be used instead.

  • If Current Inventory: Fulfillment Date = Current Date + Processing Time
  • If Future Inventory: Fulfillment Date = Incoming Inventory Date + Processing Time

For example, you could display the below messaging on the product details page:

  • Ready to Ship: Tomorrow
  • Get it soon! Ready to ship by August 21

Ship to Home Consolidation

As Ship to Home Consolidation utilizes transfers, its calculations are similar to those listed above for BOPIS scenarios. As the consolidation location is not yet known when the order is placed, the Candidates API will return fulfillment dates with the location candidates that have partial inventory.

One way that you could use this information for your storefront is to take the earliest and latest fulfillment dates across all locations, buffer with the maximum processing time across all locations, and then add the transfer time. This will generate a date range that accounts for whichever location is selected as the final consolidation location.

Set Processing and Transfer Times

To define the processing and transfer times of locations:

  1. Go to Main > Orders > Locations.
  2. Either select an existing location or create a new location.
  3. In the Processing Time section of the location settings, set the Direct Ship (used for both Ship to Home and Transfer) and In Store Pickup values.
  4. Optional: If transfers are enabled, enter a Transfer time for the Transfer Fulfillment Date to be calculated. Set the Transfer time unit to determine whether it is measured in hours or days. The Transfer Enabled toggle and transfer time settings
  5. Click Save.

With Inventory Segmentation

This feature is also supported by inventory segmentation. For current inventory, fulfillment fields are only displayed within the tags and not at the parent item level. If future inventory is present, the fields will be displayed within both the tags and the parent level. This is because future inventory records are not aggregated, so each tag will each will have its own incoming inventory date and corresponding fulfillment date.

This is an example of the taggedInventory section of the Get Inventory response, showing fulfillment dates at the tag level for current and future inventory:

"taggedInventory": [
            {
                "onHand": 117,
                "available": 117,
                "allocated": 0,
                "pending": 0,
                "sthFulfillmentDate" : "01/01/2024",
                "bopisFulfillmentDate" : "01/01/2024",
                "transferFulfillmentDate" : "2023-03-29T17:00:00+0000",
                "sthProcessingTimeHours" :  6,
                "bopisProcessingTimeHours" :  6,
                "transferProcessingTimeHours" :  5,
                "tags": {
                    "Channel": "Kibo",
                    "OrderType": "STH",
                    "Material": "Plastic",
                    "Color": "Blue",
                    "Shape": "Sphere"
                },
                "futureInventory": [
                    {
                        "futureInventoryID": 1634,
                        "onhand": 200,
                        "available": 200,
                        "allocated": 0,
                        "pending": 0,
                        "type": "Adjust",
                        "deliveryDate": "2024-02-20T17:00:00+0000",
                        "createDate": "2023-06-05T21:14:40+0000",
                        "sthFulfillmentDate" : "01/01/2024",
                        "bopisFulfillmentDate" : "01/01/2024",
                        "sthProcessingTimeHours" :  6,
                        "bopisProcessingTimeHours" :  6,
                    },
                    {
                        "futureInventoryID": 1635,
                        "onhand": 200,
                        "available": 200,
                        "allocated": 0,
                        "pending": 0,
                        "type": "Adjust",
                        "deliveryDate": "2024-02-22T17:00:00+0000",
                        "createDate": "2023-06-05T21:14:46+0000",
                        "sthFulfillmentDate" : "01/01/2024",
                        "bopisFulfillmentDate" : "01/01/2024",
                        "sthProcessingTimeHours" :  6,
                        "bopisProcessingTimeHours" :  6,
                    }
                ]
            }
        ]
    }

Fulfillment Dates in the API

The Get Inventory and Order Routing APIs return the following values for fulfillment dates and processing times:

"sthFulfillmentDate": string,
"bopisFulfillmentDate": string,
"transferFulfillmentDate": string,
"bopisProcessingTimeHours": integer,
"sthProcessingTimeHours": integer,
"transferProcessingTimeHours": integer

In the Order Routing APIs, these fields are only returned if the location specified in the request is enabled for that fulfillment type. For instance, if a location is only STH and Transfer enabled then Order Routing will not return BOPIS fields.

However, transfer dates will never be returned in cases with Future inventory even if the location is enabled for transfer.

Below is an example of a Get Inventory API response that includes all fulfillment date information:

[
    {
        "locationName": "Example Store",
        "locationCode": "B",
        "tenantID": 11111,
        "onHand": 117,
        "available": 117,
        "allocated": 0,
        "pending": 0,
        "sthFulfillmentDate" : "2023-03-29T17:00:00+0000",
        "sthProcessingTimeHours" :  6,
        "bopisFulfillmentDate" : "2023-03-29T17:00:00+0000",
        "bopisProcessingTimeHours" :  6,
        "transferFulfillmentDate" : "2023-03-29T17:00:00+0000",
        "transferProcessingTimeHours" :  5,
        "transferTimeHours" :  5,
        "partNumber": "product_2",
        "upc": "product_2",
        "sku": "product_2",
        "blockAssignment": false,
        "ltd": 0,
        "floor": 0,
        "safetyStock": 0,
        "distance": 0,
        "directShip": true,
        "transferEnabled": true,
        "pickup": true,
        "countryCode": "US"
    }
]

Below is an example of the Order Routing Suggest API response that includes all fulfillment date information:

{
    "assignmentSuggestions": {
        "1": [
            {
                "orderItemID": 1,
                "locationID": 010101,
                "locationCode": "8",
                "quantity": 100,
                "route": "DIRECTSHIP",
                "sthFulfillmentDate": "2023-06-26T22:26:39Z",
                "bopisFulfillmentDate": "2023-06-27T00:26:39Z",
				"transferFulfillmentDate": "2023-06-26T22:26:39Z",
                "bopisProcessingTimeHours": 8,
                "sthProcessingTimeHours": 6,
				"transferProcessingTimeHours": 6,
            }
        ]
    },
    "futureAssignmentSuggestions": {
        "1": [
            {
                "orderItemID": 1,
                "locationID": 010101,
                "locationCode": "8",
                "quantity": 1000,
                "route": "DIRECTSHIP",
                "futureDate": "2023-07-07T20:00:00Z",
                "futureDateString": "2023-07-07T20:00Z",
                "sthFulfillmentDate": "2023-07-08T02:00:00Z",
                "bopisFulfillmentDate": "2023-07-08T04:00:00Z",
				"transferFulfillmentDate": "2023-07-08T02:00:00Z",
                "bopisProcessingTimeHours": 8,
                "sthProcessingTimeHours": 6,
				"transferProcessingTimeHours": 6,
            }
        ]
    },
    "stateChangeSuggestions": {
        "1": {
            "orderItemID": 1,
            "stateChange": "CUSTOMER_CARE",
            "quantity": 9900
        }
    },
    "availableLocations": [],
    "responseID": 33221100,
    "route": "DIRECTSHIP",
    "emptyResponse": false
}

Below is an example of the Order Routing Candidates API response that includes all fulfillment date information:

{
    "candidateSuggestions": [
        {
            "locationCode": "7",
            "locationName": "Example Store",
            "city": "Mead",
            "state": "WA",
            "countryCode": "US",
            "postalCode": "99021",
            "distance": "294.357879638671875 mi",
            "latitude": 47.794,
            "longitude": -117.294,
            "express": true,
            "pickup": true,
            "transferEnabled": true,
            "directShip": true,
            "inventory": [
                {
                    "available": 10000,
                    "sthFulfillmentDate": "2023-06-30T07:18:33Z",
                    "bopisFulfillmentDate": "2023-07-01T02:18:33Z",
					"transferFulfillmentDate": "2023-06-30T07:18:33Z",
                    "bopisProcessingTimeHours": 120,
                    "sthProcessingTimeHours": 101,
					"transferProcessingTimeHours": 101,
                    "upc": "example-item"
                }
            ]
        }
    ]
}

Fulfillment dates are also supported for GraphQL real-time inventory service queries and will be returned if requested (which is optional). However, they are not supported on all queries. They are only returned if they make sense for the query and use case.

Product Delivery Dates

Kibo does not provide product delivery dates, but you can calculate them based on the provided fulfillment date. This section is just one example of how you may determine your own delivery dates.

First, you could set up the below parameters:

  • Marketed Shipping Method = Default shipping method to market, measured in days. 
  • Shipping Method = Shipping method chosen by the customer, measured in days

And then calculate the following delivery dates:

  • Marketed Delivery Date = Fulfillment Date + Marketed Shipping Method
  • Estimated Delivery Date = Fulfillment Date + Shipping Method