WhatsApp API
Food Delivery Templates

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.

Try this with AI Copilot
Help me design WhatsApp templates for a food delivery business using SMSLeopard
Ask AI →

The Customer Journey

Start by mapping each business event to the message the customer needs at that moment.

EventTemplate to sendCustomer action
Order is createdOrder confirmationTrack order or contact support
Payment is requiredPayment requestPay now or ask for help
Rider is assignedRider updateKnow who is delivering
Order is out for deliveryDelivery updateTrack delivery
Order is deliveredFeedback requestRate the experience
Customer has not ordered recentlyReorder offerOrder again or view menu
Customer is browsing mealsMenu carouselCompare 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 sourceUseful fields
Website or app checkoutCustomer name, phone number, order number, cart items, address area
Payment platformAmount due, payment status, receipt number, payment link token
Delivery systemRider name, delivery status, ETA, tracking token
Customer profilePreferred branch, favourite meal, dietary preference, preferred channel
Survey feedbackRating, 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

FieldExample
Template namefood_order_confirmed
CategoryUtility
HeaderOrder confirmed
BodyHi {{1}}, your {{2}} order {{3}} has been received. Total: {{4}}. We expect delivery to {{5}} by {{6}}.
FooterThank you for ordering with {{7}}.
ButtonsTrack order, Contact support

Variable map

VariableValue
{{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

FieldExample
Template namefood_payment_request
CategoryUtility
HeaderPayment required
BodyHi {{1}}, complete payment of {{2}} for order {{3}}. We will start preparing your order once payment is confirmed.
FooterIgnore this if you have already paid.
ButtonsPay now, Talk to support

Variable map

VariableValue
{{1}}Customer first name
{{2}}Amount due
{{3}}Order number

3. Rider Assigned

FieldExample
Template namefood_rider_assigned
CategoryUtility
HeaderRider assigned
BodyHi {{1}}, {{2}} is preparing to deliver order {{3}}. Current ETA: {{4}}.
FooterYou will receive another update when the order is on the way.
ButtonsTrack order, Contact support

Variable map

VariableValue
{{1}}Customer first name
{{2}}Rider name
{{3}}Order number
{{4}}Estimated delivery time

4. Out For Delivery

FieldExample
Template namefood_out_for_delivery
CategoryUtility
HeaderYour order is on the way
BodyHi {{1}}, your order {{2}} is out for delivery. ETA: {{3}}. Delivery area: {{4}}.
FooterPlease keep your phone nearby.
ButtonsTrack delivery, Contact support

Variable map

VariableValue
{{1}}Customer first name
{{2}}Order number
{{3}}Estimated delivery time
{{4}}Delivery area

5. Delivery Feedback

FieldExample
Template namefood_delivery_feedback
CategoryUtility
HeaderHow was your order?
BodyHi {{1}}, your {{2}} order {{3}} has been delivered. How was the food, packaging, and delivery experience?
FooterYour feedback helps us improve.
ButtonsRate delivery, Report issue

Variable map

VariableValue
{{1}}Customer first name
{{2}}Restaurant or store name
{{3}}Order number

6. Reorder Offer

FieldExample
Template namefood_reorder_offer
CategoryMarketing
HeaderImage of the meal or offer
BodyHi {{1}}, your favourite {{2}} is available today. Order again from {{3}} and get {{4}} off before {{5}}.
FooterReply STOP to opt out of marketing messages.
ButtonsOrder again, View menu

Variable map

VariableValue
{{1}}Customer first name
{{2}}Favourite meal
{{3}}Preferred branch
{{4}}Discount or offer
{{5}}Offer expiry time

7. Menu Or Product Carousel

FieldExample
Template namefood_menu_carousel
CategoryMarketing
HeaderToday's picks for {{1}}
BodyHi {{1}}, here are popular meals available from {{2}} today. Choose an option and complete your order.
CardsMeal image, meal name, price, short description
ButtonsOrder now, View menu

Example cards

CardProductButton action
1Chicken shawarma comboOrder now
2Grilled lunch bowlOrder now
3Veggie pizza offerOrder 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 as your 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 signalHow to use it
Favourite mealSend more relevant reorder offers
Preferred branchRoute offers and support to the right location
Average order valueSegment customers by value and buying behaviour
Last order dateWin back customers who have gone quiet
Delivery ratingFollow up with unhappy customers before they churn
Preferred channelUse WhatsApp, SMS, or survey follow-up more intelligently

Related Guides