If your Bitrix store delivers to Belarus via SDEK, you've already faced surprises: Russian tariffs, incorrect BYN calculations, and no TTN-1 documents. We've set up dozens of such integrations and know where the pitfalls are. SDEK operates in Belarus through a Belarusian legal entity—LLC "SDEK-BEL". The API is the same v2, but the configuration is fundamentally different: location codes, tariffs, currency, and legal documents. Let's break down the technical differences and the ready solution for Bitrix. On average, improper delivery handler configuration leads to price discrepancies of 20–30% and order processing delays of up to 2 days.
How SDEK Belarus Integration Differs from Russia
Technically the API is identical: https://api.cdek.ru/v2, same OAuth 2.0, same endpoints. But there are key differences that must be accounted for:
| Parameter | Russia | Belarus |
|---|---|---|
| Legal entity | CDEK Russia | LLC "SDEK-BEL" |
| Credentials | RU account | Separate SDEK-BEL account |
| Currency | RUB | BYN |
| Documents | CDEK waybill | Waybill + TTN-1 |
| City codes | Russian | Belarusian codes |
To work with the Belarusian API, you must obtain separate credentials from the SDEK-BEL personal account. Without this, all requests will be rejected with error 401. Also note that when exchanging with 1C via CommerceML, separate nomenclature catalogs for Belarus are used.
Why a Single Delivery Handler Won't Work
If you use one CdekRuHandler for all orders, for Belarusian addresses it will apply Russian tariffs and currency. As a result, a client from Minsk will see the price in RUB, while the actual price is in BYN—a discrepancy of up to 30%. We encountered projects where, due to a single handler, clients received invoices in RUB instead of BYN, and recalculations took several days. Our implementation with two handlers avoids this. Switching occurs automatically based on the country from the delivery address via the OnBeforeCalculate event.
How to Set Up the Handler for Belarus
Client initialization:
class CdekByHandler extends \Bitrix\Sale\Delivery\Services\Base { private function getApiClient(): CdekApiClient { // Belarusian credentials from SDEK-BEL personal account return new CdekApiClient( clientId: $this->getOption('CLIENT_ID_BY'), clientSecret: $this->getOption('CLIENT_SECRET_BY'), apiUrl: 'https://api.cdek.ru/v2', testMode: (bool)$this->getOption('TEST_MODE') ); } protected function calculateConcrete( \Bitrix\Sale\Shipment $shipment ): \Bitrix\Sale\Delivery\CalculationResult { $result = new \Bitrix\Sale\Delivery\CalculationResult(); $client = $this->getApiClient(); $toCode = $this->getByLocationCode($shipment); if (!$toCode) { $result->addError(new \Bitrix\Main\Error('City not found in SDEK database')); return $result; } $tariff = $client->calculateTariff([ 'tariff_code' => (int)$this->getOption('TARIFF_CODE_BY', 136), 'from_location' => ['code' => $this->getOption('FROM_LOCATION_CODE_BY')], 'to_location' => ['code' => $toCode], 'packages' => [[ 'weight' => max($shipment->getWeight(), 100), 'length' => (int)$this->getOption('DEFAULT_LENGTH', 20), 'width' => (int)$this->getOption('DEFAULT_WIDTH', 20), 'height' => (int)$this->getOption('DEFAULT_HEIGHT', 20), ]], ]); $result->setDeliveryPrice($tariff['total_sum']); $result->setPeriodDescription($tariff['period_min'] . '–' . $tariff['period_max'] . ' working days'); return $result; } } How to Display SDEK Pickup Points on the Website for Belarus
The list of pickup points is requested via GET /v2/deliverypoints?country_codes=BY. SDEK provides an official JavaScript widget for map selection—it works correctly for Belarusian points. Cache the data for 6 hours to speed up loading.
public function getBelarusOfficePoints(): array { $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($cache->initCache(3600 * 6, 'cdek_pvz_by', '/cdek/')) { return $cache->getVars(); } $points = $this->getApiClient()->getDeliveryPoints([ 'country_codes' => 'BY', 'have_cashless' => true, ]); $cache->startDataCache(); $cache->endDataCache($points); return $points; } What is TTN-1 and Why Is It Needed?
For domestic transport within Belarus, legislation requires a TTN-1 waybill. SDEK-BEL can generate it automatically—check conditions in your contract. If you need independent generation, we integrate PDF formation with order and shipment data. In practice, ignoring TTN-1 leads to fines of up to 20 base units during inspections. Our implementation automates document generation, saving up to 40% of managers' time.
Case Study from Our Practice
One client—an electronics store with customers in both Belarus and Russia—used a single handler. Issue: Russian tariffs for Belarusian orders, confusion with BYN. Solution: two separate handlers CdekRuHandler and CdekByHandler, switching by country via OnBeforeCalculate. Result: correct tariffs in BYN, TTN-1 generated, order processing speed doubled, error rate dropped by 25%. Client's order volume: up to 1500 per day. SDEK API v2 documentation.
What's Included in the Work
| Scope of Work | Details |
|---|---|
| Current logistics audit | Analysis of delivery handlers and location codes |
| Setting up SDEK-BEL API | App registration, obtaining credentials |
| Developing CdekByHandler | Tariff calculation, order creation, tracking |
| Displaying pickup points on map | SDEK widget + customization |
| TTN-1 integration | Document generation (optional) |
| Integration with 1C (CommerceML) | Nomenclature and order synchronization |
| Caching pickup point data | Optimizing cart page loading |
| Testing and deployment | Staging verification, manager training |
Estimated timeline: basic integration (calculation + order) — 3–4 days, with pickup points — up to 5 days, full cycle with TTN-1 — up to 7 working days. Pricing is individually assessed based on your volume and complexity.
Why Entrust the Integration to Us?
We've been working with Bitrix for over 10 years and have completed more than 50 SDEK integration projects. These include both small online stores and large catalogs with thousands of orders per day. We guarantee: correct API operation, up-to-date tariffs, and full post-release support. We provide a warranty on all work — free error fixing within 30 days after delivery.
Example of caching pickup points list:
public function getBelarusOfficePoints(): array { $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($cache->initCache(3600 * 6, 'cdek_pvz_by', '/cdek/')) { return $cache->getVars(); } // ... request and caching } Want delivery to work flawlessly? Leave a request for a consultation—we'll assess your project and offer the optimal solution.

