Sapa Moto

Жизненный цикл заказа

Одна статусная модель для приложения курьера, кабинета, API и вебхуков — с правилами изменения и отмены.

Статусы — по стандарту Onfleet / Deliverect и одинаковые везде: в приложении курьера, вашем кабинете, нашем бэк-офисе, GET /v1/orders/{id} и вебхуках.

Статусы заказа и переходыпереназначениеотмена до забораcreatedsearchingassignedto_pickupat_pickupscheduledcancelledpicked_upto_dropoffat_dropoffdeliveredtransferfailedreturningreturnedзабор: заказ у курьерапередача заказа
Сплошные стрелки — основной путь, пунктир — запланированный заказ, переназначение, отмена и передача.

Статусы

ШагСтатусЧто происходитФинальный
1createdСоздан
1scheduledЗапланирован к времени или в слот
2searchingПоиск курьера
3assignedКурьер назначен
4to_pickupКурьер едет за заказом
5at_pickupКурьер на точке забора (ожидание сборки считается)
6picked_upЗабрал заказ
7to_dropoffВ пути к получателю
8at_dropoffУ получателя
9deliveredДоставленда
9failedНе доставлен (с кодом причины)
9returningВозврат на точку забора
9returnedВозвращёнда
7transferПередача другому курьеру (поломка, ДТП, разряд)
—cancelledОтменён (до забора)да
—lostУтерян (по инциденту)да

history[] заказа хранит каждый переход со временем, reason_code и версией заказа version. Версия растёт с каждым изменением заказа — вебхуки несут её как order_version, поэтому событие старше уже известного состояния всегда можно отбросить.

Переназначение и передача

Заказ может сменить курьера на любом шаге; вы получаете order.courier_assigned с replaced: true.

  • До забора (assigned, to_pickup, at_pickup) — курьер отказался, пропал со связи, села батарея или нашёлся курьер ближе: заказ возвращается в searching с кодом причины и приоритетом, ETA пересчитывается (order.eta_changed, если сдвиг больше вашего порога).
  • После забора — поломка, ДТП или разряд без станции рядом: второй курьер забирает заказ в точке встречи, статус transfer, передача подтверждается кодами и фото с обеих сторон; затем снова to_dropoff.

Изменение заказа

PATCH /v1/orders/{id} меняет только переданные поля.

ПолеДо picked_upПосле забора
dropoff (адрес, подъезд, этаж, квартира, комментарий)данет
recipient_name, scheduled_at, codданет
recipient_phone, commentдада, пока заказ не завершён

Отклонённое изменение — 422 order_not_editable с details[].field и списком ещё доступных полей editable. Новый адрес вне зон — 422 out_of_zone.

Сигнал «собран»

POST /v1/orders/{id}/ready сообщает, что заказ собран. Без него поиск курьера стартует по нормативу сборки точки забора (assembly_minutes), чтобы курьер не ждал у прилавка.

Отмена

POST /v1/orders/{id}/cancel с reason_code (см. коды причин):

КогдаРезультатПлата
created, scheduled, searchingcancelled0
assigned, to_pickup, at_pickupcancelled; курьер получает уведомление и компенсациюпо тарифу, в cancellation_fee
picked_up, to_dropoff, at_dropoffзаказ возвращается на точку забора (returning → returned)возврат по тарифу
завершён, failed, returning422 order_not_cancellable—

Не доставлен

Если курьер не может вручить заказ (получатель не отвечает, неверный адрес, отказ, нет документа для 18+, нет оплаты), заказ переходит в failed с reason_code, затем returning → returned. Приходят order.failed и order.returned.

Документация собирается из спецификации OpenAPI платформы. Скачать OpenAPI