Introducing Nested Modifiers Support - Ordering Platform API Suite
[Release on: 12th March, 2026]
This update introduces nested modifier support, enabling ordering platforms to support multi-level customisation of menu items.
According to the previous implementation, the ordering platform supported only a single level of modifiers. With this release, modifiers can now include another level of modifiers within them, allowing customers to choose options within options.
This enhancement enables more advanced menu customisation scenarios that are commonly required in the food industry. For example, customers may select a modifier such as “Extra Cheese”, and then further customise it by selecting additional options such as “Cheese Type” or “Cheese Portion”.
Nested modifiers provide greater flexibility for restaurants to model complex menu configurations while maintaining a structured and scalable payload format.
Below is how nested modifiers are included in the menu payload.
- Nested Modifier Configuration
Nested modifiers will be defined within the item array of the payload as MODIFIER objects.
These nested modifiers represent the second level of customisation and will later be linked to a dedicated nested modifier group.
- Nested Modifier Group Configuration
A new modifier group will be defined within the modifierGroups array specifically for the nested modifiers.
This modifier group will contain the nested modifier(s) defined in the previous step.
- Linking Nested Modifiers to the Modifier Group
The IDs of the nested modifiers defined earlier will be included in the nested modifier group.
This configuration establishes the relationship between the nested modifier group and the nested modifier(s).
- Parent Modifier Configuration with Nested Modifier Group
The parent modifier acts as the first-level modifier and contains the nested modifier group.
Configuration details:
• The parent modifier will be defined within the item array as an ITEM object.
• Within the parent modifier’s modifierGroups array, the nested modifier group ID is included.
This allows the parent modifier to expose the nested customisation options.
- Parent Modifier Group Configuration
A parent modifier group will be included in the modifierGroups array to hold the parent modifier(s).
This group may contain: • Parent modifiers with nested modifiers • Regular modifiers without nested modifiers
This ensures backward compatibility with existing menu configurations.
- Parent Modifier Group Configuration in the Main Menu Item
The main menu item references the parent modifier group.
Within the main item object: • The parent modifier group ID will be included in the modifierGroups array.
This configuration allows the main item to expose the full hierarchy of customisation options.
Sample payload.
{
"categories": [
{
"background": {
"type": "SOLID_COLOR",
"value": "#ff6900"
},
"description": {
"translations": {...}
},
"id": "69aebcedf3a91d1985b42f53",
"items": [
"69aebcf29d5a123ea34fd945"
],
"name": {
"translations": {...}
},
"servingHours": [...],
"gtInternalId": "69aebcedf3a91d1985b42f53"
}
],
"currencyCode": "AED",
"description": {...},
"externalData": "",
"id": "69aebcedf3a91d1985b42f54",
"imageUrl": "https://stg.cdngrubtech.com/default-menu-cover.jpg",
"items": [
{
"classifications": [],
"description": {...},
"id": "69aebcf29d5a123ea34fd945",
"imageUrl": "",
"modifierGroups": [
"69aebce2cd9ebc475c99b65469aebc60f3a91d1985b42f4d"
],
"name": {
"translations": {
"el-gr": "Main Menu Item",
"en-us": "Main Menu Item",
"ar-ae": "Main Menu Item",
"en-gb": "Main Menu Item",
"es": "Main Menu Item"
}
},
"priceInfo": {
"price": 5
},
"quantityInfo": {
"maxPermitted": 100,
"minPermitted": 0
},
"type": "ITEM",
"unavailableStoreIds": [],
"tags": [],
"allergens": [],
"gtInternalId": "69aebc60f3a91d1985b42f4e"
},
{
"classifications": [],
"description": {...},
"id": "69aebcf29d5a123ea34fd946",
"modifierGroups": [
"69aebce2cd9ebc475c99b65469aebc8af3a91d1985b42f50"
],
"name": {
"translations": {
"el-gr": "Parent modifier 1",
"en-us": "Parent modifier 1",
"ar-ae": "Parent modifier 1",
"en-gb": "Parent modifier 1",
"es": "Parent modifier 1"
}
},
"priceInfo": {
"price": 0
},
"quantityInfo": {
"maxPermitted": 100,
"minPermitted": 0
},
"type": "ITEM",
"unavailableStoreIds": [],
"allergens": [],
"gtInternalId": "69aebb9fcd9ebc475c99b501"
},
{
"classifications": [],
"description": {
"translations": {
"el-gr": "Nested modifier 1",
"en-us": "Nested modifier 1",
"ar-ae": "Nested modifier 1",
"en-gb": "Nested modifier 1",
"es": "Nested modifier 1"
}
},
"id": "69aebcf29d5a123ea34fd947",
"imageUrl": "",
"modifierGroups": [],
"name": {
"translations": {
"el-gr": "Nested modifier 1",
"en-us": "Nested modifier 1",
"ar-ae": "Nested modifier 1",
"en-gb": "Nested modifier 1",
"es": "Nested modifier 1"
}
},
"priceInfo": {
"price": 0
},
"quantityInfo": {
"maxPermitted": 1,
"minPermitted": 0
},
"type": "MODIFIER",
"unavailableStoreIds": [],
"allergens": [],
"gtInternalId": "69aebb6ccd9ebc475c99b4e2"
},
{
"classifications": [],
"description": {
"translations": {
"el-gr": "Nested modifier 2",
"en-us": "Nested modifier 2",
"ar-ae": "Nested modifier 2",
"en-gb": "Nested modifier 2",
"es": "Nested modifier 2"
}
},
"id": "69aebcf29d5a123ea34fd948",
"imageUrl": "",
"modifierGroups": [],
"name": {
"translations": {
"el-gr": "Nested modifier 2",
"en-us": "Nested modifier 2",
"ar-ae": "Nested modifier 2",
"en-gb": "Nested modifier 2",
"es": "Nested modifier 2"
}
},
"priceInfo": {
"price": 0
},
"quantityInfo": {
"maxPermitted": 1,
"minPermitted": 0
},
"type": "MODIFIER",
"unavailableStoreIds": [],
"allergens": [],
"gtInternalId": "69aebb73cd9ebc475c99b4e4"
}
],
"modifierGroups": [
{
"id": "69aebce2cd9ebc475c99b65469aebc60f3a91d1985b42f4d",
"modifiers": [
"69aebcf29d5a123ea34fd946"
],
"name": {
"translations": {
"el-gr": "Parent Modifier Group",
"en-us": "Parent Modifier Group",
"ar-ae": "Parent Modifier Group",
"en-gb": "Parent Modifier Group",
"es": "Parent Modifier Group"
}
},
"quantityInfo": {
"maxPermitted": 1,
"minPermitted": 0
},
"tags": [],
"gtInternalId": "69aebbb2f3a91d1985b42f4c"
},
{
"id": "69aebce2cd9ebc475c99b65469aebc8af3a91d1985b42f50",
"modifiers": [
"69aebcf29d5a123ea34fd947",
"69aebcf29d5a123ea34fd948"
],
"name": {
"translations": {
"el-gr": "Nested Modifier Group",
"en-us": "Nested Modifier Group",
"ar-ae": "Nested Modifier Group",
"en-gb": "Nested Modifier Group",
"es": "Nested Modifier Group"
}
},
"quantityInfo": {
"maxPermitted": 2,
"minPermitted": 0
},
"tags": [],
"gtInternalId": "69aebb78f3a91d1985b42f4b"
}
],
"name": {
"translations": {
"el-gr": "Nested Menu",
"en-us": "Nested Menu",
"ar-ae": "Nested Menu",
"en-gb": "Nested Menu",
"es": "Nested Menu"
}
},
"storeIds": [
"4c7fca1f-9c1d-40d0-8d93-cebd560694a5"
],
"tags": []
}Order Flow Changes
With the introduction of nested modifiers, the order payload structure has been updated to support multi-level modifier selections.
Nested Modifier Representation in Orders
A new modifiers array will now be supported within the existing modifier object. This enables the order payload to represent modifier selections that contain additional nested options.
The nested modifier object will follow the same structure as the existing modifier object, ensuring consistency and backward compatibility with the current order schema.
{
"id": "sl54bid9de7klbz2",
"displayId": "sl54bid9de7klbz2",
"type": "DELIVERY_BY_FOOD_AGGREGATOR",
"storeId": "4c7fca1f-9c1d-40d0-8d93-cebd560694a5",
"instructions": "Pleaseput",
"delivery": {
"receiverName": "JohnDoe",
"receiverMobileNumber": "+9477123456",
"location": {
"address": "1006BEmirattesHills,Dubai",
"latitude": "55.1599898",
"longitude": "25.0616772"
},
"notes": "PleasedeliverASAP",
"pickupTime": "2025-01-08T04:47:47.717Z"
},
"customer": {
"name": "JohnDoe",
"contactNumber": "+97177123456",
"email": "[email protected]"
},
"items": [
{
"id": "69aebcf29d5a123ea34fd945",
"quantity": 1,
"price": {
"unitPrice": {
"amount": 3500,
"currencyCode": "AED",
"formattedAmount": "AED35.0"
},
"totalPrice": {
"amount": 4000,
"currencyCode": "AED",
"formattedAmount": "AED40.0"
},
"discountAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"taxAmount": {
"amount": 191,
"currencyCode": "AED",
"formattedAmount": "AED1.91"
}
},
"modifiers": [
{
"id": "69aebcf29d5a123ea34fd946",
"quantity": 1,
"price": {
"unitPrice": {
"amount": 500,
"currencyCode": "AED",
"formattedAmount": "AED5.0"
},
"totalPrice": {
"amount": 500,
"currencyCode": "AED",
"formattedAmount": "AED5.0"
},
"discountAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"taxAmount": {
"amount": 24,
"currencyCode": "AED",
"formattedAmount": "AED0.24"
}
},
"modifiers": [
{
"id": "69aebcf29d5a123ea34fd947",
"quantity": 1,
"price": {
"unitPrice": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"totalPrice": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"discountAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"taxAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
}
},
"modifiers": []
},
{
"id": "69aebcf29d5a123ea34fd948",
"quantity": 1,
"price": {
"unitPrice": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"totalPrice": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"discountAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
},
"taxAmount": {
"amount": 0,
"currencyCode": "AED",
"formattedAmount": "AED0.0"
}
},
"modifiers": []
}
]
}
]
}
],
"payment": {
"status": "PREPAID",
"method": "CARD",
"charges": {
"subTotal": {
"amount": 4000,
"currencyCode": "AED",
"formattedAmount": "AED40.0"
},
"tax": {
"amount": 191,
"currencyCode": "AED",
"formattedAmount": "AED1.91"
},
"deliveryFee": {
"amount": 600,
"currencyCode": "AED",
"formattedAmount": "AED6.0"
},
"total": {
"amount": 4600,
"currencyCode": "AED",
"formattedAmount": "AED46.0"
}
},
"discounts": [],
"tax": [
{
"amount": {
"amount": 191,
"currencyCode": "AED",
"formattedAmount": "AED1.91"
},
"name": "VAT"
}
],
"settlements": [
{
"method": "CARD",
"amount": {
"amount": 4600,
"currencyCode": "AED",
"formattedAmount": "AED46.0"
},
"notes": ""
}
],
"loyaltyPoints": {
"system": "SIMPLEX_LOYALTY",
"points": "0",
"notes": ""
}
},
"scheduledOrder": null,
"status": "Created",
"placedAt": "2025-01-08T04:17:47.716Z"
}