Cleaning Company Website Development on 1C-Bitrix
Cleaning business competes primarily on convenience. Customers don't want to call, explain square footage, list additional services, wait for quote. They want to visit site, set parameters in calculator, see price, submit request. Cleaning company website on 1C-Bitrix is built around this calculator — other sections support it, building trust.
Service Catalog
"Services" information block with sections:
- Apartment Cleaning — routine, general, post-renovation, post-move
- Office Cleaning — daily, general, one-time
- Window Washing — standard, specialty windows, mansard, facade (with industrial rope access)
- Furniture Upholstery Cleaning — sofas, carpets, mattresses, chairs
- Specialized — post-fire cleanup, disinfection, commercial facility cleaning (warehouses, retail)
Information block element properties:
| Property | Type | Purpose |
|---|---|---|
PRICE_PER_SQM |
Number | Base rate per m² |
MIN_AREA |
Number | Minimum order area |
MIN_ORDER_SUM |
Number | Minimum order sum |
DURATION_PER_SQM |
Number | Labor minutes per m² (for time calculation) |
INCLUDED_WORKS |
Text | What's included (work list) |
EXTRA_SERVICES |
HL Link (multiple) | Available additional services |
RESULT_PHOTOS |
File (multiple) | Before/after photos |
On detail page — detailed description, work checklist (included/not included), result photos, embedded mini-calculator with current service prefilled.
Cleaning Cost Calculator
Calculator is main conversion element and core engineering task. Must work fast, clearly display price formation, and pull tariffs from admin panel, not hardcoded constants.
Tariff Storage: Highload-block hl_cleaning_tariffs
| Field | Type | Purpose |
|---|---|---|
UF_SERVICE_ID |
Number | Link to service from info block |
UF_ROOM_TYPE |
List | Apartment / House / Office / Commercial |
UF_AREA_FROM |
Number | Area from (m²) |
UF_AREA_TO |
Number | Area to (m²) |
UF_PRICE_PER_SQM |
Number | Rate per m² in range |
UF_COEFF_DIRTY |
Float | Heavy soiling coefficient (1.3) |
UF_COEFF_ANIMALS |
Float | "Has pets" coefficient (1.15) |
UF_ACTIVE |
Boolean | Tariff active |
Tariffs are non-linear — per-m² rate decreases with area increase (degressive scale). Ranges used: up to 40 m² one rate, 40–80 another, 80–150 third. Manager configures this in Highload-block admin without developer involvement.
Extra Services Highload-block (hl_extra_services):
| Field | Type | Purpose |
|---|---|---|
UF_NAME |
String | Name (fridge cleaning, laundry ironing, oven washing) |
UF_PRICE |
Number | Fixed cost |
UF_PRICE_TYPE |
List | fixed / per_unit / per_sqm |
UF_UNIT |
String | Unit (pcs, linear m, window) |
UF_COMPATIBLE_SERVICES |
Multiple Number | Applicable to which main services |
UF_ICON |
File | Icon for calculator |
Calculator Frontend:
Step-by-step interface without page reload:
- Room Type — toggle buttons: apartment, house, office. Selection determines subsequent field set.
- Cleaning Type — routine, general, post-renovation. Loads corresponding tariffs.
- Area — slider + number field. Range depends on room type (apartment: 20–200 m², office: 30–1000 m²).
- Rooms and Bathrooms — for labor calculation and additional coefficients.
- Additional Parameters — checkboxes: has pets, heavy soiling, needs laundry ironing.
- Extra Services — list with checkboxes and counters (window washing: 3 pcs., chandelier cleaning: 2 pcs.).
- Date and Time — calendar with available slot selection.
At each step, final amount recalculates in real-time. Formula:
Total = (Area × Rate_per_m²) × Dirt_Coeff × Pets_Coeff + Extra_Services_Sum
All tariffs and coefficients loaded by single AJAX request on calculator initialization and cached in JavaScript object. Repeat AJAX requests unnecessary — recalculation happens client-side. Tariffs update in cache when Highload-block changes (tagged cache with cleaning_tariffs tag).
Calculation Result displayed as detailed estimate:
General apartment cleaning 65 m² — 4,550 rubles
"Has pets" coefficient ×1.15 — +682 rubles
Window washing (4 pcs. × 350 rubles) — 1,400 rubles
Oven cleaning — 450 rubles
────────────────────────────────────
Total: 7,082 rubles
Under estimate — "Submit Request" button. On click, calculator data serialized to JSON, sent to Bitrix CRM.
Request → CRM
On form submission, CRM lead created with fields:
- Service type, area, extra services — in lead comment (structured text)
- Calculated amount — in
OPPORTUNITYfield - Name, phone, email — contact data
- Date and time — in lead custom field
UF_CRM_PREFERRED_DATE - UTM-tags — auto from cookie
Manager sees lead with ready estimate. No need to re-call, clarify area, calculate manually — everything present. Conversion from lead to deal higher, deal cycle shorter.
Alternative integration — via sale.order.ajax, if company wants online payment. Then calculator forms cart from main service (service product in catalog) and extra positions, order checkout with card payment.
Reviews with Result Photos
"Reviews" information block linked to service. Required properties: customer name, text, rating (1–5 stars), before/after photo (multiple file), cleaning date, service type. Moderation via workflow status (under review → published → rejected).
Before/after photos displayed with slider divider (before/after slider) — user drags slider and sees difference. Implementation via JavaScript library (e.g., img-comparison-slider), component template news.detail loads script if photos present.
Aggregate rating per service calculated by cached component, displayed in catalog. schema.org/AggregateRating micromarkup on service page.
Loyalty Program
Mechanics: on first order customer gets discount coupon for repeat visit. Implementation via sale coupon module:
- After order completion (status "Completed") —
OnSaleOrderSavedhandler generates personal coupon with "Percentage Discount" type and "one-time use" limitation. - Coupon sent via email and SMS.
- After accumulating 5+ orders — customer moved to
LOYAL_CUSTOMERgroup with permanent discount via cart rule.
Bonus balance and order history available in dashboard. sale.personal.section component with customized template.
Technical Nuances
Geolocation: cleaning company serves specific city or region. Homepage auto-detects city by IP (sale module + GeoIP database). If city outside service area — notification displayed.
Mobile Version: over 70% cleaning orders from mobile devices. Calculator must be fully responsive — area slider, service checkboxes, final amount — all work on 360px screen without horizontal scroll.
Loading Speed: calculator must not block page rendering. Script loads asynchronously (defer), tariffs — deferred AJAX request. Visually calculator renders immediately with placeholders, tariffs substituted after loading.
Development Phases
| Phase | Content | Duration |
|---|---|---|
| Design | Tariff model, calculator UX, HL-block structure | 1–2 weeks |
| Service Catalog | Info block, templates, before/after photos | 2 weeks |
| Calculator | Frontend (JS), backend (tariffs from HL), CRM integration | 3–4 weeks |
| Dashboard and Loyalty | Coupons, history, bonuses | 2 weeks |
| Responsive Markup | Mobile version, device testing | 1–2 weeks |
| Content and SEO | Reviews, articles, micromarkup | 1 week |
| Launch | Tariff population, manager training, CRM monitoring | 1 week |

