WhatsApp Food Delivery Templates
Use this example as a practical template pack for an online food delivery business. The same pattern works for groceries, ecommerce, pharmacy delivery, laundry, courier, and other order-based workflows.
The Customer Journey
Start by mapping each business event to the message the customer needs at that moment.
| Event | Template to send | Customer action |
|---|---|---|
| Order is created | Order confirmation | Track order or contact support |
| Payment is required | Payment request | Pay now or ask for help |
| Rider is assigned | Rider update | Know who is delivering |
| Order is out for delivery | Delivery update | Track delivery |
| Order is delivered | Feedback request | Rate the experience |
| Customer has not ordered recently | Reorder offer | Order again or view menu |
| Customer is browsing meals | Menu carousel | Compare items and choose what to order |
Customer Data To Sync First
The best templates are powered by customer and order data, not manually typed messages.
| Data source | Useful fields |
|---|---|
| Website or app checkout | Customer name, phone number, order number, cart items, address area |
| Payment platform | Amount due, payment status, receipt number, payment link token |
| Delivery system | Rider name, delivery status, ETA, tracking token |
| Customer profile | Preferred branch, favourite meal, dietary preference, preferred channel |
| Survey feedback | Rating, complaint reason, packaging score, delivery score |
Sync this data into SMSLeopard customer profiles, then use it to fill WhatsApp template variables, segment customers, and trigger follow-up messages.
Template Pack
These are realistic template structures your business can adapt and submit for WhatsApp approval.
1. Order Confirmation
| Field | Example |
|---|---|
| Template name | food_order_confirmed |
| Category | Utility |
| Header | Order confirmed |
| Body | Hi {{1}}, your {{2}} order {{3}} has been received. Total: {{4}}. We expect delivery to {{5}} by {{6}}. |
| Footer | Thank you for ordering with {{7}}. |
| Buttons | Track order, Contact support |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Restaurant or store name |
{{3}} | Order number |
{{4}} | Order total |
{{5}} | Delivery area |
{{6}} | Estimated delivery time |
{{7}} | Business name |
2. Payment Request
| Field | Example |
|---|---|
| Template name | food_payment_request |
| Category | Utility |
| Header | Payment required |
| Body | Hi {{1}}, complete payment of {{2}} for order {{3}}. We will start preparing your order once payment is confirmed. |
| Footer | Ignore this if you have already paid. |
| Buttons | Pay now, Talk to support |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Amount due |
{{3}} | Order number |
3. Rider Assigned
| Field | Example |
|---|---|
| Template name | food_rider_assigned |
| Category | Utility |
| Header | Rider assigned |
| Body | Hi {{1}}, {{2}} is preparing to deliver order {{3}}. Current ETA: {{4}}. |
| Footer | You will receive another update when the order is on the way. |
| Buttons | Track order, Contact support |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Rider name |
{{3}} | Order number |
{{4}} | Estimated delivery time |
4. Out For Delivery
| Field | Example |
|---|---|
| Template name | food_out_for_delivery |
| Category | Utility |
| Header | Your order is on the way |
| Body | Hi {{1}}, your order {{2}} is out for delivery. ETA: {{3}}. Delivery area: {{4}}. |
| Footer | Please keep your phone nearby. |
| Buttons | Track delivery, Contact support |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Order number |
{{3}} | Estimated delivery time |
{{4}} | Delivery area |
5. Delivery Feedback
| Field | Example |
|---|---|
| Template name | food_delivery_feedback |
| Category | Utility |
| Header | How was your order? |
| Body | Hi {{1}}, your {{2}} order {{3}} has been delivered. How was the food, packaging, and delivery experience? |
| Footer | Your feedback helps us improve. |
| Buttons | Rate delivery, Report issue |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Restaurant or store name |
{{3}} | Order number |
6. Reorder Offer
| Field | Example |
|---|---|
| Template name | food_reorder_offer |
| Category | Marketing |
| Header | Image of the meal or offer |
| Body | Hi {{1}}, your favourite {{2}} is available today. Order again from {{3}} and get {{4}} off before {{5}}. |
| Footer | Reply STOP to opt out of marketing messages. |
| Buttons | Order again, View menu |
Variable map
| Variable | Value |
|---|---|
{{1}} | Customer first name |
{{2}} | Favourite meal |
{{3}} | Preferred branch |
{{4}} | Discount or offer |
{{5}} | Offer expiry time |
7. Menu Or Product Carousel
| Field | Example |
|---|---|
| Template name | food_menu_carousel |
| Category | Marketing |
| Header | Today's picks for {{1}} |
| Body | Hi {{1}}, here are popular meals available from {{2}} today. Choose an option and complete your order. |
| Cards | Meal image, meal name, price, short description |
| Buttons | Order now, View menu |
Example cards
| Card | Product | Button action |
|---|---|---|
| 1 | Chicken shawarma combo | Order now |
| 2 | Grilled lunch bowl | Order now |
| 3 | Veggie pizza offer | Order now |
WhatsApp carousel availability depends on your WhatsApp Business setup, approved templates, catalog configuration, and account eligibility. Use Product Carousels as the starting point when you want to showcase several products in one message.
Promotional and reorder templates should be sent only to customers who have opted in to receive marketing messages. Keep utility templates focused on the transaction the customer expects.
Template Approval Checklist
Before submitting templates for approval:
- Keep one template focused on one business event.
- Use the right category: Authentication, Utility, or Marketing.
- Make variable placeholders easy to understand from the surrounding text.
- Avoid vague variables such as
{{1}} has changed; use clear context such asyour order {{1}} is out for delivery. - Use buttons for the next best action, not for every possible action.
- For dynamic URL buttons, configure the base URL in the template and send only the dynamic value at send time.
- Keep promotional messages separate from transactional updates.
Example Send Request
After the food_order_confirmed template is approved, fetch its template ID and send it when an order
is created.
{
"destination": "254720000000",
"template_id": "FOOD_ORDER_CONFIRMED_TEMPLATE_ID",
"phone_number_id": "46646XXXXXXX268",
"component_list": {
"components": [
{
"component_type": "BODY",
"fields": [
{ "name": "1", "value": "Amina" },
{ "name": "2", "value": "Soko Bistro" },
{ "name": "3", "value": "FD-10482" },
{ "name": "4", "value": "KES 1,240" },
{ "name": "5", "value": "Westlands" },
{ "name": "6", "value": "1:35 PM" },
{ "name": "7", "value": "Soko Bistro" }
]
},
{
"component_type": "BUTTONS",
"fields": [
{ "name": "button:0", "value": "FD-10482" }
]
}
]
}
}For a dynamic URL button, send only the dynamic value required by the approved template. For example,
if the approved button is Track order, your template can use an order-tracking placeholder and your
API request can send the order number or tracking token.
Trigger The Templates From Your Workflow
const templates = {
orderConfirmed: "FOOD_ORDER_CONFIRMED_TEMPLATE_ID",
paymentRequest: "FOOD_PAYMENT_REQUEST_TEMPLATE_ID",
riderAssigned: "FOOD_RIDER_ASSIGNED_TEMPLATE_ID",
outForDelivery: "FOOD_OUT_FOR_DELIVERY_TEMPLATE_ID",
deliveryFeedback: "FOOD_DELIVERY_FEEDBACK_TEMPLATE_ID",
reorderOffer: "FOOD_REORDER_OFFER_TEMPLATE_ID",
};
async function sendWhatsAppTemplate({ destination, templateId, phoneNumberId, bodyFields, buttonFields = [] }) {
const components = [
{
component_type: "BODY",
fields: bodyFields.map((value, index) => ({
name: String(index + 1),
value,
})),
},
];
if (buttonFields.length > 0) {
components.push({
component_type: "BUTTONS",
fields: buttonFields,
});
}
const response = await fetch("https://whatsapp.smsleopard.com/v1/whatsapp/send", {
method: "POST",
headers: {
Authorization: `Basic ${btoa(`${process.env.SMSLEOPARD_API_KEY}:${process.env.SMSLEOPARD_API_SECRET}`)}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
destination,
template_id: templateId,
phone_number_id: phoneNumberId,
component_list: { components },
}),
});
if (!response.ok) {
throw new Error(`WhatsApp send failed: ${response.status}`);
}
return response.json();
}
async function onOrderCreated(order) {
return sendWhatsAppTemplate({
destination: order.customer.phone,
templateId: templates.orderConfirmed,
phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID,
bodyFields: [
order.customer.firstName,
order.store.name,
order.number,
order.totalFormatted,
order.deliveryArea,
order.etaFormatted,
order.store.name,
],
buttonFields: [{ name: "button:0", value: order.trackingToken }],
});
}Add Customer Profile Intelligence
Once the workflow is running, use the same data to improve future messaging.
| Profile signal | How to use it |
|---|---|
| Favourite meal | Send more relevant reorder offers |
| Preferred branch | Route offers and support to the right location |
| Average order value | Segment customers by value and buying behaviour |
| Last order date | Win back customers who have gone quiet |
| Delivery rating | Follow up with unhappy customers before they churn |
| Preferred channel | Use WhatsApp, SMS, or survey follow-up more intelligently |