Products and categories of the POS should be pushed to Deliverect. We will map the PLU of incoming order items to the products.

Ideally, all products that can at one point be ordered online are pushed here.

Restaurant owners can customise their online menus by using those products coming from their POS. We do not have the ability to push menus directly. Customers can overwrite names, prices and images if necessary. Everything that is not overwritten will automatically be pushed online when updates from the POS are pushed.

Price is stored as an int with 2 decimal digits, for example, 5 euros is stored as 500.

Before you can push products, it's important to make sure you have deliveryTax filled in. This tax rate is stored as an int with 3 decimal digits (6% would be stored as 6000). It's allowed to have products with 0% tax, and even a 0 price. This can be useful for storing some extra information (such as allergies, see the product tags section for details, full formal support for allergies is coming in a future update of the API). Note that the takeawayTax is also stored as an int with 3 decimal digits.


deliveryTax and takeawayTax

Note that the delivery tax and takeaway tax are sales taxes applied by the POS based on the order type. Channel integrations may apply delivery cost tax and/or service charge tax which are different types of taxes.

The image URL you provide here is cached and put behind a CDN. Images are cached on access for 24 hours. Channels will download the images and also cache them. Depending on the channel, images can/will be resized. Deliverect supports images of up to 16.8 megapixels in size.

Updates are planned to include stock info.

Product types

We currently support 4 types of products: Products, ModifierGroups, Modifiers, and Bundles. Modifiers are options that can be selected when ordering a product. They are organised in ModifierGroups that can be assigned to one or more products. Bundles group together products for a customer to choose out of, and are used for creating meal deals. When pushing products to us you can use the values for product types as displayed in the table below.

Product Type

Integer Value





Modifier Group




A product can be in one or more categories. posCategoryIds are the references to those categories. It's important to have at least one category and link every product to it. In the future, categories will be optional.

The posProductId is the internal ID used for these products. It is unique across locations (across registers). We may later pass on this info when placing orders. Passing this info to Deliverect is optional.

The PLU is typically something that's easier for the customer to use, and it should be the same across all locations for the same product. The PLU is what will be used for mapping orders coming from the channels. It is therefore mandatory.

Deleting products

There is currently no way to directly delete a product. To achieve the desired effect, a list of products can be pushed again, in which products "to be deleted" are omitted.

Duplicate products

When you push products, make sure there are no duplicate PLUs. If there are duplicate PLUs, the product will still go through, but the duplicate products will be emitted.

Example: Meal Deals

In the payload examples to the right, you can select several examples of sets of products to be sent to Deliverect that form together various types meal deal.

These examples use the following structure, where products are linked together using the subProducts field.

Meal Deal Structure

  • Product Type:1
  • Bundle Type:4
    • Product Type:1
      • Modifier group Type:3
        • Modifier Type:2

There are several request examples of meal deals to the right.

Kid Fun Meal Box - Drink Included

In the first example, this meal deal includes a drink as part of the bundle 'Choose Your Drink'. Note that where bundles are concerned, regardless if drinks are sent with an associated price or zero valued, the only price charged to the customer will be that of the meal deal product price.

The customer is required to choose exactly one item from each bundle. This is done by setting min and max to a value of 1

The nested modifiers of sauce choices will be displayed as the modifier group is set underneath the french fries as subProducts

Kid Fun Meal Box - Drinks as an 'Upsell'

In the second example, we have a modifier group in addition to the bundles. This allows for drinks to be ordered which are not included as part of the deal and the customer will be charged accordingly. This is reffered to as an 'upsell', which can be modifier groups containing products or modifiers.

Kid Fun Meal Box - Burgers are available separately

In the third example, it is optional to order burgers outside of the meal deal. For this reason, we include all burgers twice: once with price zero, to be included in a bundle for the meal deal, and once with a non-zero price. Both instances of a burger can have the same name, but should have a different PLU.

The fourth meal deal example shows a different meal deal product with bundle price overrides. You can specify item price which will be added up to the meal deals including bundles from the scope.

It is also possible to construct combo products as follows:

Combo product (Type 1) > Modifier group (Type 3) > Modifier (Type2) > Modifier group (Type3) > Modifier (Type 2)

However, it is also possible to construct combo products as follows:

Combo product > Modifier group > Modifier > Modifier group > Modifier
The sixth meal deal example uses this structure.

Click here to see examples of how orders with these meal deal examples are sent to your POS in an order.

Multi-select modifiers

You can indicate if modifiers in a specified modifier group can be selected more than once.
To do this, have a look at the fifth meal deal example in the payload examples section.

This request is almost identical to the first meal deal example. The only difference is that the sauces modifier group (with PLU SCS-01) has two fields added: max and multiMax.

The max field gets a value of two. This limits the maximum number of modifiers that can be selected to two. As there are only two modifiers in the group, this in itself wouldn't make much of a difference when modifiers can only be selected once.

Adding multiMax makes it so that modifiers in this modifier group can be selected more than once. Because it has a value of two, each modifier can be selected at most two times.

Because of this, the customer can pick two sauces, which can be different or the same kind.

Selected by default

It's possible to set a default quantity for modifiers and meal deal items. With a default quantity of 1, the item is selected by default in the channel menu.

This is shown in the fifth meal deal example in the payload examples section, where the Mayonnaise modifier has a value of 1 for defaultQuantity. Because of this, the Mayonnaise modifier will be selected by default.

Product translations

Translations of product names and descriptions can be provided in the JSON. A base name (field name) is always required and translations are optional (field nameTranslations). Translations are supported for all product types.
The translations are passed as a nested JSON object where the property names are language tags and the values are the translations themselves.


    "productType": 1,
    "plu": "MEAT-02",
    "price": 200,
    "name": "Chicken",
    "nameTranslations": {
        "ar": "دجاج",
        "en": "Chicken",
        "es": "Pollo",
        "nl": "Kip"
    "description": "Grilled chicken",
    "descriptionTranslations": {
        "ar": "دجاج مشوي",
        "en": "Grilled chicken.",
        "es": "Pollo asado.",
        "nl": "Gegrilde kip."

The language tags are ISO 639-1 language codes. They can be complemented by a lowercase ISO 3166-1 country code.

Price Levels

Price levels allow having a single menu with different prices per channel and delivery type. The products have a base price field and can define optional prices in their priceLevels section, as pairs of a PriceLevel identifier and a price.

    "name": "Burger",
    "price": 1000,
    "priceLevels": {
        "B1": 1000,
        "D1":  900,
        "BD2020":  500

The price levels are defined during the product sync in the priceLevels section with an identifier posId and a descriptive name name.

    "name": "Burger Deal 2020",
    "posId": "BD2020"

After syncing products on a location at least once, a price level can be selected in the channel link settings. When previewing or pushing menus for these channel links, the selected price level is applied.


Note that when no data is available on a product for the selected price level, the base price is applied.


After defining a BurgerDeal price level on your burgers, sync products and apply the price level to a single (or any) channel to run the BurgerDeal on.

Product visibility

A product can be marked as invisible by setting visible property to false. After this action the product will be hidden all menus where it was used and will not be pushed to channels until it marked as visible again.

Product tags: consumable types and allergens

A product can have one or more product tags. These are are contained inside productTags. Use this to indicate consumable types and/or allergens.

The table below shows a list of consumable types and their corresponding product tag value.

Consumable Type

Integer Value











And this table provides an overview of allergens and their corresponding product tag value.


Integer Value

































brazil nuts
























Allergen Exclusions

Integer Value

No allergens


Gluten free


Sugar free


Lactose Free


Product sync preview and soft sync

It is possible to do products sync preview to see how many product will be created, update or deleted without actually applying any updates. To do this extra url parameter called previewSync set to true should added to the url i.e.

There's also an opportunity to do a soft products sync. In this case all product sync requests that are about to remove more than 30% of existing items will be aborted. To do this extra url parameter called forceUpdate set to false should added to the url i.e.

Click Try It! to start a request and see the response here!