Welcome
Login  Sign up

January 2022

Planned release to production is February 8, 2022.

Rules Management

Over the past several years, we have been slowly and steadily adding more and more capabilities to our Lead Time Rules feature. With this release, we are adding even more new functionality to this feature where this has now grown well beyond the original intent of Lead Time Rules. As such we are relabeling the menu option in the Client Portal from "Lead Time Rules" to the more broadly applicable label, "Rules Management". In addition to the relabeling, we are introducing the following new rule trigger and notification options:

  • Trigger rules by Order Percentage Complete. 
    • This will allow you to define an arbitrary percentage picking complete value that will be evaluate as the order is picked. As an example, if an order had 20 items on it, and a rule was defined at 80% complete, then the rule would be triggered when ShopperKit determines that there are only 4 more items to pick on the order.
  • Action rules by sending Customer SMS.
    • The Customer SMS rule action will allow you to select either a pre-defined template message or custom rule based message. A good use case for this feature would be to allow the system to automatically send a welcome message to the customer when picking has started on an order or closing message when the order is almost done.
  • Action rules by updating order status.
    • This option will allow you to create rules that will automatically update an order to a selected status value when the rule conditions are true. A good use case for this feature would be to define a rule that would automatically update any order to completed status if the order had not already been completed and is 5 days past its Promise Time.

Auto Assignment Lead Times by Food Safety Type

When using the Auto Assignment functionality, ShopperKit automatically prioritizes orders based on their promise time. In reality however, it is not always desirable to pick all items as soon as possible, especially for items of specific temperature zones. With this release, you will now have the option of defining an explicit lead time value for each Food Safety Type value. This lead time value will in turn be evaluated by the auto assignment batching logic to potentially exclude certain order items from an assignment batch. An example use case of this feature would be to define a "Hot Foods" food safety type with a lead time of 30 minutes. This would allow you to use the auto-assignment functionality for all zones and Food Safety Types without worrying that you may be instructed to pick a hot rotisserie chicken too far in advance of it's scheduled promise time, resulting in a cold chicken or dried out chicken at the time of pickup.

GK POS integration

With this release, we have added integration support for GK Software POS. POS integrations are managed as customer integration projects outside of regular product release cycles. If you are interested in exploring a change to GK, please contact support or your account executive.

Client Portal Enhancements

  • The timeout settings for the reporting and analytics pages have been increased to allow for long running report requests. The current timeout setting had been 30 seconds, which wasn't always sufficient, especially when running data intensive reports. The new client timeout has been extended to 5 minutes which should be more than adequate for even the largest of data loads.
  • The user management pages have been updated to utilize pagination when loading users. This is particularly useful for customers who have a lot of defined users and who wish to manage those users from the Client Admin menu level where all defined users for all stores will load. 
  • The Store Management pages have been updated to include all possible timezone values. 

Source badging in Smart Subs

For those customers who are using the integrated Smart Sub feature, ShopperKit now has the ability to badge specific suggested substitution items in the UI based on a tag attribute that is sent back to ShopperKit as part of the suggested item array. An example use case for this feature would be to visually distinguish a suggested item that a customer may have pre-selected or previously purchased from those items that are merely suggested as a product of the integrated smart sub algorithm.

Default Weight from Type 2 UPC

Currently when picking weighted items by scanning a price embedded type 2 UPC, ShopperKit will automatically calculate the weight value for the item and will allow the user to move past by confirming the weight value. For some retailers, this is not desirable and they would rather force users to enter weight as the calculated value may not accurately reflect the actual weight due to sale pricing. You may now override this behavior by configuring the new AutopopulateType2Weight attribute to False under the Store Attribute controls.

Inventory Event webhook

As a means of easily integrating ShopperKit with external systems for the purpose of maintaining and understanding real-time quantity on hand, we have now added a new Inventory Event webhook option. This webhook will fire off every time an item is picked, unpicked or marked as out of stock or substituted. When an item is picked, the Inventory Event transaction type will be decrement to indicate that a specific quantity of the item has been picked from the stated location. When an item is unpicked, the transaction type will be increment to indicate that specific quantity of the item has been placed back into the location. When the items is marked as out of stock or substituted, the transaction type will be of value empty to indicate that the item is no longer available in the location. See the following schema definition for more information.

{
"$schema": "http://json-schema.org/draft-07/schema#", 
"type": "object", 
"title": "InventoryEvent",
"properties": {
  "EventTypeName": {
    "type": "string",
    "description": "Used to distinguish the web hook event",
    "examples": [
      "InventoryEvent"
    ]
  },
  "EventId": {
    "type": "string",
    "description": "Unique identifier of event"
  },
  "ClientId": {
    "type": "integer",
    "description": "Unique ShopperKit identifier for Client"
  },
  "StoreSourceKey": {
    "type": "string",
    "description": "Retailer Store identifier"
  },
  "StoreId": {
    "type": "integer",
    "description": "ShopperKit Internal primary key for store",
    "examples": [
      "179",
      "106",
      "SKR1"]
  },
  "data":{
    "type": "object",
    "description": "Contains data attributes for Order Status Event",
    "properties":{
      "transactionType": {
        "type": "array",
        "description": "Indicates the type of Inventory Event",
        "items": {
          "type": "string",
          "enum": ["increment","decrement","empty"]
        }
      },
      "transactionTime": {
        "type": "string",
        "description": "The UTC date and time stamp that the Inventory trasaction occured"
      },
      "sku": {
        "type": "string",
        "description": "SKU value for the inventory event"
      },
      "merchandiseSectionSourceKey": {
        "type": "string",
        "description": "The ShopperKit Merchandise Section Sourcekey value of the inventory event"
      },
      "merchandiseShelfSourceKey": {
        "type": "string",
        "description": "The ShopperKit Merchandise Shelf Sourcekey value. This, together with the merchandiseShelfSourceKey will describe the precise location of the inventory event"
      },
      "quantity": {
        "type": "integer",
        "description": "The aggregate unit quantity of the inventory event"
      },
      "orderSourceKey": {
        "type": "string",
        "description": "The Order Sourcekey which triggered the inventory event"
      },
      "username": {
        "type": "string",
        "description": "The username of the individual responsible for triggering the inventory event"
      }

    }
  }
}
}

Enhancement to OrderStatusUpdateEvent Webhook

The OrderStatusUpdateEvent webhook schema has been updated to now include any custom defined order subtype value. See the following schema definition for more information. 

{
"$schema": "http://json-schema.org/draft-07/schema#", 
"type": "object", 
"title": "OrderStatusUpdateEvent",
"properties": {
  "EventTypeName": {
    "type": "string",
    "description": "Used to distinguish the web hook event",
    "examples": [
      "OrderStatusEvent"
    ]
  },
  "EventId": {
    "type": "string",
    "description": "Unique identifier of event"
  },
  "ClientId": {
    "type": "integer",
    "description": "Unique ShopperKit identifier for Client"
  },
  "StoreSourceKey": {
    "type": "string",
    "description": "Retailer Store identifier"
  },
  "StoreId": {
    "type": "integer",
    "description": "ShopperKit Internal primary key for store",
    "examples": [
      "179",
      "106",
      "SKR1"]
  },
  "data":{
    "type": "object",
    "description": "Contains data attributes for Order Status Event",
    "properties":{
      "OrderSourceKey": {
        "type": "string",
        "description": "Unique identifier for the order as assigned by commerce and generally known by customer and retailer"
      },
      "OrderStatus":{
        "type": "string",
        "description": "Name value of the current order status",
        "values": [
          "New",
          "In Progress",
          "Picked",
          "Staged",
          "POS In Progress",
          "POS Request Received",
          "POS Done",
          "Loaded",
          "Cancelled",
          "Delivery In Progress",
          "Done"
        ]
      },
      "OrderStatusId": {
        "type": "string",
        "description": "Numeric value of the current order status"
      },
      "PreviousOrderStatus":{
        "type": "string",
        "description": "Name value of the order status that order was in prior to changing to current status",
        "values": [
          "New",
          "In Progress",
          "Picked",
          "Staged",
          "POS In Progress",
          "POS Request Received",
          "POS Done",
          "Loaded",
          "Cancelled",
          "Delivery In Progress",
          "Done"
        ]
      },
      "PreviousOrderStatusId": {
        "type": "string",
        "description": "Numeric value of the previous order status"
      },
      "orderType": {
        "type": "string",
        "description": "Named order type value. Indicates if order is a pickup or delivery order.",
        "values":[
        "pickup",
        "delivery"]
      },
      "promiseTime": {
        "type": "string",
        "description": "The timezoneoffset due date for pickup orders or the beginning of the delivery window for delivery orders",
        "examples": [
          "2019-04-18 11:00:00.0000000 -04:00"
          ]
      },
      "promiseEndTime": {
        "type": "string",
        "description": "The timezoneoffset due date for pickup orders or the ending of the delivery window for delivery orders",
        "examples": [
          "2019-04-18 12:00:00.0000000 -04:00"
          ]
      },
      "paymentMethod": {
        "type": "string",
        "description": "The primary payment method on the order",
        "examples": [
          "auth_capture",
          "cash",          
          "credit",
          "debit",
          "online"
        ]
      },
      "CustomerFirstName": {
        "type": "string",
        "description": "The first name value of the customer associated to the order"
      },
      "customerLastName": {
        "type": "string",
        "description": "The last name value of the customer associated to the order"
      },
      "loyalty": {
        "type": "string",
        "description": "Defined Loyalty number for customer associated with the order"
      },
      "mobilePhone": {
        "type": "string",
        "description": "Mobile phone number for customer associated with the order."
      },
      "subType": {
        "type": "string",
        "description": "Optional Retailer defined order subtype value"
      }
    }
  }
}
}


Defects

  • Fixed the issue with the time frame definition in the allowSendMessageTimeFrame attribute so that it may understand time in the locale of the store vs. UTC.
  • Fixed the issue with the Client Portal Store Copy feature where the Carryout section and shelf Barcode values were not getting copied over.
  • Fixed the issue in ShopperKit Mobile that prevented age restricted "Prep Lite" items from advancing to the container confirmation screen during the picking flow.
  • Fixed the issue in Command Center Order Inspector that prevented Orders from being updated to a later time on the same date.
  • Fixed the issue in ShopperKit Mobile that allowed containers to be staged directly to Carryout sections where carryout shelves were defined. 
  • Corrected the POS Screen in ShopperKit Mobile to default to the Gift Card tab when gift cards are present on the order. 
  • Fixed the issue that prevented changes to order payment type from being recorded in the order status history
  • Fixed the issue that prevented the Staged status from appearing in the Command Center Order Status History timeline.