Skip to main content

A Direct Booking Engine That Sells Packages, Long Stays and Specific Rooms

Frontdesko's free booking engine can sell a package as one all-in price, discount longer stays, say why a search found no rooms, and open on one room from a link on your website. Below: one illustrative day, then the settings and limits.

By the Frontdesko team · Last updated: October 31, 2026

One Friday at a Guesthouse That Sells a Sauna Weekend

Illustrative scenario. A 9-room guesthouse with a wood-fired sauna is a made-up property used to show the screens in order. It is not a customer story, and no figures here are real results.

The prices below are made up, but the arithmetic is the one the booking engine uses.

TimeWhereWhat happens
08:15Admin → PackagesThe owner creates "Standard + Sauna" with the code SAUNA. Sauna is a service costing 12, billed Once per stay for each Guest. She sets Stay-length discount from (nights) to 2 with the type Fixed / room / night and a value of 6.50, then switches on Show in booking engine. A live example line shows what a stay adds on top of the room rate.
08:40Admin → Rates & Billing → Rate PlansFor room-only guests she adds a long-stay tier to the rate plan: stays of 7 nights and more get 15% off. The tier editor checks for overlaps and warns if a gap would make a longer stay dearer per night.
09:30Admin → Website WidgetUnder Get the code she picks Wix, sets the default currency in Appearance & defaults (Wix runs embeds in an isolated frame, so a cookie-based currency choice would not carry over) and copies the snippet. The Wix steps tell her to make the embed box at least 1400px tall and turn on scrolling on overflow.
10:00Website Widget, room links tableThe page lists each room type with its code and a copy button for a ready-made Book this room link. She pastes the link behind the button on the website's Sauna Suite page.
14:20A visitor's searchA visitor searches one night for a weekend that has a 3-night minimum. Instead of a bare "no rooms available" the widget says "Minimum stay for these dates is 3 nights" with a Search 3 nights button that re-runs the search with the check-out moved out.
14:25Another visitor's searchA second visitor picks a Sunday on which every room type is closed to arrival. The widget says "Check-in isn't possible on this date" and suggests another arrival day.
15:05The room cardsA two-night search lists each room with a choice of Room only or Standard + Sauna. The package shows the full stay price in one figure and "Includes: Sauna", never the sauna's own price. A room-only card shows the plan's long-stay saving when a tier applies, as "Long-stay discount 15% · you save" plus the amount.
17:00Reservation detail (staff)The booking arrives with the package attached. Staff can see the split between accommodation and services. The guest's folio and invoice keep one blended charge, and the confirmation lists the inclusions without a price.

The package arithmetic

With a room at 59 a night, sauna at 12 per guest once per stay, two guests and a 6.50 per room-night discount from two nights:

StayRoomSaunaPackage total
1 night, 2 guests59.002 x 12.00 = 24.0083.00
2 nights, 2 guests2 x 52.50 = 105.002 x 12.00 = 24.00129.00

The discount applies only when the package is booked. A guest who books the same room without the package pays the ordinary rate.

How Does a Package Sell at One Total Price?

A package is a rate adjustment plus optional services. In the widget it is offered per room as a single choice beside Room only, always with the full stay price and an "Includes" line. The guest never sees how the price splits between room and services. Staff do.

  • Each service is priced per room or per person, once per stay or every night. A cost of 0 lists the service as included at no extra charge.
  • Packages are opt-in. Show in booking engine is off by default.
  • A package with a promo code only appears to guests who enter the code or arrive by a link that carries it.
  • Advance Booking Days hides a package online when arrival is closer than that many days.
  • Multi-room carts are re-totalled with the server's per-room and per-guest parts, and the booking payload carries the package code so promo-only packages validate before anything is created.
  • A link such as ?package=SAUNA on your booking page, or data-package="SAUNA" on the embed, pre-selects the package and shows a banner. If the offer is not available for the dates, the banner says so and the guest can still book a room.

How Do Long-Stay Discounts Work?

There are two kinds. They are set in different places and behave differently, which matters if you sell both room-only and package stays.

Rate-plan long-stay tiersPackage stay-length discount
Set inRate Plans, Long-stay discountsPackages editor, Stay-length discount from (nights)
ShapeNight ranges, each with a percentage; the last range can be open-endedOne threshold in nights, then a fixed amount per room per night or a percentage of the room total
Applies toAny booking priced on that planOnly bookings that include that package
What is discountedEach night's room price, on per-night plans only (weekly and monthly plans already price by the unit)The room portion of the package
Shown to the guestRoom cards: "Long-stay discount 15% · you save X"; totals are already discountedInside the single package price

Staff see the same discount: the Quick Reservation price preview applies the rate-plan tier and the package discount the same way the server does, so a quoted price and a saved price agree.

How Does the Widget Explain a Search With No Rooms?

The availability search now returns the reason each room type was held back, not just a shorter list. The reasons the rates engine can report are minimum stay, maximum stay, closed to arrival and closed to departure. Group too large and no rooms left are worked out separately.

What blocked the searchWhat the guest sees
Any room type held back by a minimum stay"Minimum stay for these dates is N nights" and a Search N nights button. N is the smallest minimum among the blocked types, even if other types are simply sold out.
Every room type closed to arrival on that date"Check-in isn't possible on this date" with a prompt to try another arrival day
Anything else, or a mix of reasonsThe ordinary "no rooms available" message

Maximum stay, closed to departure, party size and sold-out cases are reported by the server but the widget shows only the two messages above.

How Do You Open the Widget on One Room, Currency or Date Range?

The embed loader reads these attributes. Each can be overridden by the same value in the page's query string, so a "Book this room" button on your site can be a plain link.

Embed attributeQuery parameterEffect
data-room-type?room_type=Opens on a room, by numeric id or by room code. The room is sorted first, softly highlighted and scrolled into view; the other rooms still list.
data-currency?currency=Sets the display currency
data-checkin, data-checkout?checkin=, ?checkout=Pre-fills the dates
data-adults?adults=Pre-fills the number of adults
data-lang?lang=Sets the language
data-package?package=Pre-selects a package by code

Currency is chosen in this order: the explicit attribute or link, then the guest's own earlier choice, then the hotel's default widget currency, then a guess from the browser. Language follows the same pattern with the hotel's default widget language.

What Does the Website Widget Page Control?

  • Appearance & defaults: theme (Modern, Classic, Minimal, Elegant), primary and secondary colour, default currency and language, an optional after-booking redirect URL, and a Widget active switch that stops new website bookings immediately.
  • API key: identifies your hotel to the widget. It is not secret, but regenerating it breaks any snippet still using the old key.
  • Get the code: a snippet for Simple HTML, WordPress, Wix or Squarespace with numbered steps, plus optional room-type preselect and prefill currency. Squarespace needs a Business plan or higher for Code Blocks.
  • Book this room links: one per room type, with copy and preview.

What Is the Availability Calendar Date Picker?

When a hotel's booking engine is set to calendar mode, step one of the widget is a month grid in place of the standard search form. Two months show side by side on a desktop and one on a phone. Each day shows the lowest nightly rate, or a strikethrough when sold out.

  • Room-type chips above the grid switch the grid to one room's own rates and availability. All rooms shows the lowest rate. Changing room type clears any chosen range, since a span valid for all rooms may not be valid for one.
  • The chosen room type travels with the search as a preference. Results still list every room, with the previewed one on top and lightly tinted.
  • Selection follows the Booking.com pattern: a check-in day needs availability, while a check-out day only needs every earlier night to be free. Same-day and minimum-advance-hours rules and the maximum length of stay apply.

Calendar mode is a per-hotel booking-engine setting and the standard search form is the default. It is not yet a switch on the Website Widget page.

What Does It Not Do?

  • Rate-plan long-stay tiers are not pushed to channel managers or OTAs. An OTA calendar cannot express a price that depends on stay length, so the discount appears on your direct booking engine and in staff quotes only.
  • Long-stay tiers apply to per-night plans. A flat extra-guest fee, such as an extra bed, is charged on top and is not discounted.
  • The package stay-length discount covers the room portion of the package, never room-only bookings.
  • The widget does not default its nights selector to a hotel-wide minimum stay. The explanation appears after a search instead.
  • Only minimum stay and closed-to-arrival get a specific empty-search message (see above).
  • Calendar mode is not yet self-serve on the Website Widget page.
  • Newer widget phrases are translated best-effort across the 15 widget languages; English is the fallback where a translation is missing.

The POS, the PMS, the direct booking engine and the guest app are free with unlimited rooms. The paid add-ons are the channel manager and the AI assistant, banded by property size: Mint is $35/month for 0-10 rooms, Basil $42/month for 11-30 rooms and Saffron $54/month for 31-50 rooms. See pricing for local currencies. The direct booking engine, including packages, the widget and the calendar, is part of the free tier. For a wider view of the economics see direct booking versus OTA costs and the booking engine page.

Frequently Asked Questions

Can a hotel booking engine sell a package at a single price?

Yes. In the Frontdesko widget each room card offers Room only or the package as one choice, showing the full stay price and an Includes line. The split between room and services stays hidden from the guest and visible to staff. Packages must be switched on with Show in booking engine.

How do I give a discount for longer stays?

Use rate-plan long-stay tiers for any booking on a plan: night ranges with a percentage each. Or set a stay-length discount on a package, which applies only when the package is booked. The widget shows the saving on room cards when a plan tier applies.

Do long-stay discounts reach Booking.com and other channels?

No. Rate-plan long-stay tiers are not pushed to channel managers because an OTA calendar cannot express stay-length prices. They apply to your direct booking engine and staff quotes. Your OTA prices stay as published.

Why does my booking widget say there are no rooms?

It can now say why. If a room type is held back by a minimum stay, the widget states the minimum and offers a one-tap search for that many nights. If every room is closed to arrival that day it suggests another arrival day. Other causes show the general message.

How do I link a button on my website to one specific room?

Open Website Widget in the admin, find the room in the Book this room links table and copy its link. It adds the room code to your booking page as a room_type parameter. The same widget also accepts currency, dates, adults, language and package parameters.

Does the booking engine work on Wix, WordPress and Squarespace?

Yes. The Website Widget page gives a snippet and numbered steps for Simple HTML, WordPress, Wix and Squarespace. Wix needs the embed box at least 1400px tall with scrolling on overflow, and Squarespace needs a Business plan or higher.

What is the availability calendar in the widget?

A month grid that replaces the search form when the hotel enables calendar mode. Each day shows the lowest nightly rate or a strikethrough if sold out, and room-type chips preview one room at a time. It is a per-hotel booking-engine setting and standard search is the default.

Is the direct booking engine free?

Yes. The booking engine, PMS, guest app and POS are free with unlimited rooms. Only the channel manager and AI assistant are paid add-ons, at $35, $42 or $54 a month by property size.

Let Your Own Website Close the Booking

Packages, long-stay discounts and the website widget are part of the free booking engine. See them in a live demo.

Start Live Demo See Pricing

Related Guides

Keep reading about direct bookings