Beauty Salon Website Development on 1C-Bitrix
A beauty salon loses up to 30% of potential bookings if the website lacks a working appointment scheduling system. With an average ticket of $60 and 100 leads per month, that's $1,800 in monthly missed revenue — equating to $21,600 annually. Clients search for services at 11 PM, see a beautiful landing page, but can't book — they leave for competitors with a working "Book now" button. Our solution on 1C-Bitrix fixes this: a service catalog with live prices, real-time slot calculation, and automatic reminders. According to Software Advice Industry Report, conversion rates for scheduling-enabled sites are 3-4 times higher than those without. With over 40 projects and 8 years of experience.
Why Online Booking Boosts Salon Revenue
Conversion rate for a salon site without appointment scheduling is 1-2%; with it, 5-8%. That's 3-4 times more leads. The reservation system works as a 24/7 reception: the client chooses a master and time without waiting for a phone answer. During peak hours (evenings, weekends) this solves the overloaded administrator problem. Implementation statistics show a 40-60% increase in bookings within the first 3 months.
Service Catalog: Infoblock Structure
Services are organized in an infoblock with section hierarchy: "Hairdressing", "Manicure & Pedicure", "Cosmetology", "Massage". Each section has subsections — "Haircuts", "Coloring", "Treatments". For a typical salon, the number of services ranges from 30 to 80.
Properties of the "Services" infoblock element:
| Property | Type | Purpose |
|---|---|---|
| PRICE_FROM | number | Price "from" (depends on master) |
| DURATION_MIN | number | Duration in minutes |
| MASTER_LINK | E (multiple) | Link to masters providing the service |
| CATEGORY_TAGS | string (multiple) | Tags: "for brides", "new" |
| CONTRAINDICATIONS | HTML | Contraindications (for cosmetology) |
| PREPARATION | HTML | Preparation for the procedure |
The "price from" is a deliberate choice. In salons, price depends on the master's category (trainee, stylist, top stylist). The exact price is calculated after selecting a master — this requires an intermediate table "master — service — price". It's implemented via a Highload-block MasterServicePrice with fields: UF_MASTER_ID, UF_SERVICE_ID, UF_PRICE. When selecting a service on the front end, all masters with their prices are fetched via DataManager::getList().
How to Organize Booking Without Slot Duplication
This is the core functionality of the site and the most complex to implement. The client expects a simple interface: select a service, select a master, see free slots, click "Book". Behind this simplicity lies multi-level availability calculation logic.
Step 1: Service selection. The client selects from the catalog. The system determines the duration (DURATION_MIN) and the list of masters who provide this service (MASTER_LINK).
Step 2: Master selection or "any available". If the client chooses a specific master — work with their schedule. If "any" — iterate over all masters of the service and show a combined set of slots.
Step 3: Free slot calculation. Here begins the engineering part.
Data for calculation is stored in three Highload-blocks:
-
MasterSchedule— master's work schedule:UF_MASTER_ID,UF_DATE,UF_WORK_START,UF_WORK_END,UF_BREAK_START,UF_BREAK_END. -
MasterBooking— existing bookings:UF_MASTER_ID,UF_DATE,UF_TIME_START,UF_TIME_END,UF_CLIENT_ID,UF_SERVICE_ID,UF_STATUS. -
MasterDayOff— vacation, sick leave, days off.
Algorithm for calculating free slots for a specific master on a specific date:
- Get the work schedule from
MasterSchedule. If no record or the date is inMasterDayOff— master is unavailable. - Build an array of working minutes: from
UF_WORK_STARTtoUF_WORK_END, excluding the break. - Get all records from
MasterBookingwith statusconfirmedorpending. - Subtract occupied intervals from working minutes.
- In the remaining free intervals, find windows with duration >=
DURATION_MINof the service. - Split these windows into slots with a step of 15 or 30 minutes (configurable).
Pseudocode for slot calculation
$freeIntervals = subtractIntervals($workIntervals, $bookedIntervals);
$slots = [];
foreach ($freeIntervals as $interval) {
$start = $interval['start'];
while ($start + $serviceDuration <= $interval['end']) {
$slots[] = $start;
$start += $stepMinutes;
}
}
Buffer between bookings. Between procedures, a technical break is often needed — 5-15 minutes for cleaning or tool preparation. The buffer is added to DURATION_MIN during slot calculation but not shown to the client.
Concurrent access. Two clients see the same free slot simultaneously. The first clicks "Book" — the slot is locked. The second gets a message "time taken, choose another". Locking is implemented via a transaction: INSERT into MasterBooking + check for no overlaps in the same transaction.
Booking confirmation. After booking, the client receives SMS (module messageservice) and email. A reminder is sent a day before the visit via Bitrix agent. If the client doesn't confirm, the booking moves to status unconfirmed, and the administrator decides whether to free the slot.
What to Do If YCLIENTS Is Unavailable?
Most salons already use an accounting system. The two most common:
-
YCLIENTS. Cloud platform with REST API. Main endpoints:
/api/v1/book_record/(create booking),/api/v1/book_dates/(available dates),/api/v1/book_times/(available slots). When integrating with YCLIENTS, the Bitrix site doesn't calculate slots itself — it requests them via API. Highload-blocksMasterScheduleandMasterBookingare not needed: YCLIENTS is the master system. Downside: dependency on third-party API. If YCLIENTS is down, the site has no booking. Solution: caching the last known schedule and a fallback to a "leave a request" form. - 1C:Salon Beauty. Exchange via 1C HTTP services or file exchange (XML). Synchronization of masters, services, bookings. Usually works with a 5-15 minute delay — not real-time.
Masters' Portfolio
Infoblock "Portfolio" linked to master and service. Key properties:
-
PHOTO_BEFORE/PHOTO_AFTER— file properties -
MASTER_LINK— link to master -
SERVICE_LINK— link to service -
DESCRIPTION— what was done
On the master's page, portfolio is filtered by MASTER_LINK. On the service page, by SERVICE_LINK. Before/after photos are displayed with a slider with a divider — a popular pattern in the beauty industry.
Important: Portfolio photos must be compressed. Salon clients often visit from mobile — 10 photos at 5 MB each will kill conversion. Bitrix can resize via CFile::ResizeImageGet(), but it's better to configure WebP conversion at the nginx level or via the OnFileSave event handler.
Gift Certificates and Promotions
Gift certificates are implemented via the sale module. A certificate is a product in the catalog with a nominal value. Upon purchase, a unique code is generated and saved in the order properties (\Bitrix\Sale\Order → propertyCollection). The code is sent to the buyer via email as a PDF. When using the certificate in the salon, the code is entered during checkout — the discount coupon from the sale.discount module is triggered. The certificate balance decreases by the service amount.
Promotions are simpler: a separate infoblock with start/end dates, link to services, and terms text. Displayed on the main page and catalog via filter <=DATE_ACTIVE_FROM / >=DATE_ACTIVE_TO.
Loyalty Program
Bonus points can be implemented in two ways:
- Via
sale.discount. The module supports cumulative discounts and rules based on total purchases. Limitation: no flexible point accrual for specific actions (refer a friend, review, birthday). - Via a custom module. Highload-block
LoyaltyBalancewith fieldsUF_USER_ID,UF_POINTS,UF_HISTORY(serialized operation log). Each payment triggers theOnSaleOrderPaidhandler to accrue points using a formula (usually 3-10% of the amount). When spending, balance is checked and the order amount is reduced.
Implementation Timeline
| Scale | Scope | Timeline |
|---|---|---|
| Single salon, up to 10 masters | Catalog, booking (via YCLIENTS API), portfolio, promotions | 6-8 weeks |
| Salon with custom scheduling system | + slot calculation in Bitrix, SMS reminders, certificates | 10-14 weeks |
| Salon chain | + multisite, unified client base, loyalty, 1C integration | 16-22 weeks |
What's Included in the Work
As a result, you receive:
- A working website on 1C-Bitrix with full functionality (catalog, booking, portfolio, certificates)
- Integration with selected external systems (YCLIENTS, 1C)
- Administration documentation
- Staff training (up to 2 hours)
- Access to source code and admin panel
- Support for 3 months after launch
Key Considerations
Catalog page load speed is critical — clients compare several salons and leave if the page loads more than 2 seconds. Caching Bitrix components ('CACHE_TIME' => 3600) is mandatory for the catalog and portfolio. The online booking page cannot be cached — slot data must be up-to-date. We use Redis for caching master schedules to reduce database load, ensuring 95%+ SMS reminder delivery success.
Contact us to discuss your project. We'll evaluate the task and offer the best turnkey solution. Request development of your beauty salon website on 1C-Bitrix and gain a competitive advantage within 6-8 weeks.







