CPGs SFTP Inventory

Retailers choosing to feed Rappi fresh inventory data by CSV file transfer need to understand the authentication, file conventions, and schema outlined in this document.

Those integrating with our Inventory API may find a full breakdown of the authentication scheme and the JSON payload schema in the API specification document.

SFTP Authentication

Use the authentication credentials (username-password) provided by your TAM on every file upload.

Destination Folder

Always transfer your inventory CSV files to the uploads folder on the SFTP server.

File Conventions

In order to Rappi successfully ingest your inventory data, each CSV file MUST adhere to the following conventions:

  1. Files must not include data from multiple stores.

  2. File names must follow the convention <store_id>_<unix_time>.csv. For more information on store_id, review the section your store list of the integration guide.

Unix time is widely used in operating systems and file formats. It represents the number of seconds that have elapsed since January 1st, 1970.

This timestamp identifies when the CSV file was created by your ETL process. Rappi leverages this to ensure that the most up to date inventory data is always applied to your customer-facing catalog.

  1. File names must always be appended with the extension .csv

  2. Files must always use UTF-8 encoding.

  3. The first row on every file should always bear the column names.

Review the data schema section for info on required and optional columns.

  1. Column names must always be in lower case.

  2. Always use ; (semicolons) for column separation.

  3. Enclose ALL string-values (i.e. text) in quotes, e.g. "example".

  4. Always use . (dot) as a decimal separator.

An example file is available here inventory-upload-example.csv

Data Schema

Mandatory Data

There are seven mandatory columns that must always be passed in the CSV file. These are marked with the label required throughout the schema.

store_id

required string
  • A retailer-generated identifier for the store having its inventory updated
  • If you have multiple stores, apply a unique identifier to each of them
  • Our data ingestion engine maps your store_id with the ones Rappi handles internally. If you wish to add a new store, first contact your account manager, so all internal provisions are handled to enable the new store to be listed in our app

id

required string
  • Each product's unique id, often the SKU identifier
  • Managed internally by retailers
  • ids not previously included in your master catalog might be ignored by our data ingestion engine (always contact your account manager to add new products to your master catalog)

ean

required string
  • The EAN (or UPC) of a product; commonly known as the product barcode
  • The ean column may be used to create a unique product id for single-SKU bundles, using the format <ean>_<quantity> (in such instances, you must pass a different (product id) id for the bundle, not the original SKU).

The following example illustrates a bundle scenario:

ideanprice
ideanprice
hwtz78960097604336.99
hwtz_3789600976043318.88

name

required string
  • The name of the product

sale_type

required string
 accepted values: U | WW
  • This column indicates how the product is sold
  • Use "U" for products sold by units or "WW" for those sold by weight in kilograms (Kg)

stock

required integer
  • The quantity of the product available for sale

price

required number
  • The regular price for a product
  • There's an optional column for passing a temporary marked down prices

Discounts

Three columns control discounts (markdowns). If you want to mark down a product, then all three columns must be populated (i.e., are mandatory).

discount_price

number
  • This is the product's temporary sale price

discount_start_at

string, format: date
  • This is the discount start date; always use the ISO 8601 date format YYYY-MM-DD

discount_end_at

string, format: date
  • This is the discount end date. The same convention for date string format applies

Optional Data

is_available

boolean
 accepted values: T (true) | F (false)
  • This switch indicates whether the product should be published on the app irrespective of its stock

Rappi uses is_available within its own systems. It is populated by Rappi according to a set of rules that include factors such as the stock count provided in column stock.

Rappi may apply a security level on stock to reduce the risk of stock-outs, e.g., the current stock for a toothpaste brand is at 3 units, but a security stock level of 5 has been assigned to that store. This SKU may be displayed in the app with an out-of-stock or low-stock warning.

The security stock level is a factor that may be negotiated with your TAM. Larger retailers with sophisticated stock-control mechanisms may not require such configuration. A conservative stock-estimate approach is also taken during promotions.


category_first_level

string
  • This is the main category for listing the product

category_second_level

string
  • This is a secondary category listing for the product

image_url

string
  • A publicly-accessible URL for the product image