The Inventory Import process provides current stock-level information to Kibo. This data helps Kibo accurately assign orders to fulfillment locations and set product availabilities. Some clients who have multiple fulfillment locations use inventory data to manage inventory levels and assign orders to those multiple locations.
Types of Inventory Import
Two types of Inventory Import processes exist: Refreshes and Updates. Refreshes are more comprehensive and usually sent once per day, providing the total count for all products in the catalog. Updates are normally sent every hour and provide an adjustment to the values sent in the previous Refresh, indicating which product counts should be increased or decreased.
Refresh File Attributes
- Delivered to Kibo once each day
- Represents an accurate stock count for all products
- Includes products with a stock count of zero (0)
Update File Attributes
- Delivered to Kibo throughout the day
- Increments (+2) or decrements (-2) existing stock count(s)
- Sometimes called a ‘trickle’ feed
The client must have prepared an SFTP (Secure File Transfer Protocol) site or an S3 bucket where Kibo can pick up and drop off inventory files. There needs to be a provide a username, password, remote path, and remote path archive for the file transmission location.
SFTP Best Practices
Kibo recommends following the below guidelines to maximize SFTP performance. These suggestions apply to any file pickup and ingestion processes from a client-side or third party SFTP droppoint, as well as Kibo's own file delivery.
- Ensuring access to the SFTP droppoint is the responsibility of the client or third party maintainer. Make sure that Kibo's SFTP user has read and write permissions to the directory, which is required to deliver files.
- For example, in the command line this may look like
drw-rw-r--(which means the owner has read/write, the group has read/write, others are read-only)
- For example, in the command line this may look like
- Ensure files do not pile up over time → utilize /archive folders and periodic cleanup of historic data. Monitor the droppoint and clean up files that are no longer needed.
- If you need to retain the files, archive them to another folder once they’ve been processed.
- Ensure disk space usage is monitored and alerts the maintaining IT team in time to address low disk space situations before causing connection issues for Kibo.
Creating and Uploading the Files
Inventory data should be submitted as XML or CSV files and compressed into Zip format before being transferred.
A Trigger/Control file should also be created each time data is submitted. The Trigger file tells Kibo that the inventory file is ready to process. This is an empty file with the same file name as the inventory files being submitted, and the extension .done (ex. T__REFRESH_130909121152.zip.done).
The zipped file should be uploaded to the SFTP/S3 site followed by the Trigger file.
Naming Inventory Import Files
Inventory files should be named with the following conventions, depending on what type of inventory import it is:
- is the Kibo-assigned tenant ID (for example, 3456)
- REFRESH identifies this file as a Refresh
- UPDATE identifies this file as an Update
- YYMMDD is the year, month, and day represented in two-digit format. For example, 130301 is March 1, 2013
- hhmmss is the time in Pacific Standard Military Time, expressed as hour-minute-second, that the file was created. For example, 205912 is 10:59:12 p.m. PT.
These parameters are used in both CSV and XML file formats. When building the file, identify a location name and then follow it with blocks of the item-specific data for each product.
|LocationCode||Yes||String||The identifier of the location that is submitting inventory data. Note that this value should actually be the external ID for the location, not the name as stored in the Kibo Composable Commerce Platform admin.|
|PartNumber||Optional||String||A merchant-assigned part identification for the item.|
|UPC||Yes||String||The UPC for the item. This should be the most unique identifier for the item; any other identifier can be used in PartNumber.|
|SKU||Optional||String||The SKU for the item.|
|Quantity||Yes||Integer||If this is a Refresh, this is the number of the item in inventory. Examples are 352 and 4. If this is an Update, this value includes a + (plus) or – (minus), and is the change in quantity from the previous submission. Examples are +352 and -4.|
|Bin||Optional||Integer||The name of the bin within a location. Used for warehouse and store management. It must exist for the LocationCode.|
|LTD||Optional||Integer||Custom field used for store prioritization. Kibo will advise you on the type of data to enter in this field if you need to use it.|
|SafetyStock||Optional||Integer||Quantity of this item you want to keep in stock to ensure your stock isn’t completely depleted. Both Safety Stock and Floor are optional; most people prefer Safety Stock to Floor.|
|Floor||Optional||Integer||Absolute minimum quantity of this item that should be in stock at any time. Both Safety Stock and Floor are optional; the two values are used for similar purposes; most people prefer to use Safety Stock rather than Floor.|
|CurrencyID||Optional||Integer||Field defining which currency is used to store the RetailPrice. Required if RetailPrice is passed in. See the Currency API for details|
|RetailPrice||Optional||Decimal||The location specific price the product being refreshed. CurrencyID is required if RetailPrice is passed in.|
|Attributes||Optional||Array||A list of attributes that are assigned to the item.|
|InventoryLocatorName||Optional||String||An identifier to indicate where a particular SKU exists within a location. For example, "Aisle 5" would indicate that the bin this item belongs to is located in Aisle 5. The maximum length is 50.|
|Custom Tag||Optional||String||If you use tags for inventory segmentation, you can include those tags in the file just like any other field. The tag name should be the field name (such as "Channel") and values should match the options set up in your segmentation configuration (such as "Amazon" or "eBay").|
Here is an example import sequence:
- Create the file : T__REFRESH_130909121152.xml (or .csv)
- Compress (zip) the file : T__REFRESH_130909121152.zip
- Upload the zip file.
- Upload a Trigger/Control file : T__REFRESH_130909121152.zip.done
The following example provides inventory information for two locations and includes only required elements.
<?xml version="1.0" encoding="UTF-8"?> <Inventory> <Location> <LocationCode>0001</LocationCode> <Item> <PartNumber>883360541099</PartNumber> <UPC>883360541099</UPC> <Quantity>11</Quantity> <SafetyStock>4</SafetyStock> <Floor>1</Floor> <LTD>3</LTD> <Attributes>RESTOCK-CARRIER|RESTOCK-TRUCK</Attributes> <InventoryLocatorName>Aisle 2</InventoryLocatorName> </Item> <Item> <PartNumber>883360541075</PartNumber> <UPC>883360541075</UPC> <Quantity>44</Quantity> <SafetyStock /> <Floor /> <LTD /> <Attributes>RESTOCK-CARRIER</Attributes> <InventoryLocatorName>Aisle 3</InventoryLocatorName> </Item> </Location> <Location> <LocationCode>0002</LocationCode> <Item> <PartNumber>883360541099</PartNumber> <UPC>883360541099</UPC> <Quantity>11</Quantity> <SafetyStock>4</SafetyStock> <Floor>1</Floor> <LTD>3</LTD> <Attributes>RESTOCK-CARRIER</Attributes> <InventoryLocatorName>Aisle 4</InventoryLocatorName> </Item> <Item> <PartNumber>883360541075</PartNumber> <UPC>883360541075</UPC> <Quantity>44</Quantity> <SafetyStock>5</SafetyStock> <Floor>1</Floor> <LTD>2</LTD> <Attributes>RESTOCK-CARRIER</Attributes> <InventoryLocatorName>Aisle 5</InventoryLocatorName> </Item> </Location> </Inventory>
The following example provides inventory information for two locations. Note that CSV has some special requirements:
- The header is optional.
- Order of inventory fields matters: LocationCode,PartNumber,UPC,SKU,Quantity,Bin, etc.
- At least the string fields must be quoted. Quotes may not be required for the data field names or integers, but if you experience errors then Kibo recommends adding quotes to all values as shown below.
"LocationCode","PartNumber","UPC","SKU","Quantity","Bin","TD","SafetyStock","Floor","CurrencyID","RetailPrice","Attributes","InventoryLocatorName" "0001","PartNumber1","UPC1","SKU1","11","BinName1","1.0","2","4","1","25.99","","Aisle 1" "0001","PartNumber2","KCCP1","","44","BinName2","","Aisle 2" "0002","PartNumber1","UPC1","SKU1","11","","1.0","2","1","","Aisle 3" "0002","PartNumber2","UPC1","","44","","Aisle 4"
CSV File with Inventory Tags
This example includes a custom tag called "channel" used in inventory segmentation. This indicates that these inventory records belong to the Amazon order channel.
"LocationCode","PartNumber","UPC","SKU","Quantity","InventoryLocatorName","Channel" "0001","PartNumber1","UPC1","SKU1","11","Aisle 1","Amazon" "0002","PartNumber2","UPC1","","44","Aisle 4","Amazon"