Pedido vía Uber Eats — recorrido
Cuando un cliente pide desde la app de Uber Eats, el pedido llega a nuestro sistema a través del webhook de Uber. La cocina lo gestiona exactamente igual que un pedido directo — sólo cambia quién paga al final, quién entrega y a quién podemos contactar.
| Aspecto | Directo (nuestro) | Uber Eats marketplace |
|---|---|---|
| Pago | Stripe → nuestra cuenta | Uber cobra al cliente · pago semanal |
| Comisión | 0% | ~30% del subtotal |
| Cliente conocido | Email + tel | Sólo nick anonimizado |
| Contacto cliente | Email, WhatsApp directos | Sólo via Uber chat |
| Cancelación | Stripe refund | Uber API + ratings impactados |
| Reparto | Uber Direct (mockup 17) | Uber asigna courier al marcar "listo" |
(app Uber)
Ve nuestro menú con precios +20% sobre directo (uplift para absorber la comisión). Paga a Uber, no a nosotros.
→ Webhook
orders.notification{
"event_type": "orders.notification",
"event_id": "evt_K1n9...",
"resource_href": "https://api.uber.com/v1/eats/orders/d2K...",
"meta": {
"order_id": "d2K9...",
"user_id": "uber-anon-883",
"status": "created",
"estimated_ready_for_pickup_at": "2026-05-11T20:48:00Z"
}
}
resource_href para sacar items/totales/cliente-nick.→ DB
channel='uber_eats'Status received · channel_order_id = "d2K9…" · payload completo en channel_payload. Empuja a SSE → la cocina ve el ticket con borde verde y sonido distinto.
Uber requiere ack ≤ 11,5 min — si superamos, penaliza nuestro rating. Si la cocina no acepta a 10 min, el sistema acepta automáticamente con prep time por defecto (20 min).
→ Uber Eats
{ "reason": "accepted",
"store_id": "st_8f3a...",
"prep_time_in_seconds": 1200 }
El ticket avanza por la cola: accepted → preparing → ready. La cocina ni se entera de que es UE más allá del badge verde.
→ Uber Eats
Aquí Uber dispara su búsqueda de courier — distinto a Uber Direct, donde el courier se reserva al crear la entrega. El courier suele llegar 2–5 min después de este aviso.
→ Webhook
| Uber event | Nuestro estado | UI |
|---|---|---|
orders.in_kitchen | preparing | cocina ya está en marcha |
orders.courier_assigned | ready | nombre del courier visible |
orders.delivered | delivered | — |
orders.cancel | canceled | cliente ya reembolsado por Uber |
orders.fulfillment_issues | (nota interna) | aparece bandera roja en admin |
Razones soportadas: out_of_stock, store_closed, store_busy, other. Cada rechazo afecta nuestra "acceptance rate" — métrica que Uber usa para decidir si nos muestra arriba en su feed.
POST /cancel con motivo. La comisión ya está perdida — Uber cobra penalización si el motivo es nuestro (rotura, falta de stock). El cliente recibe reembolso completo desde Uber.
Resumen visual
Spec completa: docs/UBER-EATS.md · adaptador OrderChannel en lib/channels/uber-eats.ts (Phase E).
