Order Messages
Message customers and drivers about an order from the Storefront console, live, with quick replies for orders and bookings, and handle wrong-address requests — plus the order chat API for customer apps.
Order Messages
A customer has two conversations about an order: one with the store and one with the driver. The store also has its own thread with the driver, which the customer never sees. The console shows all three:
| Console tab | Between | Who writes | The customer sees it as |
|---|---|---|---|
Customer name (kind=customer) | The customer and the store's staff | Both. Open from the moment the order is placed, before a driver is assigned. | Their chat with the store (Message the store) |
All three (kind=driver) | The customer and the assigned driver, with the store's staff | All three. It starts once a driver is assigned. | Their chat with the driver |
Driver name (driver) (kind=dispatch) | The store's staff and the driver | Both, once a driver is assigned. It is the driver app's Message dispatch. | Not at all |
A message written in the customer's tab reaches the customer in their chat with the store; one written by the driver from the driver app goes to the customer and driver thread, which the console shows as All three. Every thread stays readable after the order is completed, canceled or expired, but no new messages can be sent.
Messaging from the console
Message in the order panel's header opens the messages drawer beside the panel, on the customer's tab. The button and each tab show how many messages the store hasn't read; for a booking the button is just the icon and the count.
Pick the tab, then type in the box or pick one of the quick replies under it.
Click Send. The customer gets the message as a push notification and in the app's order chat; the driver gets theirs in the driver app.
A thread starts with its first message. Staff who write in it join the conversation and are notified of replies. Each message shows who sent it — Customer, Driver, Store, or Update for system messages such as a wrong-address request — and in All three the sender's name.
Live updates
Messages arrive while the panel is open, over the realtime socket; nothing needs refreshing. A message in the thread the drawer shows appears in it and is marked read. A message in another thread, or with the drawer closed, adds to the unread counts, shows New message from …, and updates the customer's latest message on the customer card. The panel also picks up a thread the customer starts while it is open.
Opening a thread marks it read for the store, whichever staff member reads it. Messages you sent yourself are never unread to you, including those you send from the driver app when you are also the driver.
Quick replies
The replies offered depend on the order and the thread:
| Order | Writing to the customer (and in All three) | Writing to the driver |
|---|---|---|
| Delivery or pickup order | Your order is being prepared. · Your driver is on the way. · We are running about 10 minutes late, sorry. · Can you confirm the delivery address? | The order is ready for pickup. · The drop-off address changed, please check the app. · Please call the customer on arrival. · How long until you reach the store? |
| Booking at the customer's address | Your booking is confirmed. · Your provider is on the way. · We are running about 10 minutes late, sorry. · Can you confirm the address and how to get in? | The booking is confirmed, please head to the customer. · The booking time changed, please check the app. · Please call the customer on arrival. · How long until you reach the customer? |
| Booking at the store | Your booking is confirmed. · We are ready for you. · We are running about 10 minutes behind, sorry. · Would you like to change your time? | As for a booking at the customer's address |
To use your own replies to customers, open Storefront → Settings → Order messages and write one reply per line in Quick replies for orders and Quick replies for bookings, then Save settings. Each box shows the defaults until you type; leaving one empty keeps them. A booking never uses the order replies: without its own it gets the booking defaults. The replies to the driver are fixed.
The replies are stored on the store as options.quick_replies and options.booking_quick_replies, lists of strings.
Wrong-address requests
A customer who notices that the delivery address is wrong can tell the store from the app, with a message and optionally one of their saved places. The store then sees:
- an alert at the top of the order panel, The customer says the address is wrong, with the message and the suggested address;
- the request in its thread with the customer, as The address is wrong. … New address: ….
From the alert, Update address opens the edit form at the delivery address; saving a new address closes the request (resolved). Dismiss closes it without changing anything (dismissed).
Pickup orders and finished orders can't receive a wrong-address request.
Order chat API
Customer apps use these endpoints with the storefront key and the customer's Customer-Token. kind is driver (the default) or customer, sent in the query string or, on POST, in the body:
| Endpoint | Purpose |
|---|---|
GET /storefront/v1/orders/{id}/chat?kind=customer | The thread with its participants and latest 50 messages. Starts the thread on first use. |
GET /storefront/v1/orders/{id}/chat/messages?kind=customer | Older messages: before (a message id) and limit (up to 100) |
POST /storefront/v1/orders/{id}/chat/messages | Send { "kind": "customer", "content": "…" }; content up to 2,000 characters. Up to four photos can be sent as files: [{ data, type }] with an image/* type. |
POST /storefront/v1/orders/{id}/chat/read | Mark the thread read for the customer: { "kind": "customer" } |
The thread looks like this:
{
"id": "chat_channel_5Tk1pQ8",
"channel": "chat.chat_channel_5Tk1pQ8",
"order": "order_9Kx2mQ1",
"kind": "customer",
"status": "open",
"me": "chat_participant_2Ab7cD3",
"participants": [
{ "id": "chat_participant_2Ab7cD3", "role": "customer", "name": "Ada Lovelace", "avatar_url": null, "is_online": true },
{ "id": "chat_participant_8Ef4gH1", "role": "store", "name": "Sam (Acme Market)", "avatar_url": null, "is_online": false }
],
"messages": [
{
"id": "chat_message_1Xy2zA9",
"content": "Your order is being prepared.",
"sender": { "id": "chat_participant_8Ef4gH1", "role": "store", "name": "Sam (Acme Market)" },
"is_mine": false,
"system": false,
"kind": null,
"attachments": [],
"read": true,
"created_at": "2026-10-13T12:01:00.000000Z"
}
],
"unread_count": 1
}roleiscustomer,driver,storeorsystem. Treat an unknown role asdriver.systemmessages (for examplekind: "address_change_requested") are notices rather than something a person typed; show them as such.- Subscribe to
channelover the realtime socket to receive new messages.
| Status | reason | Meaning |
|---|---|---|
409 | driver_not_assigned | kind=driver before a driver is assigned |
409 | chat_unavailable | kind=customer but the thread can't be opened |
423 | chat_closed | Sending after the order finished |
Roles and system messages need core-api v1.6.69, which adds meta to chat participants and messages (see Chat).
Sending a wrong-address request
POST /storefront/v1/orders/{id}/address-change-request
Authorization: Bearer store_your_store_key
Customer-Token: 1|VlKK7lZ...
{ "message": "It's 12 King St, not 21", "place": "place_9Qs1tY6" }Both fields are optional: message (up to 1,000 characters) and place, one of the customer's own saved places. The response is { "status": "ok", "address_change_request": { … } }, and the order's meta.address_change_request holds status (open, resolved or dismissed), message, place, address and at. The request is refused with 422 for pickup orders and finished orders, and 404 when the place isn't one of the customer's.
In the Storefront app
The Storefront App adds Message the store next to the driver chat, with an unread badge, and a Wrong address? action on deliveries that haven't been dispatched yet.
Editing Orders
Change a placed Storefront order — its items, delivery address, contact, time and notes — re-price it, settle the difference and tell the customer and the driver.
Payment Status
How Storefront tracks what was paid, refunded, credited and still due on an order — the meta.payment summary, cash on delivery, refunds, store credit and payment links.