Hotel Website on 1C-Bitrix: Online Booking and PMS Integration

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.
Showing 1 of 1All 1626 services
Hotel Website on 1C-Bitrix: Online Booking and PMS Integration
Complex
from 1 week to 3 months
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    828
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

A hotel website differs from a regular catalog in that visitors choose a time slot, not a product. A room itself is a set of characteristics (area, capacity, view). But without available dates, it's a dead card. The entire project revolves around the availability calendar and booking mechanics, not around beautiful layout. The problem: visitors see nice photos, but when trying to book — the calendar is not updated or the price does not match the season. Or there is no integration with Booking.com, and the hotel gets overbooked. We solve these problems at the architecture level: booking engine on Highload-blocks, seasonal rates, PMS synchronization.

How the booking system works?

The core of the project is managing room availability. Task: user selects dates, system shows available types with prices, books and locks the room.

Storage of availability — Highload-block RoomInventory. Each row is one night for one physical room.

Field Type Description
UF_DATE date Date (e.g., 2025-07-15 — night from July 15 to July 16)
UF_ROOM_ID integer ID of the physical room
UF_ROOM_TYPE_ID integer ID of the room type
UF_STATUS integer 0 = free, 1 = booked, 2 = blocked, 3 = occupied
UF_BOOKING_ID integer Order ID (from sale module)
UF_RATE float Rate for this night (with season applied)

Highload-block is an ORM wrapper over a table with automatic API. With 100 rooms and a 365-day horizon — 36,500 rows. Required indexes: composite on (UF_DATE, UF_ROOM_TYPE_ID, UF_STATUS) and (UF_BOOKING_ID).

Algorithm for checking availability. Guest enters check_in, check_out, guests. System finds room types with at least one physical room free for all nights.

public function getAvailableRoomTypes(
    \Bitrix\Main\Type\Date $checkIn,
    \Bitrix\Main\Type\Date $checkOut,
    int $guests
): array {
    $nights = $checkOut->getDiff($checkIn)->days;
    $dates = [];
    for ($i = 0; $i < $nights; $i++) {
        $d = clone $checkIn;
        $d->add(new \DateInterval("P{$i}D"));
        $dates[] = $d->format('Y-m-d');
    }

    // Find rooms occupied at least one night
    $busyRooms = RoomInventoryTable::getList([
        'select' => ['UF_ROOM_ID'],
        'filter' => [
            'UF_DATE' => $dates,
            '!UF_STATUS' => 0,
        ],
        'group' => ['UF_ROOM_ID'],
    ])->fetchAll();

    $busyRoomIds = array_column($busyRooms, 'UF_ROOM_ID');
    // Next — exclude occupied rooms and filter by capacity
}

The approach using HAVING COUNT(*) = {$nights} is more correct:

SQL query for availability check
SELECT UF_ROOM_ID, UF_ROOM_TYPE_ID
FROM hl_room_inventory
WHERE UF_DATE IN ('2025-07-15','2025-07-16','2025-07-17')
  AND UF_STATUS = 0
GROUP BY UF_ROOM_ID, UF_ROOM_TYPE_ID
HAVING COUNT(*) = 3

Frontend availability calendar. Two fields — check-in and check-out. Implementation with flatpickr in range mode. On open — AJAX request for an availability matrix: array of dates with a flag "free rooms available". Endpoint returns JSON:

{
  "2025-07": {
    "15": {"available": true, "min_rate": 4500},
    "16": {"available": true, "min_rate": 4500},
    "17": {"available": false, "min_rate": null},
    "18": {"available": true, "min_rate": 6200}
  }
}

Unavailable dates are blocked in the calendar (disable). Minimum rate — on hover. Queries are cached via Bitrix\Main\Data\Cache with key availability_{month}_{year}.

Why seasonal pricing increases profit?

Highload-block RatePlan:

Field Type
UF_ROOM_TYPE_ID integer
UF_DATE_FROM date
UF_DATE_TO date
UF_WEEKDAY_RATE float
UF_WEEKEND_RATE float
UF_PRIORITY integer

When calculating booking cost, the system iterates over each night, finds the applicable rate plan, and sums. Total amount is the sum across all nights.

Room inventory architecture

Each room type is an infoblock element "Room inventory". It is important to separate the type (e.g., "Standard Double") and physical rooms (20 rooms). This is a key architectural decision.

Infoblock structure:

Property Type Purpose
CAPACITY N (number) Capacity (main beds)
CAPACITY_EXTRA N Extra beds (foldaway, baby cot)
AREA N Area, m²
AMENITIES L (list, multiple) Amenities: Wi-Fi, air conditioning, minibar, safe
BED_TYPE L (list) Bed type: double, twin, king
VIEW L (list) View: sea, city, garden, courtyard
FLOOR_RANGE S (string) Floors: "3-5"
GALLERY F (file, multiple) Photo gallery of the room
PANORAMA_URL S Link to 360-panorama
ROOM_COUNT N Number of physical rooms of this type
MIN_STAY N Minimum number of nights
BASE_RATE N Base rate per night (without seasonal surcharges)

Amenities (AMENITIES) — multiple property of type "List". Not a Highload-block, because the set is fixed (30-50 items). On the frontend, values are mapped to icons via config.

Photo gallery and virtual tour. Multiple property of type "File". Rendering — Swiper.js with lazy-loading, preview via CFile::ResizeImageGet() at 600x400 with BX_RESIZE_IMAGE_PROPORTIONAL. For 360-panorama — Pannellum.js: library takes equirectangular image and renders interactive view. Storage — string property PANORAMA_URL. Pannellum is initialized on the client:

pannellum.viewer('panorama-container', {
    type: 'equirectangular',
    panorama: roomData.panoramaUrl,
    autoLoad: true,
    compass: true,
    hotSpots: [
        { pitch: -5, yaw: 120, type: 'info', text: 'Bathroom' },
        { pitch: 0, yaw: 240, type: 'info', text: 'Balcony with sea view' }
    ]
});

Hotspots are set in a JSON infoblock property or in a Highload-block if an admin panel is needed.

How iCal synchronization prevents overbooking?

The hotel sells rooms on the website and through OTAs (Booking.com, Expedia). Without synchronization — overbooking. A Channel Manager syncs availability and rates between PMS, website, and channels.

iCal synchronization — the simplest option. Booking.com and Airbnb provide .ics files. A Bitrix agent runs every 15 minutes:

  1. Fetches .ics via URL (file_get_contents or cURL)
  2. Parses VEVENT — extracts DTSTART, DTEND, SUMMARY
  3. Updates RoomInventory: UF_STATUS = 2 (blocked)
  4. Generates outgoing .ics with bookings from the website

iCal limitation: no rates, up to 15-minute delay. For 100+ rooms, an API connector is needed. XML Push / API — via REST or SOAP (Booking.com Connectivity API). iCal synchronization is 10x simpler than API integration, but less flexible.

PMS integration. 1C:Hotel — exchange via HTTP service. Opera / Fidelio — SOAP with WSDL. We implement a wrapper class over SoapClient with logging.

Online payment and prepayment. Booking via sale module. Order — one item "Stay in {type}, {check_in} — {check_out}". Prepayment (20-30%) — custom handler OnSaleBeforeOrderAdd. Percentage and first night are typical schemes.

Additional modules

Guest personal account: authorization (email + OAuth), my bookings, travel history, loyalty program. Points are accrued via handler OnSaleStatusOrderChange.

Multilingual: language versions (/en/, /de/), content via infoblock properties, hreflang.

SEO and microdata: Schema.org Hotel + HotelRoom + Offer. Markup is generated automatically.

Photo-centric design: WebP with fallback, <picture> with srcset, lazy-load. Originals up to 3000px, preview 800x600.

Reviews: Highload-block Reviews with moderation. Aggregated rating in infoblock property AVG_RATING.

What is included in the work

  • Analytics and prototyping (room inventory map, booking logic)
  • Design (photo-centric UI, mobile version, calendar)
  • Booking core (RoomInventory, availability check, order processing, payment)
  • Integrations (PMS, Channel Manager, payment systems, REST API)
  • Content and SEO (microdata, multilingual, meta templates)
  • Testing and launch (load testing, cross-browser, deployment)
  • Documentation and admin training
  • Post-project support and warranty

Timeline and stages

Scale Timeline
Mini-hotel, 10-20 rooms, basic booking 4–8 weeks
Hotel, 50-100 rooms, Channel Manager, PMS 10–16 weeks
Hotel chain, multisite, loyalty program 16–24 weeks

Timelines do not include photography and 360-panorama creation — that runs in parallel.

Direct booking through the website is 2-3 times more profitable for the hotel than through OTAs, due to no commission. The savings are 15-25% of revenue. The booking system pays for itself on average in 6-12 months due to increased direct sales.

We have been working in hotel development for over 8 years and have completed more than 50 projects for the hotel industry. Our engineers are certified 1C-Bitrix specialists. Order the development of a hotel website — we will select an architecture for your room inventory. Get a consultation on the architecture of your site — we will assess the task and propose a solution.

How to properly design infoblocks?

When developing a 1C-Bitrix website, we see dozens of projects where poor infoblock structure slows down the site. Typical scenario: the client asks for a "product catalog." The developer creates one infoblock catalog, puts 15 properties in it. Six months later – 40 properties, 8 of which are used only for one category. The filter lags, the b_iblock_element_property table grows to millions of rows, CIBlockElement::GetList runs for 3 seconds. Consequences – conversion drop, loss of customers, additional optimization costs. In one project after catalog refactoring, page generation time dropped from 4.2 to 0.8 seconds, and annual support costs were reduced by over $10,000 through eliminated redundant queries and agents.

Our approach: design infoblocks before writing a single line of code. Separate infoblocks for entities (products, categories, brands), dictionary properties via highload blocks, trade offers for SKUs. This builds performance for years. If you want a preliminary audit of your infoblock schema, contact us for a free review of common mistakes and recommendations.

Why 1C-Bitrix outperforms most CMS for business

The choice of CMS is dictated by business needs, not preferences. Native 1C exchange via catalog.import.1c provides two-way synchronization of products, prices, balances, and orders through CommerceML without third-party modules — five times faster than developing custom exchange on OpenCart or WordPress, saving hundreds of thousands of rubles. Proactive security module includes WAF, file integrity control, SQL injection protection, and two-factor authentication; it's certified for FSTEK requirements. Modular architecture lets you enable only needed modules — iblock, catalog, sale, search — reducing DB queries per hit. Regular patches close vulnerabilities faster than open-source projects (average CVE fix time two weeks). Official documentation is maintained on the vendor's site.

What highload blocks are and how they speed up the catalog

Highload blocks are an alternative to extended infoblock properties when the list of values can grow to thousands of entries. Typical example: manufacturers, countries, colors. If stored as list properties in an infoblock, each filter triggers a full scan of b_iblock_property_enum table. With HL-blocks, selection uses indexes – filter response time drops from 1–2 seconds to 50 ms. We use HLB component and custom queries via Bitrix\Highloadblock\DataManager. This is critical for catalogs with 100,000+ items.

From our practice: an online store with 500,000 items. Standard filter by brand took 4 seconds. The server couldn't handle 50 concurrent requests – pages crashed. We moved the brand directory to an HL-block, added tagged caching for 15 minutes, and set up an agent to clear cache on change. After optimization, filter time was 120 ms, average LCP was 1.8 seconds. The project runs stable without failures.

What integrations are critical for 1C-Bitrix stores

Each e‑commerce project requires reliable connections with payments, fiscalization, logistics, and CRM. We integrate YooKassa, CloudPayments, Tinkoff, Apple Pay, Google Pay for payments; ATOL and OrangeData for 54-FZ compliance via sale.cashbox; CDEK, Boxberry, PEC, Russian Post, Yandex.Delivery for logistics; Bitrix24, amoCRM, Roistat, Calltouch, Mindbox for analytics and CRM. All integrations are configured with proper error handling and fallback logic.

What's included in 1C-Bitrix website development

Each project includes a full set of documentation and artifacts to prevent knowledge loss after handover.

  • Technical specification – user stories, infoblock diagrams, integration schemas.
  • Source code in Git – with commit history, release tags, branching rules.
  • Administrative documentation – description of custom components, deployment instructions, list of agents and events.
  • Staff training – up to a 3-hour webinar: admin panel, order management, price settings. Recorded for later review.
  • Access to staging during development – test before production deployment.
  • Warranty support – bug fixes for 30 days after launch. Post-warranty support packages with SLA (response 2 hours, resolution 8 hours).

Our process and technologies

Project type Timeline Complexity Key features
Corporate website from 1 month Medium Catalog, news, forms, CRM integration
Online store from 2 months High 54-FZ, marketplaces, 1C exchange, SKU
B2B portal from 3 months Very high Personal prices, document flow, Bizproc
Landing page from 2 weeks Low LCP < 2s, composite cache, static
Multisite structure from 1.5 months High Separate content, shared catalog, hreflang

Tech stack: mobile-first markup, tested on physical devices (iPhone, iPad, Android). Use BrowserStack for Safari on iOS. Performance goals: LCP < 2.5 s, FID < 100 ms, CLS < 0.1. Enable composite site (composite module), CDN, tagged caching, WebP/AVIF, lazy loading. SEO: Schema.org via JSON-LD, auto-generation of sitemap.xml via seo module, canonical and hreflang for multilingual versions. robots.txt blocks /bitrix/ from indexing. CI/CD: Git, auto-deploy via GitLab CI, staging. DB migrations: sprint.migration module with versioning.

Process:

  1. Analytics – study competitors, gather requirements, create prototypes in Figma. Output: technical specification with user stories.
  2. Design – UI/UX with design system. Components are reusable.
  3. Development – write components with custom templates in local/templates/. Business logic in local/modules/.
  4. Testing – functional, cross-browser, load testing (up to 1000 requests). Critical bugs fixed before launch.
  5. Launch – deploy to production, monitoring via UptimeRobot, alerts in Telegram. Fixes for first 48 hours.

Multilingual support and redesign

Full localization via language files lang/ and SITE_ID mechanism. hreflang for each version. Regional versions with different prices and content – IP detection (main.geo) or manual selection. Multidomain – unified management of multiple domains.

Redesign without losing rankings: performance audit (PageSpeed, WebPageTest), SEO (Screaming Frog). New template in local/templates/ with preserved URL structure. 301 redirects only if URL changes significantly. Kernel update, migration to D7 ORM, infoblock restructuring, migration via sprint.migration with Git.

Guarantee and support

We have been working with 1C-Bitrix for 12+ years, completed 500+ projects. Certified developers on staff. Fixed price in contract – no surprises. Warranty period covers code errors. After warranty, subscription packages with SLA (response time 2 hours, resolution 8 hours). 24/7 availability monitoring, alerts in Telegram. Get a consultation and preliminary estimate: contact us via the form on the website or chat – we'll respond within an hour. Order turnkey development – we'll design infoblocks, integrate 1C, and speed up the catalog. If you already have a site on another CMS, order a performance audit and migration to Bitrix.