Настройка вебхуков
Нотификации (webhooks) — это POST-запросы, которые Lamoda отправляет на ваш URL при изменении статуса заказа, товара или FBO-поставки.
Чек-лист подключения
| № | Действие | Кто делает |
| 1 | Реализовать endpoint для приёма POST-запросов | Вы |
| 2 | Предоставить URL для получения нотификаций (валидный HTTPS URL, макс. 1024 символа) | Вы → KAM |
| 3 | Добавить IP Lamoda в whitelist (получить у KAM) | Вы |
| 4 | Предоставить логин и пароль для Basic Auth (опционально) | Вы → KAM |
| 5 | Настроить подписку на нужные события | KAM (или вы через API) |
Требования к endpoint
URL
Ваш endpoint должен:
- Принимать POST-запросы
- Быть доступен 24/7
- Работать по HTTPS (URL проходит валидацию
@Assert\Url) - Отвечать быстро (рекомендуется < 5 сек)
Аутентификация
Lamoda поддерживает два режима аутентификации при отправке вебхуков:
| Тип | Описание |
none
|
Без аутентификации (по умолчанию). Рекомендуем ограничить доступ по IP. |
basic
|
HTTP Basic Auth. Lamoda передаёт заголовок Authorization: Basic <base64(username:password)> при каждом запросе. Укажите логин и пароль при настройке подписки.
|
Если при создании или редактировании подписки указаны username и password — аутентификация автоматически переключается на basic. Иначе используется none.
Коды ответа
| Код | Поведение Lamoda |
2xx
|
Нотификация успешно доставлена. Сообщению присваивается статус sent.
|
4xx
|
Ошибка клиента. Сообщению присваивается статус failed с описанием ошибки http request failed. Проверьте URL, аутентификацию и формат ответа.
|
5xx
|
Ошибка сервера. Lamoda повторяет отправку с увеличивающимся интервалом. |
| Connection timeout |
Повторная отправка. Ошибка: http connection timeout.
|
| Connection refused |
Повторная отправка. Ошибка: http connection failed.
|
Повторная отправка (retry)
При ошибке доставки (5xx, timeout, connection refused) Lamoda повторяет отправку с увеличивающимся интервалом. Retry-логика управляется инфраструктурой очередей сообщений.
Если все попытки доставки исчерпаны:Сообщение получает статус
failed и сохраняется в системе. Вы можете переотправить недоставленные нотификации через метод GET /api/v1/notifications/resend.Обеспечьте высокую доступность вашего endpoint, чтобы минимизировать количество недоставленных нотификаций.
Типы нотификаций
Основные типы webhook-нотификаций, доступных для подписки:
Тип (type)
|
Описание |
statusChanged
|
Изменился статус заказа (событие orderStatusChanged)
|
itemStatusChanged
|
Изменился статус товара в заказе (событие itemRepresentStatusChanged)
|
fulfilmentShipmentStatusChanged
|
Изменился статус FBO-поставки |
Подробнее о каждом типе и структуре данных — см. Типы нотификаций.
Дополнительные REST-события, доступные для подписки:
| Событие | Описание |
orderCreated
|
Создан новый заказ |
orderAndItemsStatusChanged
|
Изменился статус заказа и/или его товаров (комбинированное событие) |
shipmentOutReceivedRest
|
FBS-отгрузка принята курьером |
fulfilmentShipmentValidationRest
|
Результат валидации FBO-поставки |
moderationRejected
|
Модерация номенклатуры отклонена |
moderationApproved
|
Модерация номенклатуры одобрена |
nomenclatureSubscriptionUpdated
|
Обновлена подписка на номенклатуру |
purchaseOrderDirectFlowCreated
|
Создан заказ на закупку (прямой поток) |
purchaseOrderReverseFlowCreated
|
Создан заказ на закупку (обратный поток) |
supplierReturnCancelProcessedEvent
|
Обработана отмена возврата поставщику |
Не все события доступны для самостоятельной подписки — только те, у которых флаг configurable = true. Уточните у KAM список доступных событий для вашего аккаунта.
Управление подписками через API
Подписками на нотификации можно управлять через Lamoda B2B Platform Partner API:
| Метод | Описание |
GET /notification/subscriptions
|
Список подписок (с пагинацией, фильтрацией и сортировкой) |
GET /notification/subscriptions/{id}
|
Детали подписки |
POST /notification/subscriptions/
|
Создание подписки |
PUT /notification/subscriptions/{id}
|
Редактирование подписки (URL, enabled, auth) |
Создание подписки
POST /notification/subscriptions/
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"partner": 12345,
"event": "orderStatusChanged",
"address": "https://your-domain.com/lamoda/webhook",
"username": "lamoda_webhook",
"password": "your_secret"
}
Если username и password не указаны — подписка создаётся без аутентификации.
Ограничение: нельзя создать две подписки с одинаковым event + address для одного партнёра (уникальный constraint).
Редактирование подписки
PUT /notification/subscriptions/{id}
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"address": "https://new-domain.com/lamoda/webhook",
"enabled": true,
"username": "new_user",
"password": "new_password"
}
Важно: при включении ранее отключённой подписки (enabled: false → true) все накопленные deferred-сообщения автоматически отправляются на ваш endpoint.
Статусы подписки
Каждая подписка имеет один из следующих статусов:
| Статус | Описание |
disabled
|
Подписка отключена. Новые нотификации сохраняются со статусом deferred и будут отправлены при включении.
|
no messages
|
Подписка активна, но нотификаций ещё не было (или последнее сообщение в обработке). |
active
|
Последняя нотификация доставлена успешно. |
failing
|
Последняя нотификация не доставлена. Проверьте доступность вашего endpoint. |
has deferred messages
|
Есть отложенные сообщения (подписка была отключена в момент генерации нотификации). |
Статусы доставки сообщений
Каждое отдельное сообщение (нотификация) проходит через следующие статусы:
| Статус | Описание |
new
|
Сообщение создано и поставлено в очередь на отправку. |
sent
|
Сообщение успешно доставлено (ваш endpoint вернул 2xx). |
failed
|
Доставка не удалась после всех попыток. Можно переотправить через resend API. |
deferred
|
Подписка была отключена в момент генерации. Сообщение будет отправлено при включении подписки. |
Типы ошибок доставки
При неудачной доставке сообщение содержит одну из следующих ошибок:
| Ошибка | Описание | Что делать |
http connection timeout
|
Ваш сервер не ответил вовремя | Оптимизируйте время обработки webhook. Принимайте нотификацию, возвращайте 200, обрабатывайте асинхронно. |
http connection failed
|
Не удалось подключиться к вашему серверу | Проверьте доступность endpoint, DNS, firewall, IP whitelist. |
http request failed
|
Сервер вернул ошибку (4xx/5xx) | Проверьте логи вашего сервера, корректность обработки POST-запроса. |
notifications disabled
|
Подписка была отключена | Включите подписку — deferred-сообщения отправятся автоматически. |
internal error
|
Внутренняя ошибка Lamoda | Переотправьте через resend API. Если повторяется — обратитесь к KAM. |
Пример нотификации
{
"type": "statusChanged",
"trackingId": "117391950",
"data": {
"id": "CZ117391950",
"status": "Delivered",
"paymentMethod": "COD",
"fullSum": "12000",
"deliveryPrice": "250.00",
"createdAt": "2025-12-01",
"updatedAt": "2025-12-03 17:48:00",
"currency": "rub",
"items": [
{
"id": 7598,
"status": "Delivered",
"sku": "SELLER-SKU-001",
"paidPrice": 12000,
"size": "42",
"datamatrix": null
}
],
"shippingAddress": {
"city": "Москва",
"street": "Летниковская",
"houseNum": "д.2 с1",
"apartment": "909"
},
"deliveryMethod": {
"deliveryDate": "2025-12-03",
"deliveryIntervalFrom": "15:00",
"deliveryIntervalTo": "18:00",
"shippingMethodName": "Курьерская доставка Lamoda Express"
},
"customer": {
"firstName": "Иван",
"lastName": "Петров",
"phone": "+79001234567"
}
},
"date": "2025-12-03 17:48:00",
"sequenceNumber": 5
}
Пример обработчика (Python)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/lamoda/webhook', methods=['POST'])
def handle_webhook():
data = request.json
notification_type = data.get('type')
tracking_id = data.get('trackingId')
sequence = data.get('sequenceNumber')
print(f"Received: {notification_type}, "
f"TrackingId: {tracking_id}, "
f"Seq: {sequence}")
# Дедупликация по sequenceNumber
if is_already_processed(tracking_id, sequence):
return jsonify({"status": "ok"}), 200
# Обработка по типу нотификации
if notification_type == 'statusChanged':
process_order_status(data['data'])
elif notification_type == 'itemStatusChanged':
process_item_status(data['data'])
elif notification_type == 'fulfilmentShipmentStatusChanged':
process_shipment_status(data['data'])
# Важно: вернуть 200 быстро!
# Тяжёлую обработку выполняйте асинхронно.
return jsonify({"status": "ok"}), 200
Рекомендации
- Отвечайте 200 как можно быстрее. Принимайте нотификацию, ставьте в свою очередь, обрабатывайте асинхронно.
- Используйте
sequenceNumberдля дедупликации. При переотправке или retry одна и та же нотификация может прийти повторно. - Игнорируйте неизвестные поля. Lamoda может добавлять новые поля в payload — это обратносовместимая операция.
- Игнорируйте неизвестные типы. Если получили
type, который не обрабатываете — просто верните 200. - Мониторьте статус подписки. Периодически проверяйте
GET /notification/subscriptions— статусfailingуказывает на проблемы с доставкой. - Настройте fallback через polling. Даже с вебхуками рекомендуется периодически опрашивать
GET /ordersпоupdatedAt, чтобы не пропустить обновления.
См. также
Помогла эта информация?
Спасибо за отзыв