Все статьи

Практический разбор

Первая посылка ушла, а заказ остаётся открытым

Проектный разбор на основе Shopify: как отправить доступные позиции, сверить задания на отгрузку и не потерять остаток заказа.

MP
Max PerfiljevFounder & CEO, AES · Архитектор автономных организаций
Read in English

Первая посылка может уйти вовремя, хотя заказ ещё не выполнен. Ошибка — принять успешную отгрузку на складе за подтверждение того, что покупателю отправили всё.

Представим магазин оборудования для мастерских. В одном заказе — инструмент, который уже можно собрать к отправке, и оснастка, которую ещё ждут от поставщика. Инструмент пригоден без неё, а правила магазина допускают раздельную доставку. Склад может отправить инструмент. Поддержке при этом нужно видеть, какая позиция осталась, почему её удерживают и кто вправе изменить обещанный срок.

Это проектный разбор на основе документированных возможностей Shopify. Он не описывает внедрение у конкретного магазина или результат AES. Платформа предоставляет операции с отгрузкой, но только магазин может решить, когда разделение заказа полезно покупателю.

Два разных решения под одним статусом

В ручном процессе комплектовщик замечает недостачу, оставляет примечание и спрашивает координатора, ждать ли товар. Координатор сверяется с магазином, складом и правилами доставки, после чего даёт команду собрать то, что есть. Позже сотрудник поддержки восстанавливает список недостающих позиций по этому примечанию и письму с трек-номером. Когда товар поступает, его может не заметить тот, кто работает только с общей очередью неотгруженных заказов.

Проблема не сводится к пересылке примечаний. Один статус пытается отвечать на два разных вопроса: что можно отправить сейчас и выполнен ли заказ целиком. Ещё одно письмо этого не исправит. Состояние остатка должно жить в самой работе по отгрузке, а не в сообщении, которое кто-то должен вспомнить и найти.

Разделить отгрузку, а не обязательство перед клиентом

Shopify документирует частичную отгрузку, разделение по позициям и количеству и отдельный трекинг для разных отправлений. Отдельные позиции можно поставить на удержание. Заказ при этом остаётся общей записью покупки, а задания на отгрузку показывают, какую работу ещё надо выполнить. Удержание из-за отсутствия товара — это причина остановки, а не новая дата доставки.

  1. Прочитайте актуальные позиции отгрузки, остаток к отправке и назначенный склад. Сверьте их с количеством, которое склад действительно может зарезервировать и собрать. Остаток из каталога, оценка поставщика или запас на другой площадке не подтверждают готовность к отгрузке.
  2. Проверьте, разрешено ли разделение. Правило магазина должно учитывать самостоятельность позиций, условия доставки и стоимость дополнительной посылки. Комплекты, самовывоз, спорные резервы и задания, уже переданные внешнему складу, оставьте на проверку, если для них нет отдельного правила.
  3. Отделите нужное количество и сверьте возвращённые записи. Операция fulfillmentOrderHold может удержать выбранные позиции и вернуть оставшуюся часть; fulfillmentOrderSplit — альтернативный способ явно разделить задание. Прежде чем направлять задания на склад, перечитайте идентификаторы и количество, включая заменённые записи. Не запускайте обе операции вслепую и не считайте, что исходный идентификатор всё ещё относится к отправляемой части.
  4. Отправьте доступную часть и дождитесь подтверждения отправки. Используйте факт передачи со склада или от перевозчика и трек-номер именно этой посылки. Сообщите, что отправлено и что осталось. Созданное задание на сборку или напечатанная этикетка ещё не подтверждают, что посылка ушла.
  5. После пополнения перечитайте состояние остатка. Заново проверьте количество, место отгрузки и действующие удержания. Снимайте только своё удержание из-за отсутствия товара и только если запас и правила магазина это допускают. Не снимайте блокировки оплаты, проверки риска, магазина или внешнего приложения. Заказ закрывайте после учёта всей оставшейся работы.

Где процесс может ошибиться

Повтор запроса — не повод заново разделить ту же позицию. Ответ API может потеряться после того, как изменение уже применилось, а вебхук, как отмечает Shopify, может прийти повторно. Сохраняйте заказ, строку, площадку и результат каждого перехода. Перед повтором записи с неизвестным исходом перечитайте состояние отгрузки. Повторное событие не должно создавать ещё одно задание на сборку или письмо с трек-номером.

Пополнение запаса тоже не отменяет другие решения. Товар мог достаться другому заказу, покупатель мог попросить отмену, а внешний склад — уже начать сборку. При неожиданном изменении площадки или количества оператор сначала сверяет записи. Решение о замене, возврате денег или новом сроке принимает человек, а не событие о поступлении товара.

Для записи через GraphQL нужны подходящее разрешение приложения на работу с заданиями отгрузки и право пользователя на отправку заказов. До включения записи проверьте, кому принадлежит работа на назначенном складе. Адрес и контакты оставьте в системах, которым они нужны. В журнал сверки достаточно записывать необходимые идентификаторы, количества, причины удержания и ссылки на отправление, не копируя контакты в общую таблицу. Доступ приложения к защищённым данным проверяйте отдельно.

В пилоте проверяйте и то, что ещё не отправлено

Начните со своего склада, позиции, которую можно отгрузить отдельно, и распространённой причины недостачи. Проверьте повтор события, смену идентификатора задания после удержания, блокировку от другого приложения и пополнение, которого не хватило на весь остаток. Сопоставьте состояние магазина, очередь склада и то, что видит клиент. Если они расходятся, не закрывайте заказ и не расширяйте пилот до сверки.

Измеряйте время до первой подтверждённой отгрузки вместе с возрастом оставшихся позиций, лишними отправлениями и ошибочными закрытиями заказов. Быстро отправить первую посылку полезно, только если оставшийся товар не исчезает из очереди и покупателю не приходится выяснять, чего не хватает. Хороший процесс позволяет отгрузить готовое, сохранив ответственность за остаток.

Если ваша команда разбирает такие случаи по заметкам и чатам, начните со схемы пути одной позиции от удержания до фактической отгрузки. AES может помочь спроектировать этот переход; реализация зависит от интеграций, прав доступа и правил магазина.

Первичные источники: справка Shopify — частичная отгрузка и разделение: https://help.shopify.com/en/manual/fulfillment/fulfilling-orders/single-fulfillment. Удержания: https://help.shopify.com/en/manual/fulfillment/fulfilling-orders/holding-fulfillments. Shopify Admin GraphQL — постановка удержания: https://shopify.dev/docs/api/admin-graphql/latest/mutations/fulfillmentOrderHold; разделение: https://shopify.dev/docs/api/admin-graphql/latest/mutations/fulfillmentOrderSplit; снятие выбранного удержания: https://shopify.dev/docs/api/admin-graphql/2026-01/mutations/fulfillmentOrderReleaseHold. Защищённые данные: https://shopify.dev/docs/apps/launch/protected-customer-data. Повторная доставка вебхуков: https://shopify.dev/docs/apps/build/webhooks/verify-deliveries.

ПОСТРОИТЬ С AES

Превратите архитектуру в работающую компанию.

AES связывает стратегию, задачи, организационную память, знания, агентов, людей и согласования в единой среде исполнения.