Every day, a dispatcher spends 2-3 hours manually planning routes. Couriers fail to deliver all orders on time, and repeat trips increase fuel costs. Integrating 1C-Bitrix with route optimization APIs solves these problems: algorithms find the optimal route in seconds, accounting for traffic, time windows, and vehicle load. Our team has completed 30+ such integrations for businesses with fleets from 1 to 100 vehicles, with 5 years of experience. Experience shows that after implementation, planning time drops to 10 minutes, and mileage decreases by 15-25%. We guarantee stable integration at all stages.
The route optimization problem (Vehicle Routing Problem, VRP) is NP-hard, according to Wikipedia. In practice, commercial services handle it: Yandex.Marshruization, Route4Me, Routific, OptimoRoute. They process 10,000 points in seconds—10 times faster than custom solutions. Google's free OR-Tools also delivers excellent results. We integrate any of them into your Bitrix CRM via a universal adapter. Certified engineers will select the best service for your budget.
Problems We Solve
- Long manual planning: the logistician spends 2-3 hours in the morning. Automation reduces this to 10 minutes.
- Overloaded routes: without optimization, a courier drives an extra 50 km per day. The optimizer reduces mileage by 15-25%, saving fuel costs (e.g., $200/month for a medium fleet).
- Geocoding errors: if an address isn't converted to coordinates, the vehicle goes to the wrong place. We geocode during order import using up-to-date databases.
Dispatcher time savings: 2 hours per day. Logistics cost reduction: up to 25%, typically saving $300-$800/month.
How to Choose an Optimization Service for Your Business
| Service | Features | Pricing Model |
|---|---|---|
| Yandex.Marshruization | Russian infrastructure, good geocoding database | Requests + courier warehouse |
| Route4Me | Flexible API, time windows, multi-depot | Subscription from $189/month |
| Routific | Simple API, suitable for small fleets | Subscription from $99/month |
| OptimoRoute | Priorities, driver skills | Subscription from $129/month |
| OR-Tools | Free, self-hosted, requires Python server | Own servers |
The choice depends on the number of vehicles and order volume. For 1-3 vehicles: Routific or Yandex; for 10+: Route4Me with multi-depot. We help you choose.
Integration Architecture
Workflow:
- In the morning, an agent collects orders for today with status 'To deliver' from
b_sale_order. - Forms a list of points with addresses, coordinates, and time windows.
- Sends a request to the optimizer's API.
- Saves the routes in
bl_delivery_routes. - Assigns drivers via CRM or manually.
- Upon delivery completion, a webhook from the optimizer updates order statuses.
Case Study: Automation for a Delivery Network
For a network of 15 vehicles with multi-depot, we integrated Route4Me. Planning time decreased from 3 hours to 15 minutes, mileage by 20%, saving the client $500/month. The client received a route map in the admin panel and automatic customer notifications.Why Integration via an Adapter Is Reliable
We implement the adapter pattern—one interface, multiple implementations:
interface RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array;
}
class YandexRouteOptimizer implements RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array
{
$payload = [
'depot' => $depot,
'vehicles' => $vehicles,
'orders' => array_map(fn($o) => [
'id' => (string)$o['order_id'],
'point' => ['lat' => $o['lat'], 'lon' => $o['lon']],
'time_window' => [$o['time_from'], $o['time_to']],
'service_duration' => 300,
], $orders),
];
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Content-Type', 'application/json');
$http->setHeader('X-Ya-Courier-Request-Id', uniqid());
$response = $http->post(
'https://courier.yandex.ru/api/v1/companies/' . $this->companyId . '/routes',
json_encode($payload)
);
return json_decode($response, true);
}
}
class Route4MeOptimizer implements RouteOptimizerInterface
{
public function optimize(array $depot, array $vehicles, array $orders): array
{
// Route4Me-специфичная логика
}
}
The specific implementation is chosen via a factory method and configured in b_option.
Transforming Order Data
A key point is correctly converting Bitrix data into the optimizer's API format. The address must be geocoded into coordinates (if not done at order placement), and time windows must be converted to the optimizer's format. Product data can be imported via CommerceML, simplifying weight and volume loading.
function buildOrderPoint(\Bitrix\Sale\Order $order): array
{
$props = $order->getPropertyCollection();
return [
'order_id' => $order->getId(),
'lat' => (float)$props->getItemByOrderPropertyCode('LAT')?->getValue(),
'lon' => (float)$props->getItemByOrderPropertyCode('LON')?->getValue(),
'time_from' => $this->toUnix($props->getItemByOrderPropertyCode('DELIVERY_TIME_FROM')?->getValue()),
'time_to' => $this->toUnix($props->getItemByOrderPropertyCode('DELIVERY_TIME_TO')?->getValue()),
'weight_kg' => $this->getBasketWeight($order->getBasket()),
'volume_m3' => $this->getBasketVolume($order->getBasket()),
'priority' => (int)$props->getItemByOrderPropertyCode('DELIVERY_PRIORITY')?->getValue(),
];
}
Storing and Displaying Routes
Structure of the bl_delivery_routes table:
route_id — Route ID from the optimizer
route_date — Delivery date
vehicle_id — Vehicle ID
driver_id — CRM contact for the driver
stops_json — JSONB ordered list of stops
total_distance — Total mileage in km
estimated_time — Estimated time in minutes
status — planned / in_progress / completed
created_at
The route is displayed on a map in the administrative section using Yandex.Maps API or Leaflet.js. The driver receives a link with waypoints.
Updating Order Statuses
Upon delivery completion at a point, the optimizer (or the driver via a mobile app) sends an event. A Bitrix webhook updates the status of the specific order:
// /bitrix/route_webhook.php
$data = json_decode(file_get_contents('php://input'), true);
foreach ($data['completed_stops'] as $stop) {
$order = \Bitrix\Sale\Order::load((int)$stop['order_id']);
if ($order) {
$order->setField('STATUS_ID', 'F');
$order->save();
// Sending an email to the client about delivery
}
}
Timeline by Scale
| Scale | Features | Timeline |
|---|---|---|
| Small (1-3 vehicles) | Single adapter, manual driver assignment | 3-5 days |
| Medium (5-20 vehicles) | Auto-assignment, route map, status webhooks | 8-12 days |
| Large (20+ vehicles) | Multi-depot, driver skills, real-time tracking | 20-35 days |
What's Included
- Development of the
RouteOptimizerInterfaceinterface with adapters for your services (1-3 days for the first adapter) - Configuration of an order collection agent that sends data to the optimizer in the morning
- Creation of the
bl_delivery_routestable for storing routes and statuses - Implementation of a route map in the administrative section
- Setup of a webhook to update order statuses upon delivery completion
- Documentation of the architecture and training for logisticians (1-2 hours)
- 30 days of support after handover
Integration is delivered turnkey. We will assess your project within 1 day. To order the integration, contact us—we'll help you set up delivery automation.







