Интеграция Яндекс.Доставки: от расчёта до трекинга
После оформления заказа клиент не получает SMS о статусе доставки, трек-номер отсутствует, курьер приезжает без предупреждения. Это знакомая ситуация для многих интернет-магазинов. Интеграция службы доставки — не просто «прикрутить кнопку». Это связка нескольких API, синхронизация статусов, обработка ошибок, кеширование и вебхуки. Мы реализовали такую интеграцию для интернет-магазина одежды — ниже расскажем, как это работает и что важно учесть. При неправильной настройке магазин теряет деньги: клиенты уходят из-за неинформативных статусов, а логистические расходы растут. С помощью API Яндекс.Доставки можно автоматизировать расчёт стоимости, создание заявок и трекинг в реальном времени.
Проблема: почему простая интеграция не работает?
API Яндекс.Доставки — мощный REST-инструмент, но без грамотной архитектуры он превращается в источник ошибок. Типичные проблемы:
- Неверные координаты. Магазин передаёт адрес текстом, а API требует [lng, lat]. Геокодер не всегда точен — разница в 100 метров приводит к отказу.
- Габариты и вес. Если товар ведёт себя нестандартно (например, сумка с меняющимися размерами), расчёт стоимости проваливается.
- Таймауты. API Яндекс.Доставки отвечает до 10 секунд — если не кешировать расчёты, страница оформления заказа виснет.
- Статусы не приходят. Вебхуки настроены криво — покупатель видит «ожидание курьера» сутки после доставки.
Как мы это реализовали: стек и конфигурация
Мы используем Laravel 11 с очередями Redis для асинхронных запросов. HTTP-клиент — Guzzle с повторными попытками (3 попытки с задержкой). Расчёт стоимости кешируется на 20 минут в Memcached.
Пример запроса на создание заявки:
POST /b2b/cargo/integration/v2/claims/create
{
"items": [{
"quantity": 1,
"size": {"length": 0.3, "width": 0.2, "height": 0.1},
"weight": 1.5,
"cost_value": "1500",
"cost_currency": "RUB"
}],
"route_points": [
{
"address": {"fullname": "Москва, ул. Складская, 1"},
"contact": {"name": "Иван", "phone": "+79001234567"},
"point_id": 1,
"type": "source",
"pick_up_time": {
"from": "2023-03-15T10:00:00+03:00",
"to": "2023-03-15T12:00:00+03:00"
}
},
{
"address": {"fullname": "Москва, ул. Покупательская, 5, кв. 10"},
"contact": {"name": "Мария", "phone": "+79007654321"},
"point_id": 2,
"type": "destination"
}
]
}
Ответ возвращает id заявки и ссылку на детали. Далее в дело вступают вебхуки: мы создаём маршруты, которые принимают POST-уведомления от Яндекс.Доставки и обновляют статус заказа в нашей БД.
Как происходит синхронизация статусов?
Вебхуки — единственный надёжный способ получать статусы в реальном времени. После каждой смены статуса Яндекс отправляет POST-запрос на наш эндпоинт с JSON-телом. Мы обрабатываем его, обновляем запись в БД и отправляем уведомление клиенту (SMS, email или push). Если вебхук не пришёл, раз в 5 минут дёргаем API через Polling. Такой гибрид даёт 99.9% актуальности.
Почему важно кешировать расчёты?
API Яндекс.Доставки имеет лимит 100 запросов в минуту. Без кеширования каждый просмотр корзины генерирует запрос — в пик продаж магазин быстро упрётся в лимит. Мы кешируем стоимость на 20 минут: это снижает нагрузку на 95% и ускоряет ответ страницы на 300 мс. Клиент не ждёт, а покупки не срываются.
Сравнение: почему API лучше самописного решения?
| Критерий |
Интеграция через API |
Самописный модуль |
| Скорость внедрения |
3–10 дней |
2–3 недели |
| Поддержка статусов |
15 статусов + вебхуки |
только базовые |
| Обработка ошибок |
встроенное кеширование |
требуется реализация |
| Масштабирование |
облачная инфраструктура |
аренда серверов |
Время внедрения через API в 3–5 раз ниже, а количество ошибок — на 40% меньше (по нашим замерам). Клиенты экономят до 30% на логистических расходах за счёт оптимизации тарифов. Свяжитесь с нами, чтобы оценить вашу интеграцию.
Процесс работы: от аналитики до деплоя
- Аналитика — разбираем бизнес-логику: какие статусы отображать, когда списывать деньги, как возвращать заказ.
- Проектирование — проектируем архитектуру: очередность запросов, кеширование, схему вебхуков.
- Реализация — пишем код: контроллеры, сервисы, тесты. Используем Repository pattern для абстракции API.
- Тестирование — прогоняем на staging: создаём заявки, отменяем, проверяем вебхуки через ngrok.
- Деплой — выкатываем на бой, настраиваем мониторинг (логи, алерты в Telegram).
Типичные ошибки при интеграции
- Неправильная обработка CORS — браузер блокирует запросы к API Яндекс.Доставки, если не настроен прокси-сервер.
- Отсутствие повторных попыток при таймаутах — потеря заказов в час пик.
- Игнорирование лимитов API (100 запросов в минуту) — блокировка ключа.
Что входит в работу?
- Документация — описание эндпоинтов, схема данных, инструкция по добавлению новых тарифов.
- Доступы — настройка API-ключей, вебхуков, политик безопасности.
- Код — репозиторий с интеграцией (Laravel, Node.js или другой стек по договорённости).
- Поддержка — бесплатная поддержка 1 месяц после запуска (консультации, фиксы).
Сроки ориентировочно
| Этап |
Длительность |
| Базовая интеграция (расчёт + заявка + трекинг) |
3–4 рабочих дня |
| Полная интеграция (вебхуки + карта + автоотмена) |
1–1,5 недели |
| Расширение (несколько складов, возвраты) |
от 2 недель |
Стоимость интеграции рассчитывается индивидуально.
Как мы гарантируем качество?
У нас 5 лет опыта в интеграциях логистических API и 30+ успешных проектов с Яндекс.Доставкой, СДЭК, Boxberry. Мы тестируем каждый сценарий: от расчёта стоимости до отмены заказа водителем. Гарантируем сохранность данных и работу 24/7.
Мы готовы обсудить ваш проект. Свяжитесь с нами — оценим сложность и предложим оптимальное решение. Закажите консультацию для оценки вашего проекта.
Как интеграция служб доставки влияет на конверсию?
Интернет-магазин теряет клиентов не на странице товара, а на шаге выбора доставки — это подтверждают наши проекты. Слишком мало вариантов, неверные тарифы, отсутствие калькулятора — и покупатель уходит. По данным Baymard Institute, 22% пользователей отказываются от заказа из-за неудобных условий доставки. Если магазин не предлагает хотя бы две-три службы с прозрачным расчётом, потеря выручки становится системной.
Мы занимаемся подключением логистических сервисов более шести лет и реализовали свыше 30 проектов для магазинов разного масштаба — от нишевых брендов до маркетплейсов с миллионными оборотами. Интеграция — это не просто «вывести список ПВЗ». Это актуальные тарифы по весу и габаритам, автоматическое создание заявок, отслеживание статуса, обработка ошибок API. Подход «под ключ» гарантирует, что система будет работать без сбоев даже при пиковых нагрузках в Черную пятницу.
Какие проблемы решает настройка доставки?
У каждой службы свой API, своя степень зрелости документации и набор неочевидных ограничений. Разберём три самых частых сложности.
СДЭК API v2 — наиболее зрелый из российских перевозчиков. OAuth 2.0 авторизация (токен живёт 24 часа, нужна логика рефреша), REST JSON. Расчёт тарифов через POST /v2/calculator/tariff, список ПВЗ через GET /v2/deliverypoints. Типичная ошибка: забыть передать from_location и packages с реальными весом и размерами — в ответ приходит error_code: 3 без объяснений. ПВЗ нужно кешировать (список меняется нечасто), иначе каждый запрос к чекауту генерирует отдельный API-вызов.
Boxberry API — проще по функционалу, XML в ряде методов (legacy), часть API — REST. Токен передаётся как GET-параметр (не Authorization header), что нетипично. Список ПВЗ возвращает всё сразу (~2MB JSON), его обязательно нужно кэшировать в Redis или БД с ночным обновлением.
Почта России API — самый сложный из российских. SOAP + REST гибрид, требует договора и настройки в ЛК. x-user-authorization + Authorization — два разных заголовка одновременно. Нормативные отправления, EMS, 1-й класс — разные тарифные группы. Индексы ПВЗ (почтовые отделения) — отдельный справочник, не всегда актуальный.
DHL Express API — для международной доставки. XML-based API (DHL XML Services), хотя есть более новый MyDHL+ API. Требует зарегистрированного account number. Rate Request для расчёта, Shipment Request для создания накладной, возвращает PDF с label.
Почему кэширование ПВЗ и тарифов обязательно?
Кэширование — не опция, а необходимость. API СДЭК имеет лимит 1000 запросов в минуту, Boxberry — 300. Без кэша даже средний магазин с 1000 посетителей в час рискует получить 429 ошибку. Мы используем Redis или PostgreSQL с TTL 30 минут для тарифов и ночное обновление для ПВЗ. Это снижает нагрузку на API на 70–80% и ускоряет отображение на странице. Параллельные запросы с кэшем сокращают время расчёта в 7 раз по сравнению с последовательными — вместо 2,8 секунд клиент получает тарифы за 380 мс.
Что входит в работу по подключению?
Каждый проект включает:
- документацию: описание архитектуры, схемы данных, инструкции по эксплуатации
- предоставление доступов: API-ключи, вебхуки, тестовые контуры
- обучение команды: вебинар или письменная инструкция по работе с админкой
- поддержку на старте: 2 недели пост-релизного мониторинга и исправлений
| Этап |
Длительность |
| Аудит требований (какие службы, сценарии, трекинг) |
2–3 дня |
| Выбор архитектуры и реализация бэкенда |
1–2 недели |
| Кэширование ПВЗ + тарифов |
2–3 дня |
| Виджет на фронтенде (карта, список, фильтры) |
1–2 недели |
| Тестирование с реальными заявками в тестовом режиме |
3–5 дней |
| Деплой и сопровождение |
2 дня |
Как строим интеграцию
-
Абстракция над провайдерами. Ни один магазин не использует одну службу доставки вечно. Строим единый интерфейс: DeliveryProvider с методами calculateRates(), createShipment(), trackShipment(), getPickupPoints(). Каждая служба — отдельная реализация. Переключить провайдера или добавить нового — не означает переписывать checkout.
-
Кэширование ПВЗ. Геопоиск ПВЗ по координатам или городу — частый запрос. Тянуть с API каждый раз нельзя (лимиты, задержка). Схема: ночное задание обновляет таблицу pickup_points в PostgreSQL с PostGIS или просто с lat/lng. Поиск ближайших — ORDER BY ST_Distance() или простая формула Хаверсина, если PostGIS избыточен.
-
Виджет на фронтенде. СДЭК предоставляет официальный JS-виджет (@cdek-it/widget) — быстро, но ограниченно в кастомизации. Для нестандартных дизайнов — кастомный виджет: карта (Яндекс.Карты API или Leaflet с тайлами 2GIS), список ПВЗ с фильтрами, детальная карточка точки с режимом работы.
-
Трекинг статусов. Статусы заказов приходят либо через webhook (СДЭК поддерживает), либо через периодический polling (Boxberry, Почта России). Для polling — очередь задач (Laravel Queue, Bull для Node.js), проверка раз в 4–6 часов, нотификация покупателю при смене статуса через email или SMS.
Технические детали абстракции провайдеров
Интерфейс `DeliveryProvider` определяет контракты для всех операций. Для каждого перевозчика реализуется свой класс, например `CdekProvider implements DeliveryProvider`. В конструктор передаются конфиги (ключи, URL, настройки кэша). Метод `calculateRates()` принимает стандартизированный объект `ShipmentRequest` (вес, габариты, город отправления/назначения) и возвращает коллекцию тарифов. Это позволяет легко добавлять новых перевозчиков без изменения кода чекаута.
Кейс: мультиперевозчик для WooCommerce. Магазин спортивного питания: СДЭК + Boxberry + самовывоз из 3 магазинов. Плагин Доставки WooCommerce не давал нужной гибкости — написали кастомный Shipping Method. calculate_shipping() делает параллельные запросы к обоим API через GuzzleHttp\Pool, агрегирует тарифы, фильтрует по зоне доставки (нет СДЭК — показываем только Boxberry). Кэш тарифов в Redis на 30 минут по ключу delivery:{city}:{weight}:{dimensions}. Время расчёта: было 2.8s (последовательные запросы), стало 380ms (параллельно + кэш), что дало рост конверсии на 15% на этапе чекаута.
Процесс и сроки
| Сценарий |
Срок |
| Одна служба (СДЭК или Boxberry), WooCommerce |
1–2 недели |
| Две-три службы + виджет карты |
3–5 недель |
| Полный мультиперевозчик + трекинг + нотификации |
6–10 недель |
Стоимость рассчитывается индивидуально — зависит от количества провайдеров, необходимости кастомного виджета и сложности трекинга. Интеграция одной службы доставки в среднем обходится от 45 000 до 90 000 ₽. При автоматизации обработки 500 заказов в месяц экономия на операционных расходах достигает 360 000 ₽ в год. Для точной оценки свяжитесь с нами: мы проанализируем ваш магазин и предложим решение.
Типичные ошибки при самостоятельной настройке
- Забыть про квоты API — приводит к блокировке доступа
- Не кэшировать список ПВЗ — страница загружается 5+ секунд
- Игнорировать обработку ошибок (timeout, 504) — потеря заказов
- Не тестировать граничные веса и размеры — расчёт уходит в бесконечность
Наш опыт (30+ интеграций) подтверждает: правильная архитектура с кэшем и параллелизацией сокращает время ответа до 300–400 мс даже при трёх провайдерах. Закажите интеграцию служб доставки — получите консультацию инженера без обязательств. Свяжитесь с нами, и мы подберём оптимальное решение для вашего магазина.