Car Wash Website Development on 1C-Bitrix
A car wash website solves one specific problem — maximize bay usage. The customer must find the needed service in 40 seconds, see the cost for their car class, and book available time. Everything else is secondary.
On 1C-Bitrix, this task is closed by a combination of service catalog infoblocks, Highload blocks for scheduling, and the sale module for subscriptions. Let's examine the architecture in detail.
Service Catalog with Pricing by Car Class
Car wash services are not a flat list. Washing a sedan body and washing an SUV body cost differently. Therefore, a standard infoblock with just a single "Price" property doesn't work.
Structure of the "Services" infoblock:
- Title — body wash, interior cleaning, polishing, detailing, nano-ceramic coating
- Category — express, standard, premium (reference property)
- Duration — execution time in minutes (numeric property)
- Process description — what exactly is included, which materials are used
Pricing is implemented through trade offers (SKU). Each offer is a car class: small (B-class sedan), medium (crossover), large (SUV/minibus). Each SKU has its own price. The customer selects their car class once on the site — the filter is remembered in the session and substitutes the correct prices throughout the catalog.
For complex services (detailing, pre-sale preparation), a "Composition" property is added — reference to other infoblock elements of type E. This allows showing that the detailing package includes body polishing, interior cleaning, and plastic treatment, with automatic total duration calculation.
Online Booking: Bay Schedule via Highload Blocks
This is the core of the car wash website. Implementation through standard infoblocks is too slow — with 6 bays and 30-minute slots per day, over ~180 records accumulate. In a month — over 5000. A Highload block handles this volume without degradation.
"Schedule" Highload block:
| Field | Type | Purpose |
|---|---|---|
| UF_BOX_ID | Integer | Bay ID (1-6) |
| UF_DATE | Date | Booking date |
| UF_TIME_START | String | Slot start (08:00, 08:30...) |
| UF_TIME_END | String | Slot end |
| UF_SERVICE_ID | Integer | Link to service infoblock element |
| UF_STATUS | List | free / booked / in_progress / done |
| UF_CLIENT_PHONE | String | Client phone |
| UF_CAR_CLASS | List | Car class |
| UF_ORDER_ID | Integer | Link to sale order (for subscriptions) |
Grid formation logic. When opening the booking page, the component receives the current date, makes a query from the Highload block by UF_DATE and UF_BOX_ID, builds a grid "bay × time". Free slots are clickable, occupied ones are gray. Service duration determines how many consecutive slots are blocked: if polishing takes 90 minutes, selecting the 10:00 slot automatically reserves 10:00, 10:30, and 11:00.
Slot generation occurs via cron agent (CAgent), which every night creates slots for 14 days ahead. The agent considers the car wash schedule (infoblock properties "Settings") and excludes weekends/holidays.
Double-booking protection — when confirming a booking, the UF_STATUS of selected slots is checked in a transaction. If between the grid display and the "Book" click the slot was taken — the client gets a message and an updated grid.
After successful booking, an event handler is triggered, which sends SMS through messageservice and adds a deal to Bitrix24 CRM (if integration is configured).
Subscriptions and Loyalty Program
Subscriptions are implemented through the sale module as service-type products. A 5-wash subscription — a product with an additional UF_REMAINING property (remaining visits) in the "Client Subscriptions" Highload block.
With each booking using a subscription, the UF_REMAINING value decreases by 1. When the balance reaches 2 — the client receives a renewal reminder.
The loyalty program is built on built-in cumulative discounts of the sale module. User groups (Silver, Gold, Platinum) are assigned automatically based on order amounts through the OnSaleOrderSaved handler. The discount is applied when placing the next booking.
Technical Aspects
- Responsiveness — 70%+ clients book from their phone, stuck in traffic. The schedule grid on mobile is displayed as horizontal swiping across bays
- Speed — composite caching is enabled for the catalog, schedule loads via AJAX request to the controller (not cached)
- Notifications — SMS on booking, reminder 2 hours before, review request 1 hour after visit







