Developing a website for a cleaning company using 1C-Bitrix

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Our competencies:
Development stages

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:

  1. Room Type — toggle buttons: apartment, house, office. Selection determines subsequent field set.
  2. Cleaning Type — routine, general, post-renovation. Loads corresponding tariffs.
  3. Area — slider + number field. Range depends on room type (apartment: 20–200 m², office: 30–1000 m²).
  4. Rooms and Bathrooms — for labor calculation and additional coefficients.
  5. Additional Parameters — checkboxes: has pets, heavy soiling, needs laundry ironing.
  6. Extra Services — list with checkboxes and counters (window washing: 3 pcs., chandelier cleaning: 2 pcs.).
  7. 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 OPPORTUNITY field
  • 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") — OnSaleOrderSaved handler 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_CUSTOMER group 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