Transport Company Website Development on 1C-Bitrix
A transport company website is not a brochure with photos of buses. A customer arrives with a specific task: find out if there's a flight from Minsk to Moscow on Friday, how much it costs to rent a bus for 45 people, can I order airport transfer. If the answer can't be gotten in a few clicks — the customer goes to an aggregator.
The central element of such a site is an online booking system with cost calculation based on a tariff grid. Let's examine its architecture.
Service Catalog
Transport company services are diverse, affecting structure. "Services" infoblock with sections:
- Regular Routes — Minsk to Moscow, Minsk to Vilnius, schedule by days
- Bus Rental — hourly, daily, event-based
- Corporate Transfers — employee transportation, contract-based service
- Excursion Tours — city routes, tours
Each service type requires different parameters for booking. Regular route — select date and number of seats. Bus rental — route, date, number of hours, transport type. Excursion — fixed route with fixed per-person price.
For this, separate infoblocks are created or a unified infoblock with conditional properties, active depending on section.
Online Booking with Tariff Grid
Booking — a multi-step form that collects trip parameters and calculates cost by tariffs. Let's examine architecture using bus rental as an example.
Step 1: Trip Parameters. Customer fills in:
- From where to where (cities, addresses)
- Date and time of pickup
- Number of passengers
- Trip type: one-way / round-trip / hourly rental
- Additional: luggage, child seats, Wi-Fi in cabin
Step 2: Choose Vehicle. Based on passenger count, system filters fleet and offers suitable options. Customer sees photo, characteristics, comfort class.
Step 3: Calculate Cost. Here the tariff grid works.
Highload Block TariffGrid:
| Field | Type | Purpose |
|---|---|---|
| UF_VEHICLE_TYPE | enumeration | Minibus / Midsize Bus / Large Bus |
| UF_COMFORT_CLASS | enumeration | Standard / Comfort / VIP |
| UF_TARIFF_TYPE | enumeration | Per km / Per hour / Fixed Route |
| UF_PRICE_PER_UNIT | float | Price per unit (km or hour) |
| UF_MIN_HOURS | integer | Minimum order in hours |
| UF_MIN_PRICE | float | Minimum order cost |
| UF_CITY_FROM | string | Departure city (for fixed routes) |
| UF_CITY_TO | string | Arrival city |
| UF_FIXED_PRICE | float | Fixed route price |
| UF_SEASON | enumeration | Low / High / Holiday |
| UF_VALID_FROM | date | Tariff start date |
| UF_VALID_TO | date | Tariff end date |
Highload Block TariffSurcharge — surcharges:
| Field | Type | Purpose |
|---|---|---|
| UF_TYPE | enumeration | Night Pickup / Holiday / International / Luggage |
| UF_SURCHARGE_TYPE | enumeration | Percent / Fixed Amount |
| UF_VALUE | float | Surcharge value |
| UF_VEHICLE_TYPE | enumeration | Applies to vehicle type |
Calculation Algorithm for Km-based Rental:
- Determine distance between points. Options: Google Distance Matrix API, OSRM (open-source), distance reference in separate Highload Block
RouteDistance(for popular routes) - Select tariff from
TariffGridby vehicle type, comfort class, and date (season) - Base cost = distance *
UF_PRICE_PER_UNIT - Check minimum: if base <
UF_MIN_PRICE, takeUF_MIN_PRICE - Apply surcharges from
TariffSurcharge: night pickup (before 7:00 or after 23:00), international route, holiday - For "round-trip" — double kilometers but with coefficient 0.85-0.9 (return trip discount)
$tariff = TariffGridTable::getRow([
'filter' => [
'UF_VEHICLE_TYPE' => $vehicleType,
'UF_COMFORT_CLASS' => $comfortClass,
'UF_TARIFF_TYPE' => 'per_km',
'<=UF_VALID_FROM' => $tripDate,
'>=UF_VALID_TO' => $tripDate,
],
]);
$basePrice = max(
$distance * $tariff['UF_PRICE_PER_UNIT'],
$tariff['UF_MIN_PRICE']
);
// Surcharges
$surcharges = TariffSurchargeTable::getList([
'filter' => ['UF_VEHICLE_TYPE' => $vehicleType],
])->fetchAll();
foreach ($surcharges as $s) {
if (isSurchargeApplicable($s, $tripDate, $tripTime, $isInternational)) {
$basePrice = applySurcharge($basePrice, $s);
}
}
For Hourly Rental calculation is simpler: hours * hourly rate, with minimum check. For fixed routes — take UF_FIXED_PRICE directly.
Step 4: Complete Order. After calculation, customer confirms booking. An order is created through \Bitrix\Sale\Order::create(). Order properties contain all trip parameters: route, date, vehicle type, calculated cost. Payment — prepayment 30-50% via online acquiring or full payment at boarding.
Fleet
"Fleet" infoblock — card for each vehicle:
- Type — minibus, midsize bus, large bus
- Capacity — number of passenger seats
- Comfort Class — standard, comfort, VIP
- Features — air conditioning, Wi-Fi, outlets, TV, toilet, luggage compartment
- Photos — multiple file property, gallery of exterior and interior
- Year, brand/model
On fleet catalog page — filter by capacity and class. During booking — automatic vehicle selection by passenger count: if customer specifies 20 people, show buses with 20+ seats.
Flight Tracking
For regular routes, real-time tracking is relevant. Implementation:
- GPS trackers on transport send coordinates to server (WIALON, Galileosky or custom receiver)
- On Bitrix side — custom page with map (Yandex.Maps API or Leaflet)
- Coordinates pulled via AJAX every 30-60 seconds from tracker API
- Customer enters flight number or selects from schedule, sees point on map and estimated arrival time
GPS integration is a separate module. Bitrix acts as frontend, tracker — data source. No need to store coordinate history in Bitrix — it stays in monitoring system.
B2B Portal for Corporate Clients
Corporate clients are the main revenue source. They need not a public site but a closed portal:
- Contract-Based Authorization — company manager logs in with own account
- Submit Requests — order form with pre-configured routes (daily employee transfer)
- Acts and Invoices — export documents from 1C via integration
- Order History — all trips under contract with filtering by date, route
- Balance — prepaid account with payment and deduction history
Implemented through Bitrix user groups with access restrictions to site section. Document circulation — via 1C:Accounting integration (HTTP services).
SEO for Route Queries
Transport companies get main search traffic from queries like "bus Minsk Moscow," "airport transfer Minsk." For each popular route, a landing page is created — element of "Routes" infoblock with SEO fields: ELEMENT_META_TITLE, ELEMENT_META_DESCRIPTION, unique route description, schedule, and embedded booking widget.
For landing page generation, template approach can be used: one template of bitrix:news.detail component with substituted route data. SEO texts are unique — templated texts with city substitution are long recognized by search engines.
Implementation Timeline
| Scale | Scope | Timeline |
|---|---|---|
| Small Carrier (5-10 Routes) | Service catalog, fleet, request form, route pages | 6-8 weeks |
| Medium Company | + online booking with tariff grid, payment, schedule | 12-16 weeks |
| Large Carrier | + B2B portal, GPS tracking, 1C integration, multilingual | 20-26 weeks |
Technical Note
Distance calculation is a bottleneck. Google Distance Matrix API is paid and has limits. For popular routes, better to pre-calculate distances and save in Highload Block RouteDistance, calling API only for non-standard queries. This reduces both API cost and calculator response time.







