Dry Cleaning Website Development on 1C-Bitrix
A visitor lands on your dry cleaning site, sees great photos, but can't quickly calculate the cost of cleaning a down jacket. They leave for another site. Solution: a live calculator integrated with CRM and one-click order submission. We implement this on 1C-Bitrix in 4–8 weeks. We offer a free project estimate—contact us.
A dry cleaning site solves a specific task: the client must understand the cost of processing their item and submit an order—ideally in one visit, without calls or clarifications. On 1C-Bitrix, this is achieved through a combination of infoblocks, Highload blocks with a price matrix, and an order form linked to CRM. Over 10 years of Bitrix development experience ensures reliability and performance.
Service Catalog Structure with Infoblocks
Dry cleaning services are grouped into categories: clothing, carpets and carpeting, curtains and textiles, leather and suede, wedding dresses, upholstered furniture. Each category is a section of the Services infoblock. Items inside are specific services: "Dry cleaning of down jacket", "Carpet cleaning 2×3 m", "Leather jacket restoration".
Infoblock element properties:
- PROPERTY_MATERIAL — material type (multiple, directory)
- PROPERTY_MIN_PRICE — price from (for catalog display)
- PROPERTY_DURATION — completion time in working days
- PROPERTY_COMPLEXITY — processing complexity (standard / increased / premium)
- PROPERTY_PHOTO_BEFORE_AFTER — before/after gallery (multiple file)
For output, the bitrix:catalog.section.list component is used with a custom template. The service card shows a photo, price range, duration, and a "Calculate cost" button that opens the calculator pre-filled with the category.
How the Calculator on Bitrix Works
The calculator is the key element of the site, and its architecture deserves a detailed breakdown. It is based on a three-dimensional price matrix stored in the Highload block CleaningPrices. The price depends on three parameters: item type, material, and degree of soiling.
Price Matrix
Stored in the HL block CleaningPrices:
| HL block field | Type | Example value |
|---|---|---|
| UF_ITEM_TYPE | Link to directory | Down jacket |
| UF_MATERIAL | Link to directory | Polyester |
| UF_CONTAMINATION | List | light / medium / heavy |
| UF_BASE_PRICE | Number | base price |
| UF_EXPRESS_COEFF | Number | 1.5 |
| UF_EXTRA_SERVICES | JSON | {"waterproofing": 500, "deodorization": 300} |
Directories ItemTypes and Materials are separate HL blocks. This allows the manager to add new item types and materials without a developer. Links between them define valid combinations: leather applies to jackets but not to bed linen.
Frontend Logic
The calculator is implemented as a step-by-step form (wizard):
- Step 1 — Item type. Visual selection with icons: jacket, dress, carpet, curtains. Upon selection, an AJAX request loads available materials for that type.
- Step 2 — Material. The list is filtered by item type. For inexperienced users, hints with texture photos.
- Step 3 — Degree of soiling. Three options with visual examples: light (dust, surface stains), medium (stubborn stains, odor), heavy (oil, paint, mold).
- Step 4 — Additional services. Checkboxes: water-repellent impregnation, deodorization, anti-moth, packaging. The cost is pulled from the
UF_EXTRA_SERVICESfield. - Result. Total cost with breakdown: base price + additional services. Optionally, express processing cost (×UF_EXPRESS_COEFF).
Server Side
AJAX controller CleaningCalculator extends Bitrix\Main\Engine\Controller. The calculateAction() method accepts item type ID, material, soiling level, and an array of additional services. It queries the HL block via D7 ORM:
CleaningPricesTable::getList([
'filter' => [
'UF_ITEM_TYPE' => $itemTypeId,
'UF_MATERIAL' => $materialId,
'UF_CONTAMINATION' => $contamination
]
])
If an exact match is not found (client selected a rare material), the default price for the item type is used with the note "exact cost after inspection".
More details: official D7 ORM documentation
Matrix Caching
On the first request, the entire price matrix is loaded into Bitrix\Main\Data\Cache with the tag cleaning_prices. When any HL block element changes, the tag is cleared via the OnAfterUpdate event handler. This eliminates database queries on every calculation—pages load 2-3 times faster.
How to Organize Online Ordering with Courier Call
After the cost calculation, the client fills out an order form:
- Contact details (phone, name)
- Pickup address (with suggestions via DaData API)
- Date and time slot for pickup (agent daily generates slots for the next 7 days)
- Comment (description of stains, special wishes)
The order creates a lead in the Bitrix24 CRM module via REST API. The lead card already contains: service, estimated cost, address, pickup slot. The manager only needs to confirm the order and assign a courier.
For SMS notifications, a provider is connected via the messageservice module. The client receives SMS at each stage: "Courier has left", "Items received", "Order ready", "Courier will deliver today from 2 to 4 PM".
Order Tracking
A "Check order status" form is placed on the site. The client enters the order number and the last 4 digits of the phone. The system searches for an item in the Orders infoblock and displays the current status with a timeline:
| Stage | Status |
|---|---|
| Application accepted | Completed |
| Courier picked up items | Completed |
| Inspection and evaluation | Completed |
| Dry cleaning | In progress |
| Quality control | Pending |
| Delivery to client | Pending |
Statuses are updated by the operator in the admin panel or automatically via a webhook from the dry cleaning accounting system (1C:Enterprise, StoryClean, or custom ERP).
Cumulative Loyalty Program
For regular clients, a cumulative system is implemented. The sale module with internal user accounts is used. Upon order payment, bonus points are awarded (percentage of the amount is configured in the HL block LoyaltySettings).
Mechanics:
- Registration by phone number (authorization via SMS code,
mainmodule with custom handler) - Personal account: order history, bonus balance, favorite addresses
- Bonus redemption on the next order (limit — no more than 30% of the amount)
- Referral program: client shares a link; when a new client orders, both receive bonuses
The bonus balance is stored in the user's UF field UF_BONUS_BALANCE. Accrual and deduction are logged in a separate HL block BonusTransactions for transparency and auditability.
SEO Optimization for Local Search
Dry cleaning is a local business. Main queries include geography: "dry cleaning down jackets Minsk", "carpet cleaning Frunzensky district".
What we set up:
- Schema.org
DryCleaningOrLaundrymicrodata with address, working hours, service area - Landing pages for districts — via the
GeoPagesinfoblock with coordinate binding - Auto-generation of title and description by template: "Dry cleaning {item_type} in {district} — from {min_price} RUB"
- Before/after pages with alt tags by soiling type — work for image search
- Bitrix SEO module for managing robots.txt, sitemap.xml, canonical URLs
Component caching is configured with geo in mind: for each city/district, a separate cache variant via CACHE_GROUPS.
What's Included in the Dry Cleaning Site Work
| Stage | Description |
|---|---|
| Analysis and prototyping | Catalog structure, price matrix, user scenarios |
| Design concept | Responsive interface, visual calculators, before/after galleries |
| Development on 1C-Bitrix | Infoblocks, HL blocks, calculator component, CRM integration |
| Integrations | 1C, CDEK, SMS gateways, DaData, payment systems |
| Content filling | Up to 30 services, photos, descriptions, meta tags |
| Testing and launch | Load testing, SEO audit, monitoring |
| Employee training | Admin panel, orders, bonuses |
| Warranty and support | 30 days of free technical support after launch |
We have over 10 years of hands-on experience with 1C-Bitrix and Bitrix24, having completed more than 50 projects. Get an engineer's consultation on your project — our estimate is free.







