Vachr Short-Term Rental Reservations

Description

Vachr Short-Term Rental Reservations is a free WordPress booking engine and channel manager for vacation rentals. Accept direct bookings without commission, synchronize availability with Airbnb, Booking.com, and other iCal-compatible platforms, accept online payments, and automate guest communication.

100% FREE — Unlimited properties — No commission on direct bookings. Manage apartments, vacation homes, rooms, and other short-term rental properties from one WordPress site.

Direct bookings and reservation management

Add a booking calendar and reservation form to your pages with the included shortcodes. Guests can check availability, choose dates and services, submit a reservation, and receive booking communication. Manage reservations, guests, services, pricing, payments, and external calendars from one place.

Airbnb, Booking.com, and iCal sync

Use two-way iCal synchronization to keep availability aligned with Airbnb, Booking.com, VRBO, and other platforms that support iCal. Import external reservations and export availability from your direct booking system to reduce calendar conflicts.

Payments and invoices

Accept online card payments through Stripe or Mollie, as well as bank transfer or cash. Track payment status and transactions, issue invoices, and generate Czech SPD QR payment codes for CZK bank transfers when the supplier uses a Czech IBAN. Set a global advance-payment schedule under Bookings -> Settings -> Payments by adding rows for days before arrival and the required deposit percentage. For example, use 365 days / 10%, 21 days / 50%, and 7 days / 80%; reservations closer than the smallest threshold require full payment. Each apartment can inherit the global schedule, define custom rules, or disable advance payments. The selected percentage applies to the first payment for card, bank transfer, cash, and manual payment methods. Reservations show the amount received and the remaining balance, and are marked paid only when recorded payments cover the amount due. Optionally connect a dedicated IMAP mailbox for bank payment notifications: the importer matches a variable symbol or payment reference and records the payment amount, keeping the reservation partially paid until the balance is covered.

Vacation rental automation

Automate guest and team communication for your short-term rental operation:

  • Send arrival instructions to guests before check-in.
  • Notify owners, cleaners, managers, repair staff, or other recipients about new bookings, arrivals, departures, guest registrations, unpaid reservations, and iCal cancellations.
  • Turn arrival and departure notifications into staff tasks with confirmation links and email escalation.
  • Display color-coded staff duty calendars and booking lists on protected WordPress pages.

Guest management

Collect guest registration and ID document photos through a public form, store registration details with reservations, and match registrations to direct or imported bookings. Create custom contact fields and consent checkboxes for the booking form.

More booking engine features

  • Manage unlimited properties, each with its own availability, settings, content, services, amenities, and public booking pages.
  • Configure seasonal and weekend rates, recurring rental seasons, closures, stay-length discounts, surcharge rules, and reusable discount codes.
  • Create multilingual apartment descriptions, amenities, arrival instructions, and bank-transfer instructions with apartment-specific overrides.
  • Use multiple currencies and configured conversion rates.
  • Set the default booking form design, layout, section and contact-field order, calendar size, and visible fields in Bookings Settings Appearance. Set available languages, the default form language, selected country, and base currency in General; choose global payment methods in Payments. The booking form uses the base currency unless a block or shortcode overrides it. Choose from Classic, Modern, Dark mode, Compact, Old fashioned, Forest, Coastal, Rose, Lavender, Sunset, Monochrome, High contrast, Alpine, or Terracotta.
  • Individual booking form blocks and shortcodes inherit those defaults. Set design="dark", layout="two-column", payment or visibility attributes, or an order value to override them for one form.
  • Customize the booking calendar and reservation form, then preview the appearance on desktop and mobile before publishing.
  • Generate editable VacationRental JSON-LD from apartment data with the optional Vachr Short-Term Rental Reservations Pro add-on.

Video tutorial


Video tutorial: https://www.youtube.com/watch?v=v1sXajxPurg

The plugin is free and supports unlimited apartments. Donations help fund continued development.

Optional setup assistance

Need help with setup? I offer one-time WordPress setup for short-term rentals, including connection to Booking.com, Airbnb, and more for 100 EUR, plus optional yearly light support for 20 EUR.

Screenshots

Blocks

This plugin provides 2 blocks.

  • bookingForm
  • searchForm

Installation

Video tutorial: https://youtu.be/v1sXajxPurg Watch this video to see how to manage and use the system.

  1. Upload the plugin files to the /wp-content/plugins/vachr-short-term-rental-reservations directory, or install the plugin through the WordPress plugins screen directly.
  2. Activate the plugin through the ‘Plugins’ screen in WordPress.
  3. Go to the ‘Apartments’ menu to create your first rental unit.
  4. Use the provided shortcodes to display the booking form or calendar on your pages.

FAQ

How do I configure WP Super Cache or a CDN with this plugin?

The plugin sends Cache-Control: no-store, no-cache, must-revalidate, max-age=0, private, Pragma: no-cache, and Expires: 0 for every endpoint in its REST namespace (/wp-json/vstrb/v1/...). It also sets WordPress’ DONOTCACHEPAGE flag while those requests are handled.

In Settings -> WP Super Cache -> Advanced -> Accepted Filenames & Rejected URIs, add this rule and then delete any existing cache:

^/wp-json/vstrb/v1/

Add the same path exclusion to any CDN, Nginx FastCGI cache, or reverse proxy in front of WordPress. The server/CDN exclusion is required because a previously cached response can be served before WordPress or this plugin runs.

Frontend and admin JavaScript/CSS are versioned with the plugin version and the asset modification time, so browser caches fetch changed assets automatically. If an old frontend still appears, clear page/minification caches in WP Optimize and any CDN cache.

How do I match bank-payment emails to reservations?

Open Bookings -> Settings -> Email Payments and connect a dedicated IMAP mailbox. Add a bank parser profile for each bank, such as Revolut and Air Bank, and enter that bank’s sender email or domain. The importer checks unread messages every 15 minutes, reads the message body and subject, then selects a profile by sender; an exact sender match takes precedence over a domain, which takes precedence over a profile with no sender restriction. Each profile has its own generic, Czech variable-symbol, and international reference templates plus custom PCRE fields for reference ((?<reference>...)), amount ((?<amount>...)), and three-letter ISO currency code ((?<currency>...)). Common adjacent currency symbols, such as Revolut’s €89.00, are also recognized automatically. Extracted amounts and currencies are shown in the audit log and recorded on the payment.

The reference is matched exactly against the reservation payment reference, invoice number, or reservation number. Czech variable symbols are also compared to the numeric part of stored payment references. A payment is applied only when precisely one unpaid reservation matches; ambiguous or unmatched messages are logged but never assigned automatically. The importer keeps a compact audit record and does not retain email bodies. Your server needs PHP’s IMAP extension enabled; ask your hosting provider to enable it if the settings page reports it missing.

How do I display the booking form?

Use the shortcode [vstrb_booking_form unit="YOUR_ID"].

Optional parameters:

  • months="N" – number of calendar months to display (default: 1).
  • grid="N" – number of month columns in the calendar grid (default: 1).
  • availability_days="N" – number of upcoming days included in the public machine-readable availability endpoint (default: 180, maximum: 366).
  • currency="CODE" – currency code used in the price breakdown (default: EUR).
  • language="CODE" – two-letter language code (e.g. cs, de, en) used for services, contact field labels, and the price quote. If omitted, the language of the current page (reflected in the <html lang> attribute, set automatically by multilingual plugins) is used; the visitor’s browser language serves as a last resort fallback.
  • enable_stripe="1" – show card payment via Stripe. Configure Stripe keys and webhook secret in Bookings -> Settings -> Payments.
  • enable_mollie="1" – show card payment via Mollie. Configure the Mollie API key and use the displayed Mollie webhook URL in Bookings -> Settings -> Payments.
  • enable_bank_transfer="1" – show bank transfer payment. Configure default bank instructions in Bookings -> Settings -> Payments, or translated per-apartment instructions in Bookings -> Apartment Content.
  • enable_cash="1" – show cash payment.

Billing details in the booking form are optional for all payment methods. Guests can enable them with Add Billing Details when they need an invoice. Card and bank-transfer payments without billing details create only a payment record; bank-transfer instructions and Czech QR payments use the booking ID as the payment reference and variable symbol.
* show_gender="0" – hide the gender field (shown by default).
* show_country="1" – show an ISO 3166-1 country selector (shown by default; use show_country="0" to hide it).
* show_children="0" – hide the children field and use one combined guest count instead. Adults and children are shown separately by default; capacity and prices use their combined total.
* show_children_ages="1" – show a required age field for each child (0–17 years), dynamically matching the selected number of children. Enabled by default; use show_children_ages="0" to disable it. Ages are stored with the reservation.
* country="CZ" – preselect an ISO 3166-1 country. If omitted, the form detects it from the shortcode or page language.
* consent_key, consent_label, consent_required="1" – add one consent checkbox directly to this form. The label supports [link url="https://example.com/terms"]Terms[/link]; use order="...,consents,..." to position it.

For reusable consent or terms checkboxes, open Bookings -> Settings -> Contact Fields. Create a field with type Checkbox / consent, choose whether it is required, add a translated label (including an optional [link url="..."]...[/link] link), then select the field in the apartment editor’s Contact Fields section. The selected value is saved with every reservation.

The Terms and conditions step in the apartment setup wizard creates and assigns the required terms_and_conditions consent automatically. Its label can use the same [link] syntax and is saved with the reservation. In the public booking form, this Terms checkbox is always displayed immediately before the submit button.
* layout="stacked|two-column|compact" – choose the form layout. stacked is the default; two-column uses a responsive two-column layout on larger screens.
* order="calendar,guests,services,pricing,contact,consents,payment,security,submit" – define the order of the form sections. Omitted sections are appended in the default order.

When creating a page from an apartment with Create apartment page, the page creation wizard also lets you choose how many calendar months the generated booking form displays (1–12) and how many month columns it uses (1–6). The wizard defaults to 2 months and 1 column; the layout automatically adapts to smaller screens.

Example: [vstrb_booking_form unit="YOUR_ID" language="de" show_gender="0" show_country="1" country="DE"]

Layout example: [vstrb_booking_form unit="YOUR_ID" layout="two-column" order="calendar,guests,contact,consents,services,pricing,payment,security,submit"]

The booking form is lazy-loaded by default: its HTML is requested only when the visitor reaches it, which helps page caches serve the page without storing the form markup. Toggle this in Bookings -> Settings -> General -> Lazy-load Booking Form. Use defer="0" in a shortcode to disable lazy loading for that one form.

Payment example with Mollie and bank transfer:
[vstrb_booking_form unit=”YOUR_ID” enable_mollie=”1″ enable_bank_transfer=”1″ enable_cash=”1″]

Payment example with all payment methods:
[vstrb_booking_form unit=”YOUR_ID” enable_stripe=”1″ enable_mollie=”1″ enable_bank_transfer=”1″ enable_cash=”1″]

How do I configure discount codes?

Open Bookings -> Rates and find the Reusable discount codes section. Select an apartment, then:

  1. In the Reusable discount codes section, select the accommodation and add one or more codes, for example WELCOME10 and SUMMER15.
  2. Enter the percentage discount for each code, from 0 to 100.
  3. Optionally set Valid from and Valid to for each code. The code is checked against the date on which the reservation is created; an empty boundary means no limit on that side.
  4. Enable Show the discount code field in the booking form if guests should be able to enter a code manually.

The discount is applied to the accommodation price only. It does not reduce selected services or the refundable deposit. Calendar-visible accommodation rules (such as seasonal and weekend adjustments) are applied first, then the valid code is deducted; stay-length discounts are calculated afterwards from that reduced price. Each code can be reused by an unlimited number of guests while it is valid. Codes are case-insensitive and must be unique within an accommodation.

To distribute the code through a private or campaign link without showing a field, add the discount_code GET parameter to the booking page URL:

https://example.com/book/?discount_code=WELCOME10

The code is validated again on the server when the quote is calculated and when the reservation is created, so the final reservation price cannot be changed by editing the frontend request. The calendar displays calendar-relevant pricing rules such as seasonal and weekend prices, with a valid discount code already reflected in the daily price. Stay-length discounts are calculated only after the dates are selected, after the discount code has been applied. A valid code, its percentage, and the applied discount amount are saved with the reservation and included in the administrator and guest booking emails.

How do I collect the age of each child?

The booking form shows child-age fields automatically by default. The number of fields follows the selected number of children: no fields are shown for zero children, and adding or removing a child immediately adds or removes the corresponding age field. Each age is required and accepts values from 0 to 17 years.

The ages are saved with the reservation and are visible in the reservation details in the administration. To disable this feature for a specific form, use:

[vstrb_booking_form unit="YOUR_ID" show_children_ages="0"]

How do I collect billing details for an existing reservation?

Use [vstrb_billing_form] on a separate page. The form contains only billing data (company/name, company ID, VAT ID, address, ZIP code, and country) and saves it to an existing reservation without collecting the guest’s contact details again.

For a public link, pass the reservation ID and its secure token: https://example.com/billing/?booking_id=123&token=TOKEN. The token is the same token used by the reservation’s price-offer link. You can also use an external channel reservation ID with external_id and external_id_param when the imported reservation has external_booking_id stored.

Examples: [vstrb_billing_form] or [vstrb_billing_form booking_id="123" token="TOKEN"].

How do I enable Mollie payments?

  1. Go to Bookings -> Settings -> Payments.
  2. Enter your Mollie API key (test_... or live_...).
  3. Copy the displayed Mollie Webhook URL into your Mollie dashboard webhook settings.
  4. Add enable_mollie="1" to your booking form shortcode.

Example: [vstrb_booking_form unit="YOUR_ID" enable_mollie="1"]

How do I let guests search for free accommodation?

Use the shortcode [vstrb_search] or the “Accommodation search” block. Guests choose dates and the number of guests, see the matching accommodation with prices and continue in the booking form. Use units="12,15" to limit the search to selected accommodation; the other attributes (currency, language, design, layout, enable_stripe, …) are passed to the booking form.

How do I display the availability calendar?

Use the shortcode [vstrb_availability_calendar unit="YOUR_ID" months="3"].

The booking form and calendar pages advertise their public JSON availability endpoint with a machine-readable link in the HTML <head>. This adds no visible list of dates; the booking form and interactive calendar continue to work as usual. To advertise the endpoint on another page without adding visible output, use [vstrb_ai_availability unit="YOUR_ID" days="180"].

For a public JSON availability snapshot, request /wp-json/vstrb/v1/availability?unit_id=YOUR_ID&days=180. It returns the accommodation name and, when available, its published booking-page URL, booking limits, the time and date range checked, and consecutive free-night ranges. The range is a calendar snapshot; to verify exact dates and get a current quote, send a POST request to /wp-json/vstrb/v1/quote with unit_id, date_from, date_to, and adults (or guests). Neither endpoint exposes guest or reservation details.

Allow public crawling of the apartment page and include it in the site’s sitemap for Google and other crawlers to discover the page and its API link. The JSON endpoint is public, so anyone who knows or finds its URL can request it. Search engines may fetch machine-readable data, but Google does not guarantee that it will index or show availability dates. Do not serve availability only to search crawlers or add hidden availability markup: Google treats content hidden from visitors but shown to crawlers as cloaking or hidden-text abuse. For Google Travel vacation-rental listings and itinerary prices, use Google’s separate Vacation Rentals integration process.

How do I collect guest registration data (e.g. from Booking.com guests)?

Use the shortcode [vstrb_guest_registration unit="YOUR_ID"] on any page. Share the link with your guest – they fill in their personal details without needing to register. Submitted data is saved to the database and sent by email to both the admin and the guest. You can review all registrations under Bookings -> Guest Registrations in the admin panel.

If the registration link contains a specific apartment (unit), that apartment is kept as the primary assignment. The plugin then tries to link the registration to a matching booking for the same apartment and stay dates. When the apartment is not known and there is exactly one matching booking for the submitted stay dates, the registration can be linked automatically to that booking. If the match is not clear, you can manually pair or unpair the registration group in the admin panel.

The Guest Registrations admin screen includes filters for apartment, booking source, stay date range, guest/email/reference search, booking ID, and linked or unlinked registration groups. You can also change the apartment for a whole registration group when a guest submitted the form under the wrong apartment.

Optional parameters:

  • title="TEXT" – custom heading displayed above the form. If omitted, the apartment name is used as the heading.
  • language="LOCALE" – locale code (e.g. cs_CZ, de_DE, en_US) to render the form labels in a specific language. If omitted, the current site language is used.
  • param="accommodation" – resolve the apartment from a URL parameter instead of a fixed unit ID. This is useful for Booking.com links with [PROPERTY_NAME].
  • match="contains" – allow one unique partial match when Booking.com sends a longer or shorter property name.
  • fallback="TEXT" – text shown when no unique apartment is matched.

Example: [vstrb_guest_registration unit="YOUR_ID" title="Apartment Modry Dum" language="cs_CZ"]

Booking.com example page shortcode:
[vstrb_guest_registration param=”accommodation” language=”en_US” fallback=”Accommodation not found. Please contact us.”]

Booking.com message URL:
https://example.com/accommodation-registration-tourist-tax/?accommodation=[PROPERTY_NAME]&source=booking_com

Add the exact Booking.com property name to External accommodation names / aliases in the matching apartment editor. One alias per line is supported. Matching ignores case, accents, and extra punctuation.

How do I manage multilingual apartment descriptions, amenities, arrival instructions, and bank transfer instructions?

Create reusable content templates under Bookings -> Apartment Content. Each template can contain translated apartment descriptions, amenities text, arrival instructions, and bank transfer payment instructions for the languages configured in Bookings -> Settings.

Then open an apartment and use the Guest-facing Apartment Content section in the apartment details. You can assign a template and optionally override any language directly for that apartment.

How do I add the reservation ID, amount, and currency to bank transfer instructions?

Use {{reservation_id}} for the reservation ID, {{payment_amount}} {{payment_currency}} for the amount and currency, and {{payment_reference}} for the full payment reference. {{invoice_number}} is filled when an invoice has been issued. Short aliases {{amount}} and {{currency}} are also available.

Template texts support placeholders in double braces. Built-in placeholders include:

  • {{apartment_name}}
  • {{checkin_time}}
  • {{checkout_time}}
  • {{booking_id}} and {{reservation_id}} – aliases for the reservation ID. Use {{reservation_id}} in bank transfer instructions; both keys are available in arrival instruction emails.
  • {{guest_name}} – available in arrival instruction emails.
  • {{date_from}} and {{date_to}} – available in arrival instruction emails.

Bank transfer templates additionally support:

  • {{iban}} – the supplier account in international IBAN format.
  • {{account_number}} and {{bank_account}} – the domestic account number. A Czech IBAN is converted to formats such as 19-2000145399/0800.
  • {{invoice_number}} – the invoice number, when an invoice has been issued. In the booking form, an invoice is issued when the guest requests billing details.
  • {{payment_reference}} – the full payment reference. It uses the invoice number when available, otherwise the reservation ID.
  • {{payment_amount}} and {{payment_amount_due}} – the amount to pay.
  • {{payment_currency}} – the payment currency, for example CZK.

Bank transfer callbacks use the generic Bank Notify URL from settings. The endpoint accepts JSON, form-encoded payloads, and simple XML bodies, and recognizes common wrapper keys (transaction, payment, data, entry, accountStatement) and common aliases for the token (also via the X-VSTRB-Token, X-Webhook-Token, or Authorization: Bearer ... header), booking ID, invoice number, reference / variable symbol, amount, and currency.

The plugin matches payments by booking ID first, then invoice number, then exact reference/variable-symbol match against stored payment references or invoice numbers. It does not connect to a bank API directly; an export or middleware must call the endpoint.

You can also define custom placeholders in the apartment editor, for example door_pin, wifi_password, or parking_note. Custom placeholders can have one global value or language-specific values. Use them as {{door_pin}} or with a fallback like {{door_pin|provided before arrival}}.

Example: add door_pin and wifi_password under Guest-facing Apartment Content -> Template Placeholders in the apartment editor, then use Door PIN: {{door_pin}}, Wi-Fi: {{wifi_password}} in an arrival instruction template.

Fill the language-specific values (for example CS or DE) to translate a placeholder; if no matching language value exists, the global value is used. A fallback such as {{door_pin|provided before arrival}} is shown when the value is empty.

You can display the saved content with these shortcodes:

  • [vstrb_unit_description unit="YOUR_ID" language="cs"]
  • [vstrb_unit_amenity_list unit="YOUR_ID" language="cs"]
  • [vstrb_unit_arrival_instructions unit="YOUR_ID" language="cs"]
  • [vstrb_unit_arrival_instructions_by_code param="unit_code" language="cs"]
  • [vstrb_unit_arrival_instructions_by_name param="accommodation" language="cs"]
  • [vstrb_unit_arrival_instructions_by_reservation]

If the language attribute is omitted, the site language is used. Apartment-specific text has priority over the selected template.

To show arrival instructions without exposing an internal apartment ID, prefer [vstrb_unit_arrival_instructions_by_code]. Set a Public apartment code in the apartment editor and put that code into the external channel link. This is more reliable than matching a name sent by Booking.com, Airbnb, or another channel.

Example page shortcode:
[vstrb_unit_arrival_instructions_by_code param=”unit_code” language=”cs” fallback=”Accommodation not found. Please contact us.”]

Example guest URL:
https://example.com/arrival/?unit_code=blue-house

If an external channel can only send the accommodation name, use [vstrb_unit_arrival_instructions_by_name] and add the exact channel-specific names to External accommodation names / aliases in the apartment editor. The shortcode matches the URL value against the apartment title and these aliases. Matching ignores case, accents, and extra punctuation.

Optional parameters: param (GET parameter name; defaults unit_code / unit_name), code or name (fixed value for testing), match (exact by default; contains for the name shortcode allows one unique partial match), show_title="1", and fallback (text shown when no unique apartment is matched).

How do automated arrival instruction emails work?

In the apartment editor, enable Email arrival instructions automatically before check-in and set Send days before arrival.

The daily WordPress cron checks confirmed bookings with a customer email address. If arrival instructions exist for the apartment, the guest receives an email with the apartment description, amenities, and arrival instructions in the saved booking language when available. Each booking is marked after sending so the instructions are not sent repeatedly.

To display arrival instructions by matching a guest stay, use:
[vstrb_unit_arrival_instructions_by_reservation]

The shortcode reads arrival date, departure date, first name, and last name from URL parameters. It accepts ISO dates and common local numeric date formats such as 2026-06-01, 1.6.2026, 01/06/2026, and 06/01/2026; ambiguous formats are tried against stored reservations without converting through UTC. It first tries to find one apartment by stay dates only. If multiple apartments match the same dates, it narrows the result by both guest names, then by last name only, then by first name only. Name matching ignores accents and letter case. If no unique match is found, it displays the first apartment with available instructions in alphabetical order.

Example page shortcode:
[vstrb_unit_arrival_instructions_by_reservation date_from_param=”checkin” date_to_param=”checkout” first_name_param=”guest_first_name” last_name_param=”guest_last_name” language=”cs” available_days_before=”1″ unavailable_text=”Arrival instructions are not available yet.” fallback=”Arrival instructions are not available. Please contact us.”]

Example guest URL, password: testtest:
https://vachr.cz/apartment-1-demo-pin/?checkin=2026-06-23&checkout=25.6.2026&guest_first_name=Jan&guest_last_name=Novak

Optional parameters:

  • unit="ID" – limit matching to one apartment, useful when date combinations may repeat across apartments.
  • date_from_param="date_from" – URL parameter containing arrival.
  • date_to_param="date_to" – URL parameter containing departure.
  • first_name_param="first_name" – URL parameter containing first name.
  • last_name_param="last_name" – URL parameter containing last name.
  • date_from="YYYY-MM-DD" – fixed arrival date instead of a URL parameter.
  • date_to="YYYY-MM-DD" – fixed departure date instead of a URL parameter.
  • first_name="TEXT" – fixed first name instead of a URL parameter.
  • last_name="TEXT" – fixed last name instead of a URL parameter.
  • language="cs" – language used for apartment instructions.
  • show_title="1" – show the matched or fallback apartment title above the instructions.
  • fallback="TEXT" – text shown when no apartment has arrival instructions.
  • available_days_before="1" – how many days before arrival the instructions may be shown. Default: 1. Use 0 to show them only on the arrival day.
  • unavailable_text="TEXT" – text shown when the guest opens the page too early. If omitted, a translated default message is shown.

Can I pre-fill the guest registration form from a URL?

Yes. The [vstrb_guest_registration] shortcode reads the following GET parameters and pre-fills the corresponding form fields:

  • date_from – check-in date (format: YYYY-MM-DD)
  • date_to – check-out date (format: YYYY-MM-DD)
  • first_name – guest’s first name (pre-fills the first guest block)
  • last_name – guest’s last name (pre-fills the first guest block)
  • source – booking source; accepted values: booking_com, airbnb, vrbo, expedia, direct, other
  • booking_ref – booking reference number
  • accommodation – external accommodation name used to resolve the apartment when [vstrb_guest_registration param="accommodation"] is used

Example URL:
https://bayernrelax.eu/en/accommodation-instructions/?accommodation=[PROPERTY_NAME]&date_from=2026-07-01&date_to=2026-07-07&first_name=John&last_name=Doe&source=booking_com&booking_ref=1234567890

This is useful when sending a registration link directly from a booking confirmation email.

How do admin price offers work for imported reservations?

Open Bookings, click Offer on any reservation, and use the Price offer panel. The plugin calculates the price from the current reservation unit, dates, guest count, services, seasonal rates, discounts, surcharges, and refundable deposit settings.

You can add a one-time manual discount as a fixed amount or percentage. The generated result is saved back to the booking total and into the booking price breakdown, so notification emails and admin details show the same final amount.

For imported iCal reservations from e-chalupy.cz, Booking.com, Airbnb, and similar channels, the guest email is often not stored as the booking customer email. In that case you can enter any recipient in Send offer to email. If the iCal description contains an email address, the field is prefilled automatically.

Each offer also has a private public link in Public price offer link. Copy that URL and send it manually through any channel. The link uses a random token and displays only the price offer page for that booking.

The email sent from the price offer panel includes the offer summary and the same public price offer link.

Where are plugin settings managed?

Open Bookings -> Settings. The page is split into tabs so operational configuration is kept in one place:

  • General – languages, currencies, conversion rates, default booking-form language and country, and shared defaults.
  • Notifications – staff work types, recipients, confirmation, escalation, unpaid reservation alerts, daily send time, and staff calendar shortcode.
  • Payments – global booking-form payment methods, Stripe, Mollie, bank transfer, payment callbacks, payment behaviour, and guest reminders for unpaid reservations.
  • Invoicing – invoice numbering, language, supplier, tax, and bank details.
  • Calendar – the global booking-calendar price display mode.
  • Appearance – booking form design, layout, calendar and field display, and styling, including the live desktop/mobile preview.
  • Services, Amenities, and Contact Fields – reusable catalogs and fields used by apartments and booking forms.

Document photos can be uploaded for each person from the public guest/contact registration form. They are stored against that person’s registration record and are accessible in the admin guest-registration screen. Only JPG, PNG, and WebP files up to 1 MB per file are accepted. They are not added to the public WordPress Media Library. Under Bookings -> Settings -> General -> Reservation photo uploads, choose Show, optional, Show, required, or Do not show. Configure the absolute server path under Reservation photo folder. When left empty, private files are stored outside the public uploads directory in ../vstrb-private-booking-photos. The configured folder must be writable by PHP; in Docker deployments it must also be mounted into the WordPress container if it is outside the standard WordPress directory.

iCal Imports remains a separate item under Bookings, because it is an operational synchronization screen with per-apartment imports, export URLs, and an immediate import action.

How do I automate cleaning, handover, manager, or repair notifications?

Open Bookings -> Settings -> Notifications. Create a notification type for each duty, for example Cleaning, Manager, Repair, or a custom duty. For every type choose:

  • The trigger: new booking, guest registration, arrival, departure/cleaning, unpaid reservation, or iCal cancellation.
  • A calendar color.
  • The visible booking data for each recipient.
  • Recipient language; for the first recipient, the number of days before arrival or departure when the task begins.
  • Recipient order and the escalation interval in hours.
  • Choose a password-protected staff booking page from existing WordPress pages, or create one immediately from the recipient form. The new page already contains the staff booking shortcode. Select “Do not add a link to emails” when no link should be sent.

Set Daily staff notification time to choose when daily notifications and unpaid-payment reminders are sent. The time uses the WordPress site timezone and is kept local across daylight-saving changes.

For staff alerts about unpaid reservations, use the Unpaid reservation trigger in a notification type. Set First email (days before) for each recipient; for this trigger, the value means days before arrival. Guest reminders are configured separately under Bookings -> Settings -> Payments -> Unpaid Reservation Reminders. Enter comma-separated day offsets such as 7,2. Choose which payment methods should trigger staff and guest reminders in the same Payments section. Direct reservations created without a configured payment method use the Manual payment category. Both features are disabled until configured, and each reminder is sent at most once for each interval and recipient.

For arrival and departure types, enable Require confirmation and escalate to turn the notification into a task. The first recipient receives an email with a personal confirmation link. If they do not confirm within their configured interval, the next recipient receives an escalation email. When any notified recipient confirms, the task is assigned to them and earlier recipients receive a takeover notice. The hourly WordPress task runner processes pending escalations; for precise delivery on low-traffic sites, configure a real server cron to call WordPress cron.

The confirmation link is signed for the specific booking, task type, and recipient. It can be used without a WordPress login, which makes it practical for cleaners and contractors; place staff calendar pages behind a WordPress password or another access control method.

Existing installations do not need to re-enter their settings. Legacy rules in the old email|fields|events|language|days_before format are migrated automatically during the upgrade and shown in the structured form.

Available fields:

  • unit – apartment name.
  • dates – stay dates.
  • guests – guest count.
  • status – booking status.
  • source – booking source.
  • customer – customer name.
  • contact – customer email and phone.
  • price – booking total and currency.
  • note – booking note.
  • booking_reference – external booking reference on guest registrations.
  • guest_names – names submitted in guest registrations.
    Available triggers:

  • new_booking – email when a new booking is created.

  • registration – email when guest registration details are submitted.
  • arrival – email before check-in; it can be turned into a confirmed handover task.
  • departure – email before checkout; it can be turned into a confirmed cleaning task.
  • ical_cancelled – email when a future imported iCal reservation disappears from its source feed and is treated as cancelled.
    For each recipient, select only the visible fields they need. For example, a cleaner may receive apartment, dates, and guest count without price or contact information.

For a staff booking list with status controls, create a WordPress page or post, protect it with a WordPress password, and add:

[vstrb_staff_bookings email="cleaner@example.com" fields="unit,dates,guests,status"]

For the color-coded duty calendar with daily details, assignment state, and confirmation buttons, use:

[vstrb_staff_tasks email="cleaner@example.com" days="90"]


[vstrb_staff_bookings] optional shortcode parameters:
  • email="EMAIL" – staff rule to use.
  • fields="FIELDS" – optional comma-separated subset of the fields allowed for this recipient. For example: unit,dates,guests,status. Use all to use all fields configured for the recipient.
  • days="N" – number of upcoming days to display; use 0 for all current and future reservations (default: 0).
  • unit="ID" – limit to one apartment.
  • limit="N" – maximum number of bookings (default: 50).
  • include_registrations="0" – hide guest registration groups.
  • status="all" – include cancelled and blocked bookings too.

Select the staff booking page for the matching notification recipient. Email links add vstrb_booking_id automatically and open just that reservation. The page provides a link to clear the filter and return to all current and upcoming reservations; staff can also update a reservation status there.

[vstrb_staff_tasks] optional shortcode parameters:
  • email="EMAIL" – required email address of a configured recipient; it limits the calendar to that person’s duties.
  • days="N" – number of upcoming days to display (default: 90, maximum: 365).
  • unit="ID" – limit the calendar to one apartment.

How can AI posts be generated automatically?

Open Bookings -> AI Post Generator and use Scheduled AI generation profiles. Each profile can have its own source URLs, pasted source text, or an AI research prompt built from location, radius, date range, event types, source-link rules, and extra instructions. Profiles also include languages, category, draft/publish status, notification email, and daily, every-2-days, every-3-days, weekly, or monthly schedule with a selected time.

WordPress cron runs enabled profiles automatically. After each run, the configured notification email receives a summary telling whether new drafts are ready, posts were published, or errors occurred. The processed-source history is reused, so the same source is not generated repeatedly.

Can I add Google Vacation Rental structured data?

Yes, with the optional Vachr Short-Term Rental Reservations Pro add-on. Open Bookings -> Google SEO Data, select an apartment, and generate editable VacationRental JSON-LD from its existing settings.

The generator reuses the apartment name, description or content template, capacity, check-in and check-out times, base price, currency, featured image, and amenities. You can then complete the address, coordinates, room details, floor size, languages, ratings, reviews, and at least eight accommodation photos.

Place the generated structured data on the public apartment detail page with:

[vstrb_vacation_rental_schema unit="YOUR_ID"]

Structured data helps search engines understand the accommodation, but Google does not guarantee a rich result. Displaying live prices and availability in Google Vacation Rentals requires a separate Google Hotel Center integration.

Reviews

سپتامبر 8, 2026
We are currently setting up Vachr Short-Term Rental Reservations for our Tiny House rental website. During the setup and testing, we found several things that we wanted to adjust to fit our way of handling reservations. What I appreciate most is the developer's very quick and helpful response. Several of our suggestions were actually implemented in subsequent plugin updates. For example, the plugin now handles children's ages, required consent for accommodation terms and privacy policy, pending reservations, and easier reservation management for staff. The developer also reacted to an issue we found during testing with payment status and automatic reservation confirmation. We are still finishing the setup and testing before going live, so I cannot yet comment on long-term use. However, our experience so far has been very positive, especially because the developer listens to users and continues improving the plugin. Thank you for the excellent communication and for the work you are putting into this plugin.
Read all 2 reviews

Contributors & Developers

“Vachr Short-Term Rental Reservations” is open source software. The following people have contributed to this plugin.

Contributors

“Vachr Short-Term Rental Reservations” has been translated into 2 locales. Thank you to the translators for their contributions.

Translate “Vachr Short-Term Rental Reservations” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2.2.5

  • Added an apartment gallery. The new “Apartment Gallery” box on the apartment edit screen lets you pick several images from the media library and reorder them by dragging.
  • The accommodation search results now show the featured image followed by the gallery images, with previous/next arrows on each result.
  • The search endpoint returns an images list (url and alt text) for every unit; image is kept for compatibility.
  • Added styling of the accommodation search to the Appearance settings: result card background, border and radius, accommodation name, total price and gallery arrows. The form background now applies to the search form too.
  • Added translations for the gallery and the search styling to all supported languages.

2.2.4

  • Added the [vstrb_search] shortcode and the “Accommodation search” block. Guests enter check-in, check-out and the number of guests and get a list of the accommodation that is free for the stay, with the total price. Choosing a unit opens the booking form with the dates and guests already filled in and the live price quote, so the guest only enters their details, picks a payment method and sends the reservation. Availability, capacity and stay limits are checked exactly as when a booking is created.
  • The block has a settings (cog) dialog like the booking form block: searched accommodation, currency, language, layout, design, field order, payment methods and optional fields.
  • Added the POST /wp-json/vstrb/v1/search endpoint used by the search form.
  • Added translations for the new search to all supported languages.

2.2.3

  • Added a discount by number of guests. When fewer guests than the apartment capacity book a stay, you can set a separate discount for each guest count (fixed amount per night in each currency, or a percentage of the accommodation price), so it does not have to be linear. Configure it in the apartment’s pricing section, under “Discount by number of guests”. It is not applied to per-person price modes and appears as its own line in the price breakdown.
  • Added translations for the new discount to all supported languages.

2.2.2

  • Added per-apartment discount rules for children (by age range) and disabled guests. A rule gives a percentage discount (100 % = free) on per-person services such as the tourist tax, and can be limited to selected services. Configure them in the apartment’s Services tab.
  • The booking form shows a “guests with a disability card” field when the apartment has a disabled-guest rule; the live price quote accounts for child ages and disabled guests.
  • Reservations store the number of disabled guests (disabled_guests, new column added automatically on update); it is editable in the admin and accepted by the REST/application API.

2.2.1

  • Added an authenticated REST API (/wp-json/vstrb/v1/api/) for reservations, price offers, payments and invoices. It uses WordPress Application Passwords over HTTPS, per-user permissions and apartment scope (user profile), mandatory Idempotency-Key replay protection for creating/sending operations, an audit log and a common error format. See docs/openapi.yaml.
  • Added vstrb_api_requests and vstrb_api_audit tables, created automatically on update.

2.2.0

  • Refactored the booking core into shared reservation and price-offer services with apartment-scoped permissions.
  • Core refactoring: shared payment and invoice operations for admin, webhooks and scheduled balance collection, with transaction-safe updates and duplicate-payment protection.

2.1.86

  • Fixed price-offer emails retaining the previous total or breakdown after a percentage or fixed discount was saved; offer data is refreshed before sending.
  • Extracted shared booking operations for availability, calendars, quotes, price snapshots and reservation creation. Existing REST endpoints and admin price recalculation use the shared service; direct integrations can supply explicit caller permissions without REST request objects or form CAPTCHA.
  • Fixed a missing payment-metadata reader used by cash payments and balance-payment processing.
  • Organized booking-form defaults by purpose: currency follows General base currency, language and selected country are set in General, payment methods are set in Payments, and Appearance contains form presentation settings. Individual blocks and shortcodes can override applicable defaults.
  • Added an immediately updating, docked live appearance preview with a slide-out toggle and persistent save control.
  • Added translations for the new appearance and booking form settings across the bundled languages.
  • Added a public availability JSON endpoint and a machine-readable page-head link for booking pages; availability dates are not added to page content.
  • Added the [vstrb_ai_availability] shortcode to advertise the public JSON endpoint on a page without visible output.

2.1.85

  • Fixed apartment setup wizard saves being blocked by native browser validation on pricing fields; the wizard now uses its own validation while active.
  • Replaced the lazy booking form’s standalone load button and small spinner with an animated skeleton that reserves space for the calendar and form fields until the form is ready.
  • Added a retry action if the lazy booking form cannot be loaded.
  • Added a reserved-height, branded loading state to booking and availability calendars, with a clear message if calendar data cannot be fetched.
  • Added translations for the branded loading message in all 11 bundled languages.
  • Updated frontend asset versions to include stylesheet and lazy-loader modification times so browsers fetch the updated interface.

2.1.84

  • Maintenance release.

2.1.83

  • Maintenance release.

2.1.82

  • Maintenance release.

2.1.81

  • Fixed frontend handling of REST API validation errors so guests see specific messages, including the configured minimum or maximum stay and guest limit, instead of a generic booking error.
  • Improve rate group deletion logic with enhanced error handling and clearer success messages

2.1.80

  • Unified guest payment requests and unpaid reservation reminders into one configurable schedule that always requests the current outstanding amount.
  • Kept staff payment notifications on their existing staff rules and removed duplicate guest balance-request emails.
  • Aligned the one-time automatic card charge with the final configured guest reminder day; sends the regular payment reminder if a charge fails or needs authentication.
  • Migrated existing reminder and balance-request days into the unified schedule and updated translations in all bundled languages.

2.1.79

  • Added configurable advance-payment rules based on the time between booking and arrival, with global defaults and per-apartment overrides or opt-outs.
  • Added partial-payment tracking that displays amounts received and the remaining balance.
  • Added automatic balance requests a configurable number of days before arrival, including card checkout links and bank-transfer instructions.
  • Added optional off-session card charging through Stripe and Mollie when the guest explicitly authorizes future charges; sends a payment link if automatic collection needs additional authentication or fails.
  • Added translations for the advance-payment and balance-collection settings, booking form, and guest emails in all bundled languages.

2.1.78

  • Added multiple bank email parser profiles with sender-based profile selection and profile-specific reference, amount, and currency patterns.
  • Added amount and currency extraction to the email-payment parser test and import audit.
  • Improved the bank-profile settings layout and added translations for all bundled languages.
  • Added accommodation-template placeholders for reservation ID, payment amount, and payment currency, and clarified invoice-number and payment-reference placeholders.
  • Made placeholder guidance visible in the accommodation editor and updated the documentation and translations in all available languages; documented the Czech-only variable symbol in Czech.

Older entries are listed in changelog.txt shipped with the plugin.