Place order for Drive Thru

This guide shows you how to let a customer place a Drive Thru order. They order ahead in the app, then collect at the drive-thru window without leaving the car — when they arrive they give the store their order number. See Order Types for the full list, and Drive Thru Order Workflow for how it works operationally.

Before proceeding, you should have implemented:

How the flow works

Drive Thru uses order type 12 and is built through the cart — Server Side Cart covers those calls. It behaves like Takeout: the customer picks a collection time, and the order is prepared for it.

Unlike Curbside, there is no vehicle to register and nothing to tell the store on arrival — the customer simply drives up and quotes their order number. That makes the order number the most important thing on your order confirmation screen, so show it prominently and keep it visible until the order is complete.

Tell the cart this is a Drive Thru order

Set metadata.order_type.id to 12 and say when the customer will arrive, with either pickup_asap: true or pickup_at formatted Y-m-d H:i:s in the venue's timezone.

A customer_phone_number is optional here, but useful — it gives the store a way to reach the customer if there is a problem with the order before they arrive.

Request

{
  "method": "put",
  "url": "https://api-public-demo.menu.app/api/cart/{cart_id}",
  "headers": {
    "X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
    "Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
    "Api-Version": "4.78.0",
    "Content-Type": "application/json"
  },
  "body": {
    "metadata": {
      "venue_id": "a9d6d0c8-1689-4114-b1ec-6da9c33f0384",
      "order_type": {
        "id": 12,
        "pickup_asap": true,
        "customer_phone_number": "+13125550143"
      }
    },
    "cart": {
      "products": [
        {
          "price_id": "9a4e25be-9c32-4b69-81b7-19a4f3595406",
          "quantity": 1,
          "comment": "",
          "product_groups": []
        }
      ],
      "discounts": [],
      "tip": {
        "amount": 0,
        "type": 1
      }
    }
  }
}

Offer the customer a pickup time

Present the slots the store can honor rather than a free-text time. Orders Filtered Pickup Times returns them, and also tells you which slots are already full. It takes a nested order_type.id and a singular_point_id rather than a venue_id — see Choosing a pickup or delivery time.

These endpoints take a singular_point_id, not a venue_id — see Choosing a pickup or delivery time.

Fetch them at the moment the customer chooses, not when they open the menu. pickup_asap is rejected outside serving hours, so handle that too.

Check out, pay and place the order

Common to all order types — see Server Side Cart.

What can go wrong

The pickup time is no longer available — HTTP 400, code 2001, with the rejected time in info_message.title. Re-fetch the times, let the customer choose again, update the cart and retry checkout.

Ordering is paused for the store — code 2003.

Drive Thru is not enabled for the store — code 2025. Check the venue's order_types before offering it.

Follow the order with order status webhooks so you can show the customer when it is ready to collect. Order Statuses lists the values.