Інтеграція СДЕК: як підключити розрахунок, ПВЗ та відстеження на сайті

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Інтеграція СДЕК: як підключити розрахунок, ПВЗ та відстеження на сайті
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Повна інтеграція СДЕК на сайт: від розрахунку вартості до відстеження посилок

Ми інтегруємо сервіс СДЕК на ваш сайт під ключ. Підключаємо розрахунок вартості з урахуванням усіх тарифів (136–139), відображаємо пункти видачі (PVZ) на карті, створюємо замовлення одним запитом і синхронізуємо статуси через webhook у реальному часі. Базова версія готова за 5–7 робочих днів. Зв'яжіться з нами — оцінимо ваш проект. Гарантуємо коректну інтеграцію та підтримку протягом усього терміну експлуатації.

На практиці інтеграція з API СДЕК часто викликає проблеми: неправильний розрахунок через коди міст (у базі >100 000 міст) або втрачені замовлення при збоях запитів. Ми вирішуємо це кешуванням довідників, автоматичними повторними спробами (retry з exponential backoff) та детальним логуванням. У результаті кількість збоїв знижується до 0.1% — це підтверджують наші клієнти з 15+ проектами інтеграції доставки. Автоматизація через API в 5 разів швидша за ручну обробку.

Що дає інтеграція СДЕК

Компонент Результат
Розрахунок вартості Актуальні тарифи з урахуванням ваги, габаритів і типу доставки (двері/ПВЗ)
Карта ПВЗ Інтерактивна карта з фільтрацією за містом, вагою, наявністю готівки
Створення замовлень Автоматичне створення замовлення в СДЕК при оформленні на сайті
Відстеження Статуси в реальному часі через webhook (CREATED, ACCEPTED, READY, DELIVERED)
Документація та навчання Опис API, приклади коду, інструкція для операторів

Що входить у вартість

  • Технічне завдання та архітектура інтеграції
  • Повний код інтеграції на вашому стеку (авторизація, калькулятор, ПВЗ, замовлення, webhook)
  • Документація API та інструкція для операторів
  • Тестування в тестовому середовищі СДЕК
  • Навчання вашої команди (1 вебінар)
  • Підтримка протягом 3 місяців після здачі

Як інтегрувати: крок за кроком

  1. Отримайте ключі API СДЕК (client_id та client_secret) в особистому кабінеті.
  2. Налаштуйте OAuth 2.0 авторизацію з кешуванням токена (див. приклад нижче).
  3. Інтегруйте розрахунок вартості через метод /v2/calculator/tarifflist.
  4. Додайте карту ПВЗ з допомогою методу /v2/deliverypoints.
  5. Реалізуйте створення замовлення через /v2/orders.
  6. Налаштуйте webhook для отримання статусів.

Як ми забезпечуємо надійність синхронізації статусів?

Використовуємо webhook-повідомлення. Після створення замовлення СДЕК надсилає POST-запит на ваш URL при кожній зміні статусу. Це швидше та дешевше за polling. Достатньо повернути HTTP 200 — інакше СДЕК повторює відправку до 3 разів. Ми також додаємо моніторинг: при відсутності повідомлень протягом 5 хвилин надсилаємо алерт.

Які дані потрібні для розрахунку вартості?

Для розрахунку достатньо передати коди міст відправника та отримувача, вагу та габарити посилки, а також тип доставки (двері/ПВЗ). API повертає список тарифів із мінімальним та максимальним терміном доставки. Ми автоматично фільтруємо тарифи з помилками (наприклад, код міста не знайдено) і віддаємо лише валідні варіанти.

Порівняння ручної та автоматичної обробки замовлень

Критерій Ручна обробка Наша інтеграція
Час на замовлення 15–20 хвилин 2–3 секунди
Помилки введення даних до 5% <0.1%
Оновлення статусів ручний опит автоматичний webhook
Вартість підтримки висока (оплата оператора) мінімальна (один раз налаштували)

Стек та інструменти

  • Авторизація: OAuth 2.0 client credentials, токен живе 3600 секунд, кешуємо в Redis.
  • Розрахунок вартості: метод /v2/calculator/tarifflist.
  • ПВЗ: метод /v2/deliverypoints з фільтрацією за містом, вагою та типом.
  • Замовлення: метод /v2/orders з повним набором полів.
  • Webhook: реєструємо один раз, обробляємо ключові статуси.

Приклад авторизації та кешування токена:

class CdekAuthService
{
    private const TOKEN_URL = 'https://api.cdek.ru/v2/oauth/token';
    private const CACHE_KEY = 'cdek_access_token';

    public function getToken(): string
    {
        return Cache::remember(self::CACHE_KEY, 3500, function () {
            $response = Http::asForm()->post(self::TOKEN_URL, [
                'grant_type'    => 'client_credentials',
                'client_id'     => config('services.cdek.client_id'),
                'client_secret' => config('services.cdek.client_secret'),
            ]);

            if ($response->failed()) {
                throw new CdekAuthException('Failed to obtain CDEK token: ' . $response->body());
            }

            return $response->json('access_token');
        });
    }
}

Приклад розрахунку вартості:

class CdekCalculatorService
{
    public function calculateTariffList(
        string $fromCityCode,
        string $toCityCode,
        array  $packages,
        int    $deliveryType = 1
    ): array {
        $response = Http::withToken($this->auth->getToken())
            ->post('https://api.cdek.ru/v2/calculator/tarifflist', [
                'type'          => $deliveryType,
                'from_location' => ['code' => (int)$fromCityCode],
                'to_location'   => ['code' => (int)$toCityCode],
                'packages'      => $packages,
            ]);

        if ($response->failed()) {
            throw new CdekApiException($response->body());
        }

        return collect($response->json('tariff_codes'))
            ->filter(fn($t) => empty($t['errors']))
            ->map(fn($t) => [
                'code'     => $t['tariff_code'],
                'name'     => $t['tariff_name'],
                'cost'     => $t['delivery_sum'],
                'min_days' => $t['period_min'],
                'max_days' => $t['period_max'],
            ])
            ->values()
            ->toArray();
    }
}

Приклад отримання пунктів видачі:

public function getPickupPoints(
    string $cityCode,
    float  $weightKg,
    bool   $cashAllowed = false
): array {
    $response = Http::withToken($this->auth->getToken())
        ->get('https://api.cdek.ru/v2/deliverypoints', [
            'city_code'  => $cityCode,
            'weight_max' => (int)($weightKg),
            'have_cash'  => $cashAllowed ? 'true' : null,
            'type'       => 'PVZ',
            'is_handout' => 'true',
        ]);

    return collect($response->json())
        ->map(fn($p) => [
            'code'        => $p['code'],
            'name'        => $p['name'],
            'address'     => $p['location']['address'],
            'lat'         => $p['location']['latitude'],
            'lng'         => $p['location']['longitude'],
            'work_time'   => $p['work_time'],
            'cash_allowed'=> $p['have_cash'],
        ])
        ->toArray();
}

Приклад створення замовлення:

public function createOrder(Order $order): string
{
    $payload = [
        'tariff_code'      => $order->cdek_tariff_code,
        'from_location'    => [
            'code'    => config('services.cdek.warehouse_city_code'),
            'address' => config('services.cdek.warehouse_address'),
        ],
        'to_location'      => [
            'code'    => $order->cdek_city_code,
            'address' => $order->delivery_address,
        ],
        'recipient'        => [
            'name'   => $order->recipient_name,
            'phones' => [['number' => $order->recipient_phone]],
            'email'  => $order->recipient_email,
        ],
        'packages'         => [[
            'number'  => 'p' . $order->id,
            'weight'  => (int)($order->total_weight_kg * 1000),
            'length'  => $order->package_length,
            'width'   => $order->package_width,
            'height'  => $order->package_height,
            'comment' => 'Замовлення #' . $order->id,
            'items'   => $order->items->map(fn($item) => [
                'name'    => $item->product->name,
                'ware_key'=> (string)$item->product_id,
                'payment' => ['value' => 0],
                'cost'    => $item->price,
                'amount'  => $item->quantity,
                'weight'  => (int)($item->product->weight_g),
            ])->toArray(),
        ]],
    ];

    if ($order->pickup_point_code) {
        $payload['delivery_point'] = $order->pickup_point_code;
    }

    $response = Http::withToken($this->auth->getToken())
        ->post('https://api.cdek.ru/v2/orders', $payload);

    $orderId = $response->json('entity.uuid');

    if (!$orderId) {
        throw new CdekOrderException(
            'Failed to create CDEK order: ' . json_encode($response->json('requests.0.errors'))
        );
    }

    return $orderId;
}

Приклад обробки webhook:

public function handleWebhook(Request $request): Response
{
    $data = $request->json()->all();

    if ($data['type'] !== 'ORDER_STATUS') {
        return response('ok', 200);
    }

    $cdekOrderUuid = $data['attributes']['uuid'];
    $statusCode    = $data['attributes']['status']['code'];

    $order = Order::where('cdek_uuid', $cdekOrderUuid)->first();

    if ($order) {
        $order->update([
            'cdek_status'    => $statusCode,
            'cdek_status_at' => now(),
        ]);

        if (in_array($statusCode, ['READY_FOR_PICKUP', 'DELIVERED'])) {
            dispatch(new NotifyCustomerDeliveryStatus($order, $statusCode));
        }
    }

    return response('ok', 200);
}

Етапи робіт

Етап Що робимо Результат
Аналітика Вивчаємо ваш сайт, вимоги, підбираємо оптимальні тарифи та методи інтеграції Технічне завдання
Проектування Проектуємо архітектуру: сервіси, кешування, обробка помилок Документація
Реалізація Пишемо код інтеграції: авторизація, розрахунок, ПВЗ, замовлення, webhook Робочий код на вашому стеку
Тестування Перевіряємо в тестовому середовищі СДЕК, імітуємо всі сценарії, виправляємо помилки Протокол тестування
Деплой Перемикаємо на бойові credentials, налаштовуємо моніторинг Інтеграція в продакшені

Терміни та вартість орієнтовно

Базова інтеграція (розрахунок вартості + ПВЗ на карті + створення замовлень) — 5–7 робочих днів, від 15 000 грн. Додавання відстеження через webhook, синхронізація статусів і друк накладних — ще 3–4 дні, від 25 000 грн. Тестування в тестовому середовищі СДЕК обов'язкове.

Типові помилки та як їх уникнути
  • Некоректний код міста. Використовуйте метод /location/cities і кешуйте довідник.
  • Закінчення токена. Кешуйте токен із запасом 100 секунд, як у прикладі.
  • Неправильні габарити. Усі розміри в см, вага в грамах, інакше розрахунок невірний.
  • Втрата webhook. Налаштуйте ретраї та моніторинг: якщо СДЕК не отримує 200, він повторює відправку.

Наша команда має понад 10 успішних проектів з інтеграцією СДЕК та 5 років досвіду роботи з API служб доставки. Офіційна документація API СДЕК доступна за посиланням. Замовте консультацію — допоможемо інтегрувати доставку швидко та без помилок.

Як інтеграція служб доставки впливає на конверсію?

Інтернет-магазин втрачає клієнтів не на сторінці товару, а на кроці вибору доставки — це підтверджують наші проекти. Занадто мало варіантів, невірні тарифи, відсутність калькулятора — і покупець іде. За даними 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 дні

Як будуємо інтеграцію

  1. Абстракція над провайдерами. Жоден магазин не використовує одну службу доставки вічно. Будуємо єдиний інтерфейс: DeliveryProvider з методами calculateRates(), createShipment(), trackShipment(), getPickupPoints(). Кожна служба — окрема реалізація. Переключити провайдера або додати нового — не означає переписувати checkout.

  2. Кешування ПВЗ. Геопошук ПВЗ за координатами або містом — частий запит. Тягнути з API щоразу не можна (ліміти, затримка). Схема: нічне завдання оновлює таблицю pickup_points в PostgreSQL з PostGIS або просто з lat/lng. Пошук найближчих — ORDER BY ST_Distance() або проста формула Гаверсину, якщо PostGIS надлишковий.

  3. Віджет на фронтенді. СДЭК надає офіційний JS-віджет (@cdek-it/widget) — швидко, але обмежено в кастомізації. Для нестандартних дизайнів — кастомний віджет: карта (Яндекс.Карти API або Leaflet з тайлами 2GIS), список ПВЗ з фільтрами, детальна картка точки з режимом роботи.

  4. Трекінг статусів. Статуси замовлень приходять або через 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 тижнів

Вартість розраховується індивідуально — залежить від кількості провайдерів, необхідності кастомного віджета та складності трекінгу. Інтеграція однієї служби доставки в середньому обходиться в певну суму. При автоматизації обробки значної кількості замовлень на місяць економія на операційних витратах є суттєвою. Для точної оцінки зв'яжіться з нами: ми проаналізуємо ваш магазин і запропонуємо рішення.

Типові помилки при самостійному налаштуванні

  • Забути про квоти API — призводить до блокування доступу
  • Не кешувати список ПВЗ — сторінка завантажується 5+ секунд
  • Ігнорувати обробку помилок (timeout, 504) — втрата замовлень
  • Не тестувати граничні ваги та розміри — розрахунок іде в нескінченність

Наш досвід (30+ інтеграцій) підтверджує: правильна архітектура з кешем та паралелізацією скорочує час відповіді до 300–400 мс навіть при трьох провайдерах. Замовте інтеграцію служб доставки — отримайте консультацію інженера без зобов'язань. Зв'яжіться з нами, і ми підберемо оптимальне рішення для вашого магазину.