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.
Editing Orders
A placed order can still change: the customer calls to add an item, an item turns out to be unavailable, the address is wrong. Click Edit in the order panel (or the action on an alert) to open the edit form. Editing needs the storefront update order permission.
The form has five sections, each marked Changed once you touch it:
| Section | What you can do |
|---|---|
| Delivery address | Pick one of the customer's saved places or another address, or create a new one. Not shown for pickup orders. |
| Customer | Change the name, phone or email, either for this order only (a gift or another recipient; the profile stays as it is) or on the customer's profile, used for this and future orders. |
| Items | Change quantities, remove a line (with Undo), or Add products with their variants and addons. |
| When | As soon as possible, or a scheduled date and time. |
| Notes | The order's notes. |
As you change things the form prices the edit, shows the old and new totals, and says how the difference will be settled. Click Save changes to apply it or Discard to leave the order as it was.
What can change at each status
How far the order has gone decides what can still change. The form says which rule applies and blocks changes it doesn't allow:
| Stage | Order statuses | What can change |
|---|---|---|
| Open | created, pending, accepted, confirmed, preparing | Everything. Item changes made while the order is preparing are flagged to the store. |
| Ready | ready, pickup_ready | Address, contact and notes. Items can only be removed or reduced, and the time can only move earlier. |
| With the driver | Any status after ready | Address (the driver is rerouted and told), contact and notes. Items and time are locked. |
| Finished | completed, picked_up, canceled, expired, failed | Nothing. |
An order needs at least one item; to remove everything, cancel the order instead.
Fleet-Ops applies the same stages to edits made through its own API and console — see Order Changes.
How the edit is priced
Only item and address changes re-price the order; contact, time and note changes keep its prices.
- Items are priced the way checkout prices them, from the product's current price, variants and addons. Lines you didn't touch keep the price they were sold at.
- Promotions are evaluated again on the new items, without counting this order's own use against the promotion's limits. A promotion that no longer applies is released.
- A new address gets a new delivery quote from the store's delivery rates. When no rate covers the new address, the delivery fee stays as it was and the form warns you.
- Percentage tips follow the new subtotal; fixed tips stay the same.
If a product on the order is no longer sold by the store, the edit is refused until that line is removed or replaced.
Settling the difference
When the new total differs from the old one, the form proposes how to settle it. Where there is a choice, pick it before saving:
| Situation | Default | Alternative |
|---|---|---|
| Total goes down, paid by card through Stripe | Refund the difference to the card | Store credit |
| Total goes down, paid through QPay | Refund only when the whole remaining payment goes back (QPay refunds whole payments); otherwise store credit | — |
| Total goes down, any other online method | Store credit | — |
| Total goes up, paid online | Payment link: a Stripe Payment Link or a QPay invoice for the balance, sent to the customer | Driver collects the balance in cash on delivery |
| Cash on delivery, not yet collected | Update cash to collect by the difference, up or down | — |
The money moves first. If the gateway refuses a refund or a link can't be created, the edit fails with the gateway's message and the order stays as it was. A link that the gateway can't issue leaves the balance due on the order, shown as an alert in the panel.
A balance paid through the link is recorded as paid by itself: QPay calls Storefront back when its invoice is paid, Stripe Payment Links are checked every five minutes (storefront:check-balance-payments), and Check payment on the order's alert checks right away. The payment is always confirmed with the gateway, the link is closed, and the customer gets the order_balance_paid receipt. A balance the driver collects is recorded as paid when the order is completed.
Every refund, credit, extra charge and cash change is recorded on the order and as a transaction; see Payment Status.
Telling the customer and the driver
Two checkboxes above Save changes decide who is told:
- Tell customer name what changed sends the customer the
order_updatednotification: a summary of the change (for example Fries 1→2 · Drop-off changed to 12 King St) and what it means for their money — the refund, the store credit code to use next time, or the balance to pay with its link. - Tell the driver (shown when a driver is assigned) pushes the change to the driver's Navigator app when it concerns them: the route, items, schedule, notes or cash to collect. This needs Fleet-Ops v0.6.72.
Either way, the edit is broadcast as an order.changed event, which the Storefront app uses to show an Order updated notice and Navigator v3 uses to show This order changed. See Order Changes.
Prices that moved while you were editing
Saving sends the total the form showed. If prices or promotions changed between the preview and the save, the server refuses the edit with the new total instead of charging an amount you didn't see. Review the new total and save again.
What else an edit does
- Items added or removed take or return stock for products that track it.
- A new address closes an open wrong-address request.
- The edit is recorded in the order's activity with who made it, what changed and the price difference.
Internal API
Custom merchant terminals can use the same endpoints as the console, authenticated as a Fleetbase user:
| Endpoint | Purpose |
|---|---|
POST /storefront/int/v1/orders/{id}/edit/preview | Price an edit without applying it: proposed totals, difference, settlement options, changes, the stage's locks, violations and warnings |
PATCH /storefront/int/v1/orders/{id}/edit | Apply the edit |
Both take the same body; send only the parts that change:
{
"items": [
{ "entity": "entity_8Kd2mQ1", "quantity": 2 },
{ "product": "product_4Hx9zL2", "quantity": 1, "variants": [], "addons": [], "note": "No onions" },
{ "product": "product_7Pq3wN5", "quantity": 1, "substitutes": "entity_2Lm8vR4" }
],
"dropoff": { "place": "place_9Qs1tY6" },
"contact": { "phone": "+15555550123", "scope": "order" },
"scheduled_at": "2026-10-14T18:30:00Z",
"notes": "Ring twice",
"settlement": "store_credit",
"notify_customer": true,
"notify_driver": true,
"confirm_total": 2650
}itemsis the full list: existing lines byentity, new lines byproduct; lines left out are removed.substitutesnames the line a new product replaces.dropoffis a saved place (place) or address fields (street1,city,postal_code,location, …); addsave_place_to_customer: trueto keep a new address on the customer.contact.scopeisorder(default) orprofile.settlementis one ofrefund,store_credit,payment_link,collectorcod_update; when it's left out or not offered for this order, the default from the table above is used.confirm_totalis optional. When it doesn't match the new total the edit is refused with409and the proposed totals.
Applying a change the order's stage doesn't allow is refused with 422 and violations per field; an edit that changes nothing is refused with 422 as well.