For Uber's review
How we use Uber Direct
Restaurants on Clover get their own ordering site, embeddable on any website. Every delivery is an Uber Direct courier, booked the moment the order is paid and timed to the kitchen.
Every call, in order
- 01
POST /delivery_quotes
As the customer types their address
Pickup and dropoff addresses, phone numbers, manifest_total_value, external_store_id and a pickup window timed to the kitchen's prep time. The fee is shown to the customer before they pay. Out-of-range addresses get “Delivery isn't available, try pickup”.
- 02
Clover: create order, pay, print
When the customer taps Place order
We re-quote on the server so the fee charged matches Uber's, take payment through Clover, and print the ticket in the kitchen. A declined card never books a courier.
- 03
POST /deliveries
Right after payment
quote_id, idempotency_key = our order number, external_id, external_store_id, itemized manifest_items (name with options, quantity, size, price), E.164 phones, pickup and dropoff notes (≤ 280 chars), tip passed 100% to the courier, dropoff_verification.picture, the customer's deliverable_action, and undeliverable_action: leave_at_door.
- 04
Webhooks: delivery_status, courier_update, refund_request
Throughout the delivery
Verified with HMAC-SHA256 (x-uber-signature). Statuses only move an order forward, events from a replaced courier are logged but never applied, unknown deliveries get 200, and storage failures get 500 so Uber retries.
- 05
GET /deliveries/{id}
Customer tracking page and kitchen screen
Courier name, photo, vehicle and live location on a map, ETAs, the courier_imminent flag (“arriving now”), the proof-of-delivery photo, and Uber's tracking_url.
- 06
POST /deliveries/{id}/cancel
Kitchen taps Cancel courier (e.g. food is running late)
Because pickup times can't be changed after booking, the kitchen cancels and then taps Book courier now, which creates a new delivery with a new idempotency key.
- 07
POST /v1/direct/organizations
When a restaurant connects its Clover account
Each restaurant gets its own sub-organization under our root account, and its organization_id is the customer_id for that restaurant's quotes and deliveries. There's no onboarding email; the restaurant never needs Uber's dashboard.
Every status, handled
| Uber status | Order state | Customer sees | Kitchen sees |
|---|---|---|---|
| pending | Courier booked | Finding you a courier | Courier booked, ready-by time |
| pickup | Courier booked | {Courier} is heading to the restaurant | Courier name and pickup ETA; “arriving now” when imminent |
| pickup_complete | Picked up | {Courier} has your order | Out the door |
| dropoff | Picked up | Arriving around {time}; “arriving now” when imminent | Out the door |
| delivered | Delivered | Delivered, with the courier's photo, or “Left at your door” | Delivered or left at door, photo link |
| canceled + undeliverable_action left_at_door | Delivered | Left at your door | Left at the door (no answer) |
| canceled (before pickup) | Back in the kitchen | We're sorting out your courier | Book courier now button |
| canceled (after pickup) | Needs attention | The restaurant will call you | Call the customer |
| returned | Needs attention | We couldn't reach you | Returned to the restaurant, call the customer |
Test scenarios
The demo checkout has a scenario picker. Each one runs a real test-mode delivery with Uber's robot courier.
Delivered normally
Robot courier walks every status; photo proof is requested at dropoff.
Customer doesn't answer
cancel_reason customer_unavailable. Uber reports canceled with undeliverable_action left_at_door, which we show as delivered and left at the door.
Can't find the address
undeliverable_action return, then the returned status and a kitchen alert.
Money and branding
- The customer sees the Uber fee as its own line, “Delivery by Uber”, before paying.
- Tips: “100% of your tip goes to your Uber courier.” The tip is sent in the delivery's tip field.
- The restaurant pays no commission, only the Uber fee per delivery, which the customer covers at checkout.
- Proof of delivery is a photo, so orders can be left at the door; no signature or PIN is needed for food.
- Undeliverable orders are left at the door rather than returned, so restaurants don't pay a return trip for a meal.
Live: the demo restaurant's Uber traffic
Every quote and delivery request we send, and every webhook Uber sends back, as it happens.
Uber Direct API, live
→ our request · ← Uber webhook
Connecting…