Casa Nokiate Mockup 22 · Uber Eats marketplace
Marketplace · v2 / Phase E

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.

Nuestro stack Uber Eats Cocina Caso de error
Diferencias clave vs pedido directo
AspectoDirecto (nuestro)Uber Eats marketplace
PagoStripe → nuestra cuentaUber cobra al cliente · pago semanal
Comisión0%~30% del subtotal
Cliente conocidoEmail + telSólo nick anonimizado
Contacto clienteEmail, WhatsApp directosSólo via Uber chat
CancelaciónStripe refundUber API + ratings impactados
RepartoUber Direct (mockup 17)Uber asigna courier al marcar "listo"
Cliente
(app Uber)
1El cliente pide en la app de Uber Eats

Ve nuestro menú con precios +20% sobre directo (uplift para absorber la comisión). Paga a Uber, no a nosotros.

Uber Eats
→ Webhook
2POST /api/uber-eats/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"
  }
}
Verificamos firma HMAC. Hacemos GET al resource_href para sacar items/totales/cliente-nick.
Next.js
→ DB
3Insertar orden con 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.

Cocina
4Aceptar antes de 11:30 (o auto-aceptamos)

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).

Next.js
→ Uber Eats
5POST /v1/eats/orders/{id}/accept_pos_order
{ "reason": "accepted",
  "store_id": "st_8f3a...",
  "prep_time_in_seconds": 1200 }
Uber confirma al cliente "Tu pedido está en cocina, ETA 20 min". Aún no hay courier asignado.
Cocina
6Mismo flujo que un pedido directo

El ticket avanza por la cola: accepted → preparing → ready. La cocina ni se entera de que es UE más allá del badge verde.

Next.js
→ Uber Eats
7POST /v1/eats/orders/{id}/ready_for_pickup

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.

Uber Eats
→ Webhook
8Eventos de estado entrantes
Uber eventNuestro estadoUI
orders.in_kitchenpreparingcocina ya está en marcha
orders.courier_assignedreadynombre del courier visible
orders.delivereddelivered
orders.cancelcanceledcliente ya reembolsado por Uber
orders.fulfillment_issues(nota interna)aparece bandera roja en admin
Caso límite
9aCocina rechaza — POST /deny_pos_order

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.

Caso límite
9bCancelar después de aceptar

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

Cliente app Uber Eats Next.js Cocina Courier UE ① pide ② webhook ③ ticket ⑤ accept ack ⑤ → UE avisa al cliente ⑦ ready ⑧ delivered

Spec completa: docs/UBER-EATS.md · adaptador OrderChannel en lib/channels/uber-eats.ts (Phase E).