Cómo viaja un pedido
De principio a fin: cliente → nuestro Next.js → Stripe → Uber Direct → cocina → repartidor → cliente. Cada paso muestra la API exacta, el evento que dispara la siguiente acción, y qué se persiste en la base de datos.
(navegador)
Antes de redirigir a Stripe, llamamos a Uber Direct para pedir cotización. Si Uber dice "no cubrimos", nunca cobramos.
→ Uber Direct
{
"pickup_address": "{...San Bartolomé 14...}",
"dropoff_address": "{...Hortaleza 42...}",
"pickup_ready_dt": "2026-05-11T20:30:00Z",
"dropoff_deadline_dt":"2026-05-11T21:00:00Z",
"manifest_total_value": 2150
}
{ id:"dqt_8f3a...", fee:450, dropoff_eta:"20:58", expires:"20:35" }order.uber_quote_id y delivery_fee_cents = 450 + markup.address_undeliverableRenderizamos Mockup 07 · Fuera de zona con alternativas (pickup, Uber Eats app, reserva). Stripe nunca se invoca.
→ Stripe
order_idOrder ya está en DB con status=pending_payment + el uber_quote_id.
→ Webhook
checkout.session.completedVerificamos firma, leemos order_id de metadata, actualizamos a status=received.
→ Uber Direct
quote_id{ "quote_id":"dqt_8f3a...",
"pickup_name":"Casa Nokiate",
"pickup_phone_number":"+34646261756",
"dropoff_name":"María García",
"dropoff_phone_number":"+34612345678",
"manifest_items":[
{"name":"Patatas Nokiate","quantity":1,"price":850},
{"name":"Croqueta","quantity":4,"price":1000}
],
"external_id":"ord_01JTV3K9..." }
uber_delivery_id, uber_tracking_url.Re-cotizamos: si la nueva tarifa cambia ≤20%, seguimos y registramos el delta. Si cambia más o ya no cubren, marcamos el pedido canceled + reembolso Stripe automático + email de disculpa.
(tablet)
El cocinero pulsa "Aceptar" → status preparing. SSE empuja el cambio al cliente en la pantalla de tracking.
→ Webhook
event.delivery_status| Uber status | Nuestro orders.status | Aviso al cliente |
|---|---|---|
pending | — | — |
pickup | accepted | — |
pickup_complete | dispatched | WhatsApp + tracking URL |
dropoff | dispatched | — |
delivered | delivered | WhatsApp "entregado, gracias" |
canceled / returned | canceled | Email + WhatsApp; reembolso Stripe |
X-Uber-Signature: t=…,v1=… (HMAC-SHA256, ventana 5 min). Persistimos cada evento en uber_events con dedupe por event_id.Cuando llega pickup_complete, el botón "Ver en Uber" se activa apuntando al tracking_url que devolvió Uber.
→ Uber Direct
Permitido sólo mientras Uber esté en pending o pickup. Tras pickup_complete hay que llamar a soporte Uber. La acción dispara reembolso Stripe automáticamente si el pedido estaba pagado.
Resumen visual
Documentación detallada y payloads completos en docs/UBER-DIRECT.md.
