Context
In the business context, both NCR and Olayan rely on data from their respective databases, where each combo is assigned a PromoID. However, the challenge is that these PromoIDs are not unique per combo.
Given that KHU sends unique PLUs along with prices to RBI in menu services, the question arises on how to manage these combos.
For a deeper explanation, refer to https://docs.google.com/document/d/1UynTUrJIuVJjkpK-ckNKoSyMmFie_2CsFTVcqUYqB50/edit
Possibilities
Size-based PLUs
Outcome
We are able to set different p&a for the same PLU
8601
appending the size element${plu}-${size}
. Available sizes are:Small
Medium
Large
Kids
Value
We are able to set different prices for premium comboslots, but they require a deeper concatenation with the following structure:
${comboPlu}-${comboSize}-${mainItemPlu}-${premiumComboslotPlu}
Currently, sizeBasedPlus are omitted in the cart payload, but the marker item plus are still present. This can be added if required.
We are able to set different marker items for different combo sizes.
Deeper explanation on each can be found bellow.
Scenario 1 - Basic Scenario with Size Based Plus and a main item
On this example we are setting up prices for Al Farian Store id 800876.
The items are:
Whopper Meal Medium TEST - PLU
8601-medium
and Marker PLU141139
Whopper Meal Large TEST - PLU
8601-large
and Marker PLU144001
For the Whopper Meal Large I’m setting up the premium comboslot:
9 onion rings PLU
80019
These can be found on whitelabel under Flame Grilled Burgers → Whopper Test.
On Khumbu’s side Whopper Meals are supposed to share the 8601
promoId(PLU).
Create individual Sanity combo documents, for example: Whopper Meal Medium & Whopper Meal Large and set their vendorConfigs as:
Edit their price on partners-api using the sizeBased plu concatenation: PLU + size, for example
{ "channel": "whitelabel", "plus": [ { "availability": true, "plu": "8601-large", "price": 2999 }, { "availability": true, "plu": "8601-medium", "price": 1999 } ], "region": "SA", "serviceMode": "pickup", "storeIds": [ "800876" ] }
Edit the premium comboslot price on partners-api
{ "channel": "whitelabel", "plus": [ { "availability": true, "plu": "8601-large-10059-80019", "price": 399 } ], "region": "SA", "serviceMode": "pickup", "storeIds": [ "800876" ] }
For premium comboslots used with composite Plus, we need the following structure:
${comboPlu}-${comboSize}-${mainItemPlu}-${premiumComboslotPlu}
This happens due to the way composite Plus are calculated in whitelabel. For sizeBasedPlus, the main item plu is appended to the combo plu.
This logic can’t be easily changed, as the UK market is structured to use it.
Their prices will show up on whitelabel as
When adding to the Whopper Meal Large + 9 onion rings premium side to the cart and making a price request, Khumbu will receive the following payload:
{ "callbackUrl": "https://euc1-staging-bk-partners-api.rbictg.com/api/v1/orders/6c73e23f-0ec4-4c47-9363-1ff45d0be01d/price/callback", "cart": { "menuSelections": [ { "externalReferenceId": "", // note that the combo PLU is not added, explanation bellow "id": "08c3ba63-4ce2-41e4-9dfa-35c67139b0f3", "menuSelections": [ { "externalReferenceId": "10059", // whopper item sandwich "id": "item_1852", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "80019", // onion rings premium comboslot "id": "item_57364", "menuSelections": [], "price": { "amount": 399, "currency": "SAR" }, // premium comboslot price "quantity": 1, "type": "Item" }, { "externalReferenceId": "100501", // coca cola zero can side "id": "c77fa6e3-f2b8-497a-8bb4-1b216ce8302b", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "144001", // marker item "id": "144001", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" } ], "price": { "amount": 2999, "currency": "SAR" }, // combo price "quantity": 1, "type": "Combo" } ] }, "channel": "WHITELABEL_IN_STORE", "fees": [], "id": "6c73e23f-0ec4-4c47-9363-1ff45d0be01d", "instructions": [], "orderDiscounts": [], "serviceMode": "TAKEOUT", "storeId": "800876" }
Please, note that in this example, the combo PLU 8601 was not sent. Currently only constantPlus are added as the external reference ids, not size based ones. The marker item will still be present as an way to identify combos and we’re able to have different marker items for different combos sizes.
Adding the combo PLU can be done, but we need to understand first how that would affect other markets such as BK UK.
Scenario 2 - Handling Family Bundles(combos with multiple sandwiches/main items)
On this example we are setting up prices for Al Farian Store id 800876.
The items are:
Family Bundle Test - PLU
1234-medium
and Marker PLU144001
For the Family Bundle Test I’m setting up the premium comboslot:
9 onion rings PLU
80019
These can be found on whitelabel under King Savers → Family Bundle TEST.
The goal is to evaluate the possibility of having size based plus with multiple sandwiches(main items) and still be able to set up premium comboslot pricing(e.g: charge extra for certain sides)
Create a combo or offerCombo on Sanity with no Main Item
Add any amount of comboslot options as required. In this case we’re adding two different burgers, large and small drinks & sides.
Set up the appropriate size based PLUs for this combo
The prices can be edited through partners-api with the following payload
{ "channel": "whitelabel", "plus": [ { "availability": true, "plu": "1234-medium", // the combo plu + size "price": 3999 }, { "availability": true, "plu": "1234-medium-80019", // the combo plu + size + onion ring plu "price": 599 } ], "region": "SA", "serviceMode": "pickup", "storeIds": [ "800876" ] }
This will reflect on whitelabel as
When adding to cart and pricing, Khumbu will receive the following payload:
{ "callbackUrl": "https://euc1-staging-bk-partners-api.rbictg.com/api/v1/orders/41d0168f-41ab-4832-807a-e29a21a88c51/price/callback", "cart": { "menuSelections": [ { "externalReferenceId": "", "id": "65e5ddaf-0893-4908-bfca-56de2c6ca510", "menuSelections": [ { "externalReferenceId": "80019", // onion rings premium comboslot "id": "item_57364", "menuSelections": [], "price": { "amount": 599, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "100501", // coca cola can large side "id": "c77fa6e3-f2b8-497a-8bb4-1b216ce8302b", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "10059", // whoppper sandwich "id": "item_1852", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "80001", // regular fries small side "id": "16f482db-2f13-4476-88d3-d2eec26057f3", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "80007", // small coca cola can small side "id": "4f99db1e-128a-4e53-b23b-dffc0fedf636", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "20006", // chicken royale second sandwich "id": "item_1853", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "144001", // family bundle marker item "id": "144001", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" } ], "price": { "amount": 3999, "currency": "SAR" }, "quantity": 1, "type": "Combo" } ] }, "channel": "WHITELABEL_IN_STORE", "fees": [], "id": "41d0168f-41ab-4832-807a-e29a21a88c51", "instructions": [], "orderDiscounts": [], "serviceMode": "TAKEOUT", "storeId": "800876" }
To setup prices for combos with multiple burgers/no main item, the following structure is expected:
For the combo:
${comboPlu}-${size}
For premium comboslots:
${comboPlu}-${size}-${comboslotOptionPlu}
In the above example the prices were setup only for the medium variation, but the same would work when setting large, super, small, etc.
Scenario 3 - Handling Combos with possibility to pick a main item with different PLUs
On this example we are setting up prices for Al Farian Store id 800876.
The items are:
Burger Pick Test - PLU
5678-medium
and Marker PLU141139
For the Burger Pick Test I’m setting up the premium comboslot:
9 onion rings PLU
80019
Additionally the the Burger Comboslot Test was created and added to the Burger Pick Test. It has the following options:
Whopper - PLU
10059
Chicken Royale - PLU
20006
These can be found on whitelabel under Flame Grilled Burgers → Burger Pick Test.
The goal here is to understand the scenario mentioned in the meeting:
A combo that might contain whopper with cheese vs whopper without cheese(both of them having different PLUs, so being two different sandwiches from a P&A perspective).
Setup the Combo and the Plus as done in the previous examples
Create a comboslot and add the burgers as options. The first one is whopper, the second chicken royale.
Set the combo prices on partners-api
{ "channel": "whitelabel", "plus": [ { "availability": true, "plu": "5678-medium", "price": 3999 }, { "availability": true, "plu": "5678-medium-80019", "price": 199 } ], "region": "SA", "serviceMode": "pickup", "storeIds": [ "800876" ] }
This will reflect on whitelabel as the following
The user will be able to pick and customize his burger after clicking on the comboslot
For this order we are picking the chicken royale option. Once added to the cart and making a price request, Khumbu will receive:
{ "callbackUrl": "https://euc1-staging-bk-partners-api.rbictg.com/api/v1/orders/c9c458ec-a6fd-4e54-b515-0e4f7f796882/price/callback", "cart": { "menuSelections": [ { "externalReferenceId": "", "id": "3c7d4efa-07f9-4478-9036-2d39ad5d7bd5", "menuSelections": [ { "externalReferenceId": "80007", // small coca cola can small side "id": "4f99db1e-128a-4e53-b23b-dffc0fedf636", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "80019", // 9 onion rings premium comboslot "id": "item_57364", "menuSelections": [], "price": { "amount": 199, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "20006", // chicken royale sandwich "id": "item_1853", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" }, { "externalReferenceId": "141139", // marker item plu "id": "141139", "menuSelections": [], "price": { "amount": 0, "currency": "SAR" }, "quantity": 1, "type": "Item" } ], "price": { "amount": 1599, "currency": "SAR" }, "quantity": 1, "type": "Combo" } ] }, "channel": "WHITELABEL_IN_STORE", "fees": [], "id": "c9c458ec-a6fd-4e54-b515-0e4f7f796882", "instructions": [], "orderDiscounts": [], "serviceMode": "TAKEOUT", "storeId": "800876" }
The price setup here works the same as example two. The main thing to determine the type of concatenation required is the presence or not of a main item. The platform currently supports a single main item, however it’s not required to have a main item inside a combo.