${ picker.title } ${ picker.selectedGroup && picker.selectedGroup.groupName }
Out of Stock
🍽
${ group.groupName }
from KES ${ formatCurrency(group.minPrice) }
KES ${ formatCurrency(group.items[0].price) }
${ group.items.length } options
Some options unavailable
${ variantLabel(item) }
🌿 Plant-based
Out of Stock
Add Customization — Meal ${ custModal.slotIdx + 1 }
Select customization type *
Note (optional)
${ custModal.error }
${ foodGroupModal.groupName }
${ variantLabel(item) }
KES ${ formatCurrency(item.price) }
🌿 Plant-based
Out of Stock
${ foodGroupModal.quantities[item.id] || 0 }
Your Order
Your cart is empty
${ item.name }
${ item.qty }
KES ${ formatCurrency(item.unit_price * item.qty) }
No meals added yet
Meal ${ idx + 1 }
🥩 ${ foodById(slot.protein_id).name }
KES ${ formatCurrency(foodById(slot.protein_id).price) }
🍚 ${ foodById(slot.carb_id).name }
KES ${ formatCurrency(foodById(slot.carb_id).price) }
🥦 ${ foodById(slot.veggie_id).name }
KES ${ formatCurrency(foodById(slot.veggie_id).price) }
🥫 ${ foodById(slot.sauce_id).name }
KES ${ formatCurrency(foodById(slot.sauce_id).price) }
Food subtotalKES ${ formatCurrency(foodSubtotal) }
Volume discount (${ volumeDiscountPct }%)
−KES ${ formatCurrency(volumeDiscountAmount) }
Cooking oilKES ${ formatCurrency(oilCost) }
CustomizationKES ${ formatCurrency(customizationFees) }
DeliveryKES ${ formatCurrency(deliveryFee) }
TotalKES ${ formatCurrency(grandTotal) }
Minimum order is KES 3,000. Add KES ${ formatCurrency(amountToMinimum) } more.
Loading menu…
${ cat.name }
Out of Stock
${ groupCartSummary(group).count }
🍽
${ group.groupName }
from KES ${ formatCurrency(group.minPrice) }
KES ${ formatCurrency(group.items[0].price) }
${ group.items.length } options
Some options unavailable
${ groupCartSummary(group).count } × · KES ${ formatCurrency(groupCartSummary(group).total) }
Out of Stock
${ groupCartSummary(group).count }
🍽
${ group.groupName }
from KES ${ formatCurrency(group.minPrice) }
KES ${ formatCurrency(group.items[0].price) }
${ group.items.length } options
Some options unavailable
${ groupCartSummary(group).count } × · KES ${ formatCurrency(groupCartSummary(group).total) }
How many meals?
${ mealCount }
🎉 ${ volumeDiscountPct }% volume discount!
Meal ${ idx + 1 }
KES ${ formatCurrency(slotTotal(slot)) }
Protein *
${ foodById(slot.protein_id).name }
Select protein
Carb
${ foodById(slot.carb_id).name }
Optional
Veggie
${ foodById(slot.veggie_id).name }
Optional
Sauce/Extra
${ foodById(slot.sauce_id).name }
Optional
${ cust.fee_type_name }
— ${ cust.note }
+KES ${ formatCurrency(cust.fee) }
Add Extras (optional)
Out of Stock
${ cartQty(item.id) }
🍿
${ item.name }
KES ${ formatCurrency(item.price) }
Cooking Oil
${ oil.name }
KES ${ formatCurrency(oilCost) }
1. Menu
2. Delivery
3. Payment
Your Details & Delivery
Use local format e.g. 0712 345 678 — not +254…
Pick a delivery day to continue.
Checking zone…
✓ In delivery zone
Outside delivery zone
Select from the dropdown — typing alone won't confirm your location.
Add your door or apartment number so our rider finds you easily.
Free delivery on your first order!
Welcome to Vyakula BYOMB
1. Menu
2. Delivery
3. Payment
Order Summary
Food subtotalKES ${ formatCurrency(foodSubtotal) }
Volume discount (${ volumeDiscountPct }%)
−KES ${ formatCurrency(volumeDiscountAmount) }
Cooking oilKES ${ formatCurrency(oilCost) }
CustomizationKES ${ formatCurrency(customizationFees) }
DeliveryKES ${ formatCurrency(deliveryFee) }
TotalKES ${ formatCurrency(grandTotal) }
Pre-filled from your order. Change if you want the prompt on a different number.
M-Pesa prompt sent!
Check ${ stkPhone } and enter your PIN
Or pay manually via Paybill
Paybill: ${ paybillNumber }
Account: ${ sessionShortId }
KES ${ formatCurrency(grandTotal) }
Your order is saved — share this link to resume later
${ toast.message }