{"id":283320,"date":"2026-04-02T17:33:42","date_gmt":"2026-04-02T17:33:42","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/free-short-term-rental-booking-ical\/"},"modified":"2026-09-20T18:45:39","modified_gmt":"2026-09-20T18:45:39","slug":"vachr-short-term-rental-reservations","status":"publish","type":"plugin","link":"https:\/\/hsb.wordpress.org\/plugins\/vachr-short-term-rental-reservations\/","author":23454938,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.70","stable_tag":"2.1.70","tested":"7.0.5","requires":"5.0","requires_php":"7.2","requires_plugins":null,"header_name":"Vachr Short-Term Rental Reservations","header_author":"Radomir Vachr","header_description":"A professional short-term rental booking engine for WordPress. Includes advanced seasonal pricing (Summer, Winter, Holidays), dynamic discounts, and multi-currency support. Sync effortlessly with Airbnb, Booking.com, and more via two-way iCal integration. Features a responsive frontend calendar, customizable contact fields, additional services (cleaning, parking, etc.), and automated email notifications. Lightweight, collision-protected, and fully translatable.","assets_banners_color":"c4d3eb","last_updated":"2026-09-20 18:45:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/vachr.cz","rating":5,"author_block_rating":0,"active_installs":10,"downloads":3342,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.2":{"tag":"1.4.2","author":"chuckumi","date":"2026-04-13 00:14:42","revision":3504723},"1.4.3":{"tag":"1.4.3","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.4":{"tag":"1.4.4","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.5":{"tag":"1.4.5","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.6":{"tag":"1.4.6","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.7":{"tag":"1.4.7","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.8":{"tag":"1.4.8","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.4.9":{"tag":"1.4.9","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.5.0":{"tag":"1.5.0","author":"chuckumi","date":"2026-04-06 20:29:14","revision":3500164},"1.5.1":{"tag":"1.5.1","author":"chuckumi","date":"2026-04-06 20:30:48","revision":3500165},"1.5.2":{"tag":"1.5.2","author":"chuckumi","date":"2026-04-06 22:16:45","revision":3500207},"1.5.3":{"tag":"1.5.3","author":"chuckumi","date":"2026-04-10 22:32:38","revision":3503618},"1.5.4":{"tag":"1.5.4","author":"chuckumi","date":"2026-04-11 21:33:24","revision":3504182},"1.6.0":{"tag":"1.6.0","author":"chuckumi","date":"2026-04-13 00:16:05","revision":3504724},"1.6.1":{"tag":"1.6.1","author":"chuckumi","date":"2026-04-21 22:45:18","revision":3512241},"1.6.2":{"tag":"1.6.2","author":"chuckumi","date":"2026-04-21 23:06:20","revision":3512256},"1.7.3":{"tag":"1.7.3","author":"chuckumi","date":"2026-04-23 23:40:10","revision":3514225},"1.7.7":{"tag":"1.7.7","author":"chuckumi","date":"2026-04-24 17:33:11","revision":3514828},"1.7.8":{"tag":"1.7.8","author":"chuckumi","date":"2026-04-24 20:24:30","revision":3514921},"1.7.9":{"tag":"1.7.9","author":"chuckumi","date":"2026-04-24 20:42:09","revision":3514929},"1.9.1":{"tag":"1.9.1","author":"chuckumi","date":"2026-04-26 00:00:11","revision":3515512},"1.9.10":{"tag":"1.9.10","author":"chuckumi","date":"2026-04-26 23:49:22","revision":3516004},"1.9.11":{"tag":"1.9.11","author":"chuckumi","date":"2026-04-27 11:08:39","revision":3516350},"1.9.12":{"tag":"1.9.12","author":"chuckumi","date":"2026-04-28 16:28:55","revision":3517654},"1.9.13":{"tag":"1.9.13","author":"chuckumi","date":"2026-04-28 16:56:22","revision":3517673},"1.9.16":{"tag":"1.9.16","author":"chuckumi","date":"2026-04-29 13:38:10","revision":3518492},"1.9.17":{"tag":"1.9.17","author":"chuckumi","date":"2026-04-29 21:41:37","revision":3519002},"1.9.18":{"tag":"1.9.18","author":"chuckumi","date":"2026-04-30 22:42:44","revision":3520025},"1.9.19":{"tag":"1.9.19","author":"chuckumi","date":"2026-05-01 00:04:28","revision":3520049},"1.9.20":{"tag":"1.9.20","author":"chuckumi","date":"2026-05-01 16:53:09","revision":3520521},"1.9.21":{"tag":"1.9.21","author":"chuckumi","date":"2026-05-04 18:06:39","revision":3522632},"1.9.22":{"tag":"1.9.22","author":"chuckumi","date":"2026-05-04 21:03:51","revision":3522737},"1.9.23":{"tag":"1.9.23","author":"chuckumi","date":"2026-05-04 22:52:18","revision":3522778},"1.9.24":{"tag":"1.9.24","author":"chuckumi","date":"2026-05-07 23:33:00","revision":3526042},"1.9.25":{"tag":"1.9.25","author":"chuckumi","date":"2026-05-09 22:23:45","revision":3527469},"1.9.26":{"tag":"1.9.26","author":"chuckumi","date":"2026-05-10 20:17:26","revision":3528001},"1.9.28":{"tag":"1.9.28","author":"chuckumi","date":"2026-05-21 23:52:19","revision":3542925},"1.9.29":{"tag":"1.9.29","author":"chuckumi","date":"2026-05-22 00:51:21","revision":3542960},"1.9.6":{"tag":"1.9.6","author":"chuckumi","date":"2026-04-26 17:21:19","revision":3515885},"1.9.7":{"tag":"1.9.7","author":"chuckumi","date":"2026-04-26 20:57:18","revision":3515959},"1.9.8":{"tag":"1.9.8","author":"chuckumi","date":"2026-04-26 22:51:23","revision":3515989},"1.9.9":{"tag":"1.9.9","author":"chuckumi","date":"2026-04-26 22:54:41","revision":3515991},"2.0.0":{"tag":"2.0.0","author":"chuckumi","date":"2026-05-22 19:57:24","revision":3544408},"2.0.1":{"tag":"2.0.1","author":"chuckumi","date":"2026-05-24 22:47:04","revision":3546711},"2.0.11":{"tag":"2.0.11","author":"chuckumi","date":"2026-06-12 21:48:56","revision":3570567},"2.0.12":{"tag":"2.0.12","author":"chuckumi","date":"2026-06-13 00:22:58","revision":3570646},"2.0.13":{"tag":"2.0.13","author":"chuckumi","date":"2026-06-13 07:56:49","revision":3570846},"2.0.15":{"tag":"2.0.15","author":"chuckumi","date":"2026-06-18 19:48:39","revision":3577782},"2.0.16":{"tag":"2.0.16","author":"chuckumi","date":"2026-06-19 16:27:57","revision":3578953},"2.0.17":{"tag":"2.0.17","author":"chuckumi","date":"2026-07-18 20:17:37","revision":3612969},"2.0.18":{"tag":"2.0.18","author":"chuckumi","date":"2026-07-18 20:30:55","revision":3612982},"2.1.11":{"tag":"2.1.11","author":"chuckumi","date":"2026-07-29 21:18:08","revision":3627697},"2.1.15":{"tag":"2.1.15","author":"chuckumi","date":"2026-07-29 21:26:10","revision":3627705},"2.1.26":{"tag":"2.1.26","author":"chuckumi","date":"2026-08-07 00:52:59","revision":3637136},"2.1.27":{"tag":"2.1.27","author":"chuckumi","date":"2026-08-08 10:23:34","revision":3638602},"2.1.3":{"tag":"2.1.3","author":"chuckumi","date":"2026-07-19 23:10:54","revision":3613992},"2.1.32":{"tag":"2.1.32","author":"chuckumi","date":"2026-08-14 23:39:13","revision":3648057},"2.1.34":{"tag":"2.1.34","author":"chuckumi","date":"2026-08-16 09:45:38","revision":3649501},"2.1.35":{"tag":"2.1.35","author":"chuckumi","date":"2026-08-18 16:36:17","revision":3653273},"2.1.36":{"tag":"2.1.36","author":"chuckumi","date":"2026-08-25 23:38:58","revision":3666099},"2.1.37":{"tag":"2.1.37","author":"chuckumi","date":"2026-08-26 16:52:01","revision":3667484},"2.1.38":{"tag":"2.1.38","author":"chuckumi","date":"2026-08-26 16:53:04","revision":3667488},"2.1.39":{"tag":"2.1.39","author":"chuckumi","date":"2026-08-27 00:27:13","revision":3667948},"2.1.4":{"tag":"2.1.4","author":"chuckumi","date":"2026-07-19 23:37:04","revision":3614000},"2.1.44":{"tag":"2.1.44","author":"chuckumi","date":"2026-09-01 20:14:52","revision":3676792},"2.1.47":{"tag":"2.1.47","author":"chuckumi","date":"2026-09-02 21:35:43","revision":3678698},"2.1.48":{"tag":"2.1.48","author":"chuckumi","date":"2026-09-04 19:30:41","revision":3681736},"2.1.49":{"tag":"2.1.49","author":"chuckumi","date":"2026-09-05 08:46:46","revision":3682276},"2.1.5":{"tag":"2.1.5","author":"chuckumi","date":"2026-07-19 23:12:20","revision":3613993},"2.1.51":{"tag":"2.1.51","author":"chuckumi","date":"2026-09-05 17:51:11","revision":3682711},"2.1.54":{"tag":"2.1.54","author":"chuckumi","date":"2026-09-07 22:46:52","revision":3685711},"2.1.55":{"tag":"2.1.55","author":"chuckumi","date":"2026-09-12 18:09:18","revision":3692987},"2.1.6":{"tag":"2.1.6","author":"chuckumi","date":"2026-07-19 23:25:22","revision":3613998},"2.1.64":{"tag":"2.1.64","author":"chuckumi","date":"2026-09-13 00:17:03","revision":3693210},"2.1.65":{"tag":"2.1.65","author":"chuckumi","date":"2026-09-13 21:03:59","revision":3694184},"2.1.66":{"tag":"2.1.66","author":"chuckumi","date":"2026-09-13 22:17:17","revision":3694245},"2.1.67":{"tag":"2.1.67","author":"chuckumi","date":"2026-09-16 15:29:19","revision":3698897},"2.1.68":{"tag":"2.1.68","author":"chuckumi","date":"2026-09-16 17:40:14","revision":3699052},"2.1.69":{"tag":"2.1.69","author":"chuckumi","date":"2026-09-18 17:32:04","revision":3702473},"2.1.7":{"tag":"2.1.7","author":"chuckumi","date":"2026-07-20 18:20:25","revision":3615800},"2.1.70":{"tag":"2.1.70","author":"chuckumi","date":"2026-09-20 18:45:39","revision":3704546},"2.1.8":{"tag":"2.1.8","author":"chuckumi","date":"2026-07-23 00:41:33","revision":3619315}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3500164,"resolution":"256x256","location":"assets","locale":"","width":256,"height":229}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3526041,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3526041,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"vstrb\/booking-form":{"name":"vstrb\/booking-form","title":"Booking form"}},"tagged_versions":["1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7","1.4.8","1.4.9","1.5.0","1.5.1","1.5.2","1.5.3","1.5.4","1.6.0","1.6.1","1.6.2","1.7.3","1.7.7","1.7.8","1.7.9","1.9.1","1.9.10","1.9.11","1.9.12","1.9.13","1.9.16","1.9.17","1.9.18","1.9.19","1.9.20","1.9.21","1.9.22","1.9.23","1.9.24","1.9.25","1.9.26","1.9.28","1.9.29","1.9.6","1.9.7","1.9.8","1.9.9","2.0.0","2.0.1","2.0.11","2.0.12","2.0.13","2.0.15","2.0.16","2.0.17","2.0.18","2.1.11","2.1.15","2.1.26","2.1.27","2.1.3","2.1.32","2.1.34","2.1.35","2.1.36","2.1.37","2.1.38","2.1.39","2.1.4","2.1.44","2.1.47","2.1.48","2.1.49","2.1.5","2.1.51","2.1.54","2.1.55","2.1.6","2.1.64","2.1.65","2.1.66","2.1.67","2.1.68","2.1.69","2.1.7","2.1.70","2.1.8"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3500164,"resolution":"1","location":"assets","locale":"","width":968,"height":639},"screenshot-10.jpg":{"filename":"screenshot-10.jpg","revision":3497761,"resolution":"10","location":"assets","locale":"","width":2660,"height":1228},"screenshot-11.jpg":{"filename":"screenshot-11.jpg","revision":3497761,"resolution":"11","location":"assets","locale":"","width":2612,"height":1356},"screenshot-12.jpg":{"filename":"screenshot-12.jpg","revision":3497761,"resolution":"12","location":"assets","locale":"","width":2564,"height":1418},"screenshot-13.jpg":{"filename":"screenshot-13.jpg","revision":3497761,"resolution":"13","location":"assets","locale":"","width":1356,"height":1416},"screenshot-14.jpg":{"filename":"screenshot-14.jpg","revision":3627695,"resolution":"14","location":"assets","locale":"","width":2542,"height":1332},"screenshot-15.jpg":{"filename":"screenshot-15.jpg","revision":3627695,"resolution":"15","location":"assets","locale":"","width":2886,"height":1568},"screenshot-16.jpg":{"filename":"screenshot-16.jpg","revision":3627695,"resolution":"16","location":"assets","locale":"","width":2072,"height":1328},"screenshot-17.jpg":{"filename":"screenshot-17.jpg","revision":3627695,"resolution":"17","location":"assets","locale":"","width":2406,"height":1646},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3497761,"resolution":"2","location":"assets","locale":"","width":1026,"height":1418},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3497761,"resolution":"3","location":"assets","locale":"","width":1084,"height":716},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3497761,"resolution":"4","location":"assets","locale":"","width":2534,"height":1300},"screenshot-5.jpg":{"filename":"screenshot-5.jpg","revision":3497761,"resolution":"5","location":"assets","locale":"","width":2476,"height":1102},"screenshot-6.jpg":{"filename":"screenshot-6.jpg","revision":3497761,"resolution":"6","location":"assets","locale":"","width":2474,"height":1096},"screenshot-7.jpg":{"filename":"screenshot-7.jpg","revision":3497761,"resolution":"7","location":"assets","locale":"","width":2880,"height":1362},"screenshot-8.jpg":{"filename":"screenshot-8.jpg","revision":3497761,"resolution":"8","location":"assets","locale":"","width":2480,"height":1406},"screenshot-9.jpg":{"filename":"screenshot-9.jpg","revision":3497761,"resolution":"9","location":"assets","locale":"","width":2690,"height":698}},"screenshots":{"1":"Frontend availability calendar.","2":"Booking form - guest contact information.","3":"Booking form - services and price overview.","4":"Admin - Unit management and settings.","5":"Admin - Rates and pricing engine configuration.","6":"Admin - Apartment-specific services configuration.","7":"Admin - Bookings overview from website and external channels (Booking.com, Airbnb, etc.).","8":"Admin - Customizing the visual appearance of the calendar and forms.","9":"Admin - Guest registration management for tourist tax records.","10":"Admin - Advanced discounts and seasonal pricing rules.","11":"Admin - Two-way iCal synchronization settings for external OTAs.","12":"Admin - Global services and amenities management.","13":"Public guest registration form for collecting tourist tax data.","14":"Admin - Payment methods configuration.","15":"Admin - Invoice management.","16":"Booking form - payment options.","17":"Hosted payment page via Stripe or Mollie.","18":"Admin - Multilingual apartment content templates.","19":"Admin - Apartment-specific arrival instructions and content overrides."}},"plugin_section":[],"plugin_tags":[269,416,7103,5075,722],"plugin_category":[40],"plugin_contributors":[259308],"plugin_business_model":[],"class_list":["post-283320","plugin","type-plugin","status-publish","hentry","plugin_tags-booking","plugin_tags-calendar","plugin_tags-ical","plugin_tags-rental","plugin_tags-reservation","plugin_category-calendar-and-events","plugin_contributors-chuckumi","plugin_committers-chuckumi"],"banners":{"banner":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/banner-772x250.jpg?rev=3526041","banner_2x":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/banner-1544x500.jpg?rev=3526041","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/icon-256x256.jpg?rev=3500164","icon_2x":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/icon-256x256.jpg?rev=3500164","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-1.jpg?rev=3500164","caption":"Frontend availability calendar."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-2.jpg?rev=3497761","caption":"Booking form - guest contact information."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-3.jpg?rev=3497761","caption":"Booking form - services and price overview."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-4.jpg?rev=3497761","caption":"Admin - Unit management and settings."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-5.jpg?rev=3497761","caption":"Admin - Rates and pricing engine configuration."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-6.jpg?rev=3497761","caption":"Admin - Apartment-specific services configuration."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-7.jpg?rev=3497761","caption":"Admin - Bookings overview from website and external channels (Booking.com, Airbnb, etc.)."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-8.jpg?rev=3497761","caption":"Admin - Customizing the visual appearance of the calendar and forms."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-9.jpg?rev=3497761","caption":"Admin - Guest registration management for tourist tax records."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-10.jpg?rev=3497761","caption":"Admin - Advanced discounts and seasonal pricing rules."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-11.jpg?rev=3497761","caption":"Admin - Two-way iCal synchronization settings for external OTAs."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-12.jpg?rev=3497761","caption":"Admin - Global services and amenities management."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-13.jpg?rev=3497761","caption":"Public guest registration form for collecting tourist tax data."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-14.jpg?rev=3627695","caption":"Admin - Payment methods configuration."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-15.jpg?rev=3627695","caption":"Admin - Invoice management."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-16.jpg?rev=3627695","caption":"Booking form - payment options."},{"src":"https:\/\/ps.w.org\/vachr-short-term-rental-reservations\/assets\/screenshot-17.jpg?rev=3627695","caption":"Hosted payment page via Stripe or Mollie."}],"raw_content":"<!--section=description-->\n<p><strong>Vachr Short-Term Rental Reservations<\/strong> turns WordPress into a booking and management system for apartments, vacation homes, and rooms. Manage availability, pricing, reservations, guests, services, payments, and external calendars from one place.<\/p>\n\n<p>[youtube https:\/\/www.youtube.com\/watch?v=v1sXajxPurg]\nVideo tutorial: https:\/\/www.youtube.com\/watch?v=v1sXajxPurg\nThe plugin is free and supports unlimited apartments. Donations help fund continued development.<\/p>\n\n<p>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.<\/p>\n\n<h4>Key Advantages<\/h4>\n\n<ul>\n<li><strong>Pricing and availability:<\/strong> Configure seasonal and weekend rates, discounts, exact closures, and recurring rental seasons.<\/li>\n<li><strong>Two-way iCal:<\/strong> Synchronize availability with Airbnb, Booking.com, VRBO, and other compatible services.<\/li>\n<li><strong>Payments and invoices:<\/strong> Accept Stripe, Mollie, bank transfer, or cash and track transactions, invoices, and payment status.<\/li>\n<li><strong>Czech QR payments:<\/strong> Generate SPD QR codes for CZK transfers when the supplier uses a Czech IBAN.<\/li>\n<li><strong>Guest registration:<\/strong> Create custom fields, link registrations to bookings, and correct unmatched records in the administration.<\/li>\n<li><strong>Reservation photos:<\/strong> Upload multiple photos to each reservation and keep them in a separate, configurable server folder.<\/li>\n<li><strong>Services and amenities:<\/strong> Price optional services and assign a reusable, translatable amenities catalog to each apartment.<\/li>\n<li><strong>Multilingual content:<\/strong> Reuse translated descriptions and arrival instructions with apartment-specific overrides.<\/li>\n<li><strong>Automation:<\/strong> Email arrival instructions and assign cleaning, handover, management, or repair tasks with confirmation and escalation.<\/li>\n<li><strong>Staff calendar:<\/strong> Show each staff member a color-coded duty calendar with task details and takeover links.<\/li>\n<li><strong>Custom appearance:<\/strong> Preview calendar and form styling on desktop or mobile before publishing.<\/li>\n<li><strong>Google Vacation Rental SEO (Pro):<\/strong> The optional add-on generates editable <code>VacationRental<\/code> JSON-LD from apartment data.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<p>[youtube https:\/\/www.youtube.com\/watch?v=ss2JD-JexpM]\nVideo tutorial: https:\/\/www.youtube.com\/watch?v=ss2JD-JexpM\n<em>Watch this video to see how to manage and use the system.<\/em><\/p>\n\n<ol>\n<li>Upload the plugin files to the <code>\/wp-content\/plugins\/vachr-short-term-rental-reservations<\/code> directory, or install the plugin through the WordPress plugins screen directly.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Go to the 'Apartments' menu to create your first rental unit.<\/li>\n<li>Use the provided shortcodes to display the booking form or calendar on your pages.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20configure%20wp%20super%20cache%20or%20a%20cdn%20with%20this%20plugin%3F\"><h3>How do I configure WP Super Cache or a CDN with this plugin?<\/h3><\/dt>\n<dd><p>The plugin sends <code>Cache-Control: no-store, no-cache, must-revalidate, max-age=0, private<\/code>, <code>Pragma: no-cache<\/code>, and <code>Expires: 0<\/code> for every endpoint in its REST namespace (<code>\/wp-json\/vstrb\/v1\/...<\/code>). It also sets WordPress' <code>DONOTCACHEPAGE<\/code> flag while those requests are handled.<\/p>\n\n<p>In <strong>Settings -&gt; WP Super Cache -&gt; Advanced -&gt; Accepted Filenames &amp; Rejected URIs<\/strong>, add this rule and then delete any existing cache:<\/p>\n\n<pre><code>^\/wp-json\/vstrb\/v1\/\n<\/code><\/pre>\n\n<p>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.<\/p>\n\n<p>Frontend and admin JavaScript\/CSS are versioned with the plugin version and the asset modification time, so browser caches automatically fetch changed assets. If an old frontend still appears, clear page\/minification caches in WP Optimize and any CDN cache. Public billing, guest-registration, and staff-task behavior is loaded from the versioned <code>assets\/frontend.js<\/code> file. Admin controls are initialized by the versioned <code>assets\/admin.js<\/code> file; dynamic admin-page configuration is carried as data rather than inline <code>&lt;script&gt;<\/code> blocks, so optimizers cannot silently remove the executable script itself.<\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20the%20booking%20form%3F\"><h3>How do I display the booking form?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[vstrb_booking_form unit=\"YOUR_ID\"]<\/code>.<\/p>\n\n<p>Optional parameters:<\/p>\n\n<ul>\n<li><code>months=\"N\"<\/code> - number of calendar months to display (default: <code>1<\/code>).<\/li>\n<li><code>grid=\"N\"<\/code> - number of month columns in the calendar grid (default: <code>1<\/code>).<\/li>\n<li><code>currency=\"CODE\"<\/code> - currency code used in the price breakdown (default: <code>EUR<\/code>).<\/li>\n<li><code>language=\"CODE\"<\/code> - two-letter language code (e.g. <code>cs<\/code>, <code>de<\/code>, <code>en<\/code>) used for services, contact field labels, and the price quote. If omitted, the language of the current page (reflected in the <code>&lt;html lang&gt;<\/code> attribute, set automatically by multilingual plugins) is used; the visitor's browser language serves as a last resort fallback.<\/li>\n<li><code>enable_stripe=\"1\"<\/code> - show card payment via Stripe. Configure Stripe keys and webhook secret in <strong>Bookings -&gt; Settings -&gt; Payments<\/strong>.<\/li>\n<li><code>enable_mollie=\"1\"<\/code> - show card payment via Mollie. Configure the Mollie API key and use the displayed Mollie webhook URL in <strong>Bookings -&gt; Settings -&gt; Payments<\/strong>.<\/li>\n<li><code>enable_bank_transfer=\"1\"<\/code> - show bank transfer payment. Configure default bank instructions in <strong>Bookings -&gt; Settings -&gt; Payments<\/strong>, or translated per-apartment instructions in <strong>Bookings -&gt; Apartment Content<\/strong>.<\/li>\n<li><code>enable_cash=\"1\"<\/code> - show cash payment.<\/li>\n<\/ul>\n\n<p>Billing details in the booking form are optional for all payment methods. Guests can enable them with <strong>Add Billing Details<\/strong> 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.\n* <code>show_gender=\"0\"<\/code> - hide the gender field (shown by default).\n* <code>show_country=\"1\"<\/code> - show an ISO 3166-1 country selector (shown by default; use <code>show_country=\"0\"<\/code> to hide it).\n* <code>show_children=\"0\"<\/code> - 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.\n* <code>show_children_ages=\"1\"<\/code> - show a required age field for each child (0\u201317 years), dynamically matching the selected number of children. Enabled by default; use <code>show_children_ages=\"0\"<\/code> to disable it. Ages are stored with the reservation.\n* <code>country=\"CZ\"<\/code> - preselect an ISO 3166-1 country. If omitted, the form detects it from the shortcode or page language.\n* <code>consent_key<\/code>, <code>consent_label<\/code>, <code>consent_required=\"1\"<\/code> - add one consent checkbox directly to this form. The label supports <code>[link url=\"https:\/\/example.com\/terms\"]Terms[\/link]<\/code>; use <code>order=\"...,consents,...\"<\/code> to position it.<\/p>\n\n<p>For reusable consent or terms checkboxes, open <strong>Bookings -&gt; Settings -&gt; Contact Fields<\/strong>. Create a field with type <strong>Checkbox \/ consent<\/strong>, choose whether it is required, add a translated label (including an optional <code>[link url=\"...\"]...[\/link]<\/code> link), then select the field in the apartment editor's <strong>Contact Fields<\/strong> section. The selected value is saved with every reservation.<\/p>\n\n<p>The <strong>Terms and conditions<\/strong> step in the apartment setup wizard creates and assigns the required <code>terms_and_conditions<\/code> consent automatically. Its label can use the same <code>[link]<\/code> syntax and is saved with the reservation. In the public booking form, this Terms checkbox is always displayed immediately before the submit button.\n* <code>layout=\"stacked|two-column|compact\"<\/code> - choose the form layout. <code>stacked<\/code> is the default; <code>two-column<\/code> uses a responsive two-column layout on larger screens.\n* <code>order=\"calendar,guests,services,pricing,contact,consents,payment,security,submit\"<\/code> - define the order of the form sections. Omitted sections are appended in the default order.<\/p>\n\n<p>When creating a page from an apartment with <strong>Create apartment page<\/strong>, the page creation wizard also lets you choose how many calendar months the generated booking form displays (1\u201312) and how many month columns it uses (1\u20136). The wizard defaults to 2 months and 1 column; the layout automatically adapts to smaller screens.<\/p>\n\n<p>Example: <code>[vstrb_booking_form unit=\"YOUR_ID\" language=\"de\" show_gender=\"0\" show_country=\"1\" country=\"DE\"]<\/code><\/p>\n\n<p>Layout example: <code>[vstrb_booking_form unit=\"YOUR_ID\" layout=\"two-column\" order=\"calendar,guests,contact,consents,services,pricing,payment,security,submit\"]<\/code><\/p>\n\n<p>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 <strong>Bookings -&gt; Settings -&gt; General -&gt; Lazy-load Booking Form<\/strong>. Use <code>defer=\"0\"<\/code> in a shortcode to disable lazy loading for that one form.<\/p>\n\n<p>Payment example with Mollie and bank transfer:\n    [vstrb_booking_form unit=\"YOUR_ID\" enable_mollie=\"1\" enable_bank_transfer=\"1\" enable_cash=\"1\"]<\/p>\n\n<p>Payment example with all payment methods:\n    [vstrb_booking_form unit=\"YOUR_ID\" enable_stripe=\"1\" enable_mollie=\"1\" enable_bank_transfer=\"1\" enable_cash=\"1\"]<\/p><\/dd>\n<dt id=\"how%20do%20i%20configure%20discount%20codes%3F\"><h3>How do I configure discount codes?<\/h3><\/dt>\n<dd><p>Open <strong>Bookings -&gt; Rates<\/strong> and find the <strong>Reusable discount codes<\/strong> section. Select an apartment, then:<\/p>\n\n<ol>\n<li>In the <strong>Reusable discount codes<\/strong> section, select the accommodation and add one or more codes, for example <code>WELCOME10<\/code> and <code>SUMMER15<\/code>.<\/li>\n<li>Enter the percentage discount for each code, from 0 to 100.<\/li>\n<li>Optionally set <strong>Valid from<\/strong> and <strong>Valid to<\/strong> 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.<\/li>\n<li>Enable <strong>Show the discount code field in the booking form<\/strong> if guests should be able to enter a code manually.<\/li>\n<\/ol>\n\n<p>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.<\/p>\n\n<p>To distribute the code through a private or campaign link without showing a field, add the <code>discount_code<\/code> GET parameter to the booking page URL:<\/p>\n\n<pre><code>https:\/\/example.com\/book\/?discount_code=WELCOME10\n<\/code><\/pre>\n\n<p>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.<\/p><\/dd>\n<dt id=\"how%20do%20i%20collect%20the%20age%20of%20each%20child%3F\"><h3>How do I collect the age of each child?<\/h3><\/dt>\n<dd><p>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.<\/p>\n\n<p>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:<\/p>\n\n<pre><code>[vstrb_booking_form unit=\"YOUR_ID\" show_children_ages=\"0\"]\n<\/code><\/pre><\/dd>\n<dt id=\"how%20do%20i%20collect%20billing%20details%20for%20an%20existing%20reservation%3F\"><h3>How do I collect billing details for an existing reservation?<\/h3><\/dt>\n<dd><p>Use <code>[vstrb_billing_form]<\/code> 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.<\/p>\n\n<p>For a public link, pass the reservation ID and its secure token: <code>https:\/\/example.com\/billing\/?booking_id=123&amp;token=TOKEN<\/code>. The token is the same token used by the reservation's price-offer link. You can also use an external channel reservation ID with <code>external_id<\/code> and <code>external_id_param<\/code> when the imported reservation has <code>external_booking_id<\/code> stored.<\/p>\n\n<p>Examples: <code>[vstrb_billing_form]<\/code> or <code>[vstrb_billing_form booking_id=\"123\" token=\"TOKEN\"]<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20enable%20mollie%20payments%3F\"><h3>How do I enable Mollie payments?<\/h3><\/dt>\n<dd><ol>\n<li>Go to <strong>Bookings -&gt; Settings -&gt; Payments<\/strong>.<\/li>\n<li>Enter your Mollie API key (<code>test_...<\/code> or <code>live_...<\/code>).<\/li>\n<li>Copy the displayed <strong>Mollie Webhook URL<\/strong> into your Mollie dashboard webhook settings.<\/li>\n<li>Add <code>enable_mollie=\"1\"<\/code> to your booking form shortcode.<\/li>\n<\/ol>\n\n<p>Example: <code>[vstrb_booking_form unit=\"YOUR_ID\" enable_mollie=\"1\"]<\/code><\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20the%20availability%20calendar%3F\"><h3>How do I display the availability calendar?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[vstrb_availability_calendar unit=\"YOUR_ID\" months=\"3\"]<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20collect%20guest%20registration%20data%20%28e.g.%20from%20booking.com%20guests%29%3F\"><h3>How do I collect guest registration data (e.g. from Booking.com guests)?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[vstrb_guest_registration unit=\"YOUR_ID\"]<\/code> 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 <strong>Bookings -&gt; Guest Registrations<\/strong> in the admin panel.<\/p>\n\n<p>If the registration link contains a specific apartment (<code>unit<\/code>), 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.<\/p>\n\n<p>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.<\/p>\n\n<p>Optional parameters:<\/p>\n\n<ul>\n<li><code>title=\"TEXT\"<\/code> - custom heading displayed above the form. If omitted, the apartment name is used as the heading.<\/li>\n<li><code>language=\"LOCALE\"<\/code> - locale code (e.g. <code>cs_CZ<\/code>, <code>de_DE<\/code>, <code>en_US<\/code>) to render the form labels in a specific language. If omitted, the current site language is used.<\/li>\n<li><code>param=\"accommodation\"<\/code> - resolve the apartment from a URL parameter instead of a fixed <code>unit<\/code> ID. This is useful for Booking.com links with <code>[PROPERTY_NAME]<\/code>.<\/li>\n<li><code>match=\"contains\"<\/code> - allow one unique partial match when Booking.com sends a longer or shorter property name.<\/li>\n<li><code>fallback=\"TEXT\"<\/code> - text shown when no unique apartment is matched.<\/li>\n<\/ul>\n\n<p>Example: <code>[vstrb_guest_registration unit=\"YOUR_ID\" title=\"Apartment Modry Dum\" language=\"cs_CZ\"]<\/code><\/p>\n\n<p>Booking.com example page shortcode:\n    [vstrb_guest_registration param=\"accommodation\" language=\"en_US\" fallback=\"Accommodation not found. Please contact us.\"]<\/p>\n\n<p>Booking.com message URL:\n    https:\/\/example.com\/accommodation-registration-tourist-tax\/?accommodation=[PROPERTY_NAME]&amp;source=booking_com<\/p>\n\n<p>Add the exact Booking.com property name to <strong>External accommodation names \/ aliases<\/strong> in the matching apartment editor. One alias per line is supported. Matching ignores case, accents, and extra punctuation.<\/p><\/dd>\n<dt id=\"how%20do%20i%20manage%20multilingual%20apartment%20descriptions%2C%20amenities%2C%20arrival%20instructions%2C%20and%20bank%20transfer%20instructions%3F\"><h3>How do I manage multilingual apartment descriptions, amenities, arrival instructions, and bank transfer instructions?<\/h3><\/dt>\n<dd><p>Create reusable content templates under <strong>Bookings -&gt; Apartment Content<\/strong>. Each template can contain translated apartment descriptions, amenities text, arrival instructions, and bank transfer payment instructions for the languages configured in <strong>Bookings -&gt; Settings<\/strong>.<\/p>\n\n<p>Then open an apartment and use the <strong>Guest-facing Apartment Content<\/strong> section in the apartment details. You can assign a template and optionally override any language directly for that apartment.<\/p>\n\n<p>Template texts support placeholders in double braces. Built-in placeholders include:<\/p>\n\n<ul>\n<li><code>{{apartment_name}}<\/code><\/li>\n<li><code>{{apartment_id}}<\/code><\/li>\n<li><code>{{site_name}}<\/code><\/li>\n<li><code>{{checkin_time}}<\/code><\/li>\n<li><code>{{checkout_time}}<\/code><\/li>\n<li><code>{{capacity}}<\/code><\/li>\n<li><code>{{booking_id}}<\/code> - available in arrival instruction emails.<\/li>\n<li><code>{{guest_name}}<\/code> - available in arrival instruction emails.<\/li>\n<li><code>{{date_from}}<\/code> and <code>{{date_to}}<\/code> - available in arrival instruction emails.<\/li>\n<\/ul>\n\n<p>Bank transfer templates additionally support:<\/p>\n\n<ul>\n<li><code>{{iban}}<\/code> - the supplier account in international IBAN format.<\/li>\n<li><code>{{account_number}}<\/code> and <code>{{bank_account}}<\/code> - the domestic account number. A Czech IBAN is converted to formats such as <code>19-2000145399\/0800<\/code>.<\/li>\n<li><code>{{account_country}}<\/code> - the two-letter IBAN country code, for example <code>CZ<\/code>.<\/li>\n<li><code>{{invoice_number}}<\/code> - the generated invoice number.<\/li>\n<li><code>{{variable_symbol}}<\/code> - digits extracted from the invoice number, limited to the last 10 digits.<\/li>\n<li><code>{{payment_reference}}<\/code> - the full invoice number used as the payment reference.<\/li>\n<li><code>{{payment_amount}}<\/code> and <code>{{payment_amount_due}}<\/code> - the amount to pay.<\/li>\n<li><code>{{payment_currency}}<\/code> - the payment currency, for example <code>CZK<\/code>.<\/li>\n<li><code>{{amount}}<\/code> and <code>{{currency}}<\/code> - short aliases for the payment amount and currency.<\/li>\n<\/ul>\n\n<p>Example bank transfer template:<\/p>\n\n<pre><code>Amount: {{payment_amount}} {{payment_currency}}\nIBAN: {{iban}}\nVariable symbol: {{variable_symbol}}\nReference: {{payment_reference}}\n<\/code><\/pre>\n\n<p>Bank transfer callbacks use the generic <strong>Bank Notify URL<\/strong> from settings. The endpoint accepts JSON, form-encoded payloads, and simple XML bodies. It recognizes common wrapper keys such as <code>transaction<\/code>, <code>payment<\/code>, <code>data<\/code>, <code>entry<\/code>, or <code>accountStatement<\/code>, and common aliases:<\/p>\n\n<ul>\n<li>token: <code>token<\/code>, <code>webhook_token<\/code>, <code>secret<\/code>, <code>shared_secret<\/code>, <code>api_key<\/code>, or the <code>X-VSTRB-Token<\/code>, <code>X-Webhook-Token<\/code>, or <code>Authorization: Bearer ...<\/code> header.<\/li>\n<li>booking: <code>booking_id<\/code>, <code>bookingId<\/code>, <code>reservation_id<\/code>, or <code>order_id<\/code>.<\/li>\n<li>invoice: <code>invoice_number<\/code>, <code>invoiceNumber<\/code>, <code>invoice_no<\/code>, <code>invoice<\/code>, or <code>bill_number<\/code>.<\/li>\n<li>reference \/ variable symbol: <code>reference<\/code>, <code>payment_reference<\/code>, <code>variable_symbol<\/code>, <code>variableSymbol<\/code>, <code>vs<\/code>, <code>transaction_id<\/code>, <code>bank_reference<\/code>, <code>endToEndId<\/code>, <code>remittanceInformation<\/code>, <code>message<\/code>, <code>note<\/code>, or <code>userIdentification<\/code>.<\/li>\n<li>amount and currency: <code>amount<\/code>, <code>value<\/code>, <code>transaction_amount<\/code>, <code>castka<\/code>, <code>sum<\/code>, <code>currency<\/code>, <code>ccy<\/code>, or <code>mena<\/code>.<\/li>\n<\/ul>\n\n<p>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 directly to a specific bank API by itself; a bank export, external automation, or middleware can call the endpoint in one of the supported shapes.<\/p>\n\n<p>You can also define custom placeholders in the apartment editor, for example <code>door_pin<\/code>, <code>wifi_password<\/code>, or <code>parking_note<\/code>. Custom placeholders can have one global value or language-specific values. Use them as <code>{{door_pin}}<\/code> or with a fallback like <code>{{door_pin|provided before arrival}}<\/code>.<\/p>\n\n<p>Example: door PIN and Wi-Fi password<\/p>\n\n<ol>\n<li>Open <strong>Apartments -&gt; Edit Apartment<\/strong>.<\/li>\n<li>In <strong>Guest-facing Apartment Content -&gt; Template Placeholders<\/strong>, add:\n\n<ul>\n<li>Key: <code>door_pin<\/code><\/li>\n<li>Global value: <code>123456<\/code><\/li>\n<\/ul><\/li>\n<li>Add another placeholder:\n\n<ul>\n<li>Key: <code>wifi_password<\/code><\/li>\n<li>Global value: <code>MySecureWifiPassword<\/code><\/li>\n<\/ul><\/li>\n<li><p>Use these placeholders in an arrival instruction template:<\/p>\n\n<p>Your apartment is {{apartment_name}}.\nCheck-in is possible from {{checkin_time}}.\nThe entrance door PIN is {{door_pin}}.\nThe Wi-Fi password is {{wifi_password}}.<\/p><\/li>\n<\/ol>\n\n<p>Example: translated custom placeholder<\/p>\n\n<p>If a placeholder contains text that should be translated, fill the language-specific values:<\/p>\n\n<ul>\n<li>Key: <code>parking_note<\/code><\/li>\n<li>Global value: <code>Parking is available behind the house.<\/code><\/li>\n<li>CS value: <code>Parkovani je mozne za domem.<\/code><\/li>\n<li>DE value: <code>Parken ist hinter dem Haus moeglich.<\/code><\/li>\n<\/ul>\n\n<p>Then use it in a template:<\/p>\n\n<pre><code>{{parking_note}}\n<\/code><\/pre>\n\n<p>When the content is displayed or emailed in Czech, the CS value is used. In German, the DE value is used. If no matching language value exists, the global value is used.<\/p>\n\n<p>Example: fallback text when a value is missing<\/p>\n\n<pre><code>Door PIN: {{door_pin|provided before arrival}}\n<\/code><\/pre>\n\n<p>If <code>door_pin<\/code> is empty, the guest will see <code>provided before arrival<\/code> instead of a blank value.<\/p>\n\n<p>You can display the saved content with these shortcodes:<\/p>\n\n<ul>\n<li><code>[vstrb_unit_description unit=\"YOUR_ID\" language=\"cs\"]<\/code><\/li>\n<li><code>[vstrb_unit_amenity_list unit=\"YOUR_ID\" language=\"cs\"]<\/code><\/li>\n<li><code>[vstrb_unit_arrival_instructions unit=\"YOUR_ID\" language=\"cs\"]<\/code><\/li>\n<li><code>[vstrb_unit_arrival_instructions_by_code param=\"unit_code\" language=\"cs\"]<\/code><\/li>\n<li><code>[vstrb_unit_arrival_instructions_by_name param=\"accommodation\" language=\"cs\"]<\/code><\/li>\n<li><code>[vstrb_unit_arrival_instructions_by_reservation]<\/code><\/li>\n<\/ul>\n\n<p>If the <code>language<\/code> attribute is omitted, the site language is used. Apartment-specific text has priority over the selected template.<\/p>\n\n<p>To show arrival instructions without exposing an internal apartment ID, prefer <code>[vstrb_unit_arrival_instructions_by_code]<\/code>. Set a <strong>Public apartment code<\/strong> 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.<\/p>\n\n<p>Example page shortcode:\n    [vstrb_unit_arrival_instructions_by_code param=\"unit_code\" language=\"cs\" fallback=\"Accommodation not found. Please contact us.\"]<\/p>\n\n<p>Example guest URL:\n    https:\/\/example.com\/arrival\/?unit_code=blue-house<\/p>\n\n<p>If an external channel can only send the accommodation name, use <code>[vstrb_unit_arrival_instructions_by_name]<\/code> and add the exact channel-specific names to <strong>External accommodation names \/ aliases<\/strong> in the apartment editor. The shortcode matches the URL value against the apartment title and these aliases. Matching ignores case, accents, and extra punctuation.<\/p>\n\n<p>Optional parameters:<\/p>\n\n<ul>\n<li><code>param=\"NAME\"<\/code> - GET parameter containing the public code or accommodation name. Defaults: <code>unit_code<\/code> for the code shortcode, <code>unit_name<\/code> for the name shortcode.<\/li>\n<li><code>code=\"TEXT\"<\/code> - use a fixed public apartment code instead of a GET parameter, useful for testing.<\/li>\n<li><code>name=\"TEXT\"<\/code> - use a fixed accommodation name or alias instead of a GET parameter, useful for testing.<\/li>\n<li><code>match=\"exact\"<\/code> - default exact normalized title match.<\/li>\n<li><code>match=\"contains\"<\/code> - name shortcode only: allow one unique partial match when an external channel sends a longer or shorter name.<\/li>\n<li><code>show_title=\"1\"<\/code> - show the matched apartment title above the instructions.<\/li>\n<li><code>fallback=\"TEXT\"<\/code> - text shown when no unique apartment is matched.<\/li>\n<\/ul><\/dd>\n<dt id=\"how%20do%20automated%20arrival%20instruction%20emails%20work%3F\"><h3>How do automated arrival instruction emails work?<\/h3><\/dt>\n<dd><p>In the apartment editor, enable <strong>Email arrival instructions automatically before check-in<\/strong> and set <strong>Send days before arrival<\/strong>.<\/p>\n\n<p>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.<\/p>\n\n<p>To display arrival instructions by matching a guest stay, use:\n    [vstrb_unit_arrival_instructions_by_reservation]<\/p>\n\n<p>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 <code>2026-06-01<\/code>, <code>1.6.2026<\/code>, <code>01\/06\/2026<\/code>, and <code>06\/01\/2026<\/code>; 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.<\/p>\n\n<p>Example page shortcode:\n    [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.\"]<\/p>\n\n<p>Example guest URL, password: <code>testtest<\/code>:\n    https:\/\/vachr.cz\/apartment-1-demo-pin\/?checkin=2026-06-23&amp;checkout=25.6.2026&amp;guest_first_name=Jan&amp;guest_last_name=Novak<\/p>\n\n<p>Optional parameters:<\/p>\n\n<ul>\n<li><code>unit=\"ID\"<\/code> - limit matching to one apartment, useful when date combinations may repeat across apartments.<\/li>\n<li><code>date_from_param=\"date_from\"<\/code> - URL parameter containing arrival.<\/li>\n<li><code>date_to_param=\"date_to\"<\/code> - URL parameter containing departure.<\/li>\n<li><code>first_name_param=\"first_name\"<\/code> - URL parameter containing first name.<\/li>\n<li><code>last_name_param=\"last_name\"<\/code> - URL parameter containing last name.<\/li>\n<li><code>date_from=\"YYYY-MM-DD\"<\/code> - fixed arrival date instead of a URL parameter.<\/li>\n<li><code>date_to=\"YYYY-MM-DD\"<\/code> - fixed departure date instead of a URL parameter.<\/li>\n<li><code>first_name=\"TEXT\"<\/code> - fixed first name instead of a URL parameter.<\/li>\n<li><code>last_name=\"TEXT\"<\/code> - fixed last name instead of a URL parameter.<\/li>\n<li><code>language=\"cs\"<\/code> - language used for apartment instructions.<\/li>\n<li><code>show_title=\"1\"<\/code> - show the matched or fallback apartment title above the instructions.<\/li>\n<li><code>fallback=\"TEXT\"<\/code> - text shown when no apartment has arrival instructions.<\/li>\n<li><code>available_days_before=\"1\"<\/code> - how many days before arrival the instructions may be shown. Default: <code>1<\/code>. Use <code>0<\/code> to show them only on the arrival day.<\/li>\n<li><code>unavailable_text=\"TEXT\"<\/code> - text shown when the guest opens the page too early. If omitted, a translated default message is shown.<\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20pre-fill%20the%20guest%20registration%20form%20from%20a%20url%3F\"><h3>Can I pre-fill the guest registration form from a URL?<\/h3><\/dt>\n<dd><p>Yes. The <code>[vstrb_guest_registration]<\/code> shortcode reads the following GET parameters and pre-fills the corresponding form fields:<\/p>\n\n<ul>\n<li><code>date_from<\/code> - check-in date (format: <code>YYYY-MM-DD<\/code>)<\/li>\n<li><code>date_to<\/code> - check-out date (format: <code>YYYY-MM-DD<\/code>)<\/li>\n<li><code>first_name<\/code> - guest's first name (pre-fills the first guest block)<\/li>\n<li><code>last_name<\/code> - guest's last name (pre-fills the first guest block)<\/li>\n<li><code>source<\/code> - booking source; accepted values: <code>booking_com<\/code>, <code>airbnb<\/code>, <code>vrbo<\/code>, <code>expedia<\/code>, <code>direct<\/code>, <code>other<\/code><\/li>\n<li><code>booking_ref<\/code> - booking reference number<\/li>\n<li><code>accommodation<\/code> - external accommodation name used to resolve the apartment when <code>[vstrb_guest_registration param=\"accommodation\"]<\/code> is used<\/li>\n<\/ul>\n\n<p>Example URL:\n    https:\/\/bayernrelax.eu\/en\/accommodation-instructions\/?accommodation=[PROPERTY_NAME]&amp;date_from=2026-07-01&amp;date_to=2026-07-07&amp;first_name=John&amp;last_name=Doe&amp;source=booking_com&amp;booking_ref=1234567890<\/p>\n\n<p>This is useful when sending a registration link directly from a booking confirmation email.<\/p><\/dd>\n<dt id=\"how%20do%20admin%20price%20offers%20work%20for%20imported%20reservations%3F\"><h3>How do admin price offers work for imported reservations?<\/h3><\/dt>\n<dd><p>Open <strong>Bookings<\/strong>, click <strong>Offer<\/strong> on any reservation, and use the <strong>Price offer<\/strong> panel. The plugin calculates the price from the current reservation unit, dates, guest count, services, seasonal rates, discounts, surcharges, and refundable deposit settings.<\/p>\n\n<p>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.<\/p>\n\n<p>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 <strong>Send offer to email<\/strong>. If the iCal description contains an email address, the field is prefilled automatically.<\/p>\n\n<p>Each offer also has a private public link in <strong>Public price offer link<\/strong>. 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.<\/p>\n\n<p>The email sent from the price offer panel includes the offer summary and the same public price offer link.<\/p><\/dd>\n<dt id=\"where%20are%20plugin%20settings%20managed%3F\"><h3>Where are plugin settings managed?<\/h3><\/dt>\n<dd><p>Open <strong>Bookings -&gt; Settings<\/strong>. The page is split into tabs so operational configuration is kept in one place:<\/p>\n\n<ul>\n<li><strong>General<\/strong> - languages, currencies, conversion rates, and shared defaults.<\/li>\n<li><strong>Notifications<\/strong> - staff work types, recipients, confirmation, escalation, daily send time, and staff calendar shortcode.<\/li>\n<li><strong>Payments<\/strong> - Stripe, Mollie, bank transfer, payment callbacks, and payment behaviour.<\/li>\n<li><strong>Invoicing<\/strong> - invoice numbering, language, supplier, tax, and bank details.<\/li>\n<li><strong>Calendar<\/strong> - the global booking-calendar price display mode.<\/li>\n<li><strong>Appearance<\/strong> - booking form and calendar styling, including the live desktop\/mobile preview.<\/li>\n<li><strong>Services<\/strong>, <strong>Amenities<\/strong>, and <strong>Contact Fields<\/strong> - reusable catalogs and fields used by apartments and booking forms.<\/li>\n<\/ul>\n\n<p>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 <strong>Bookings -&gt; Settings -&gt; General -&gt; Reservation photo uploads<\/strong>, choose <strong>Show, optional<\/strong>, <strong>Show, required<\/strong>, or <strong>Do not show<\/strong>. Configure the absolute server path under <strong>Reservation photo folder<\/strong>. When left empty, private files are stored outside the public uploads directory in <code>..\/vstrb-private-booking-photos<\/code>. 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.<\/p>\n\n<p><strong>iCal Imports<\/strong> remains a separate item under <strong>Bookings<\/strong>, because it is an operational synchronization screen with per-apartment imports, export URLs, and an immediate import action.<\/p><\/dd>\n<dt id=\"how%20do%20i%20automate%20cleaning%2C%20handover%2C%20manager%2C%20or%20repair%20notifications%3F\"><h3>How do I automate cleaning, handover, manager, or repair notifications?<\/h3><\/dt>\n<dd><p>Open <strong>Bookings -&gt; Settings -&gt; Notifications<\/strong>. Create a notification type for each duty, for example Cleaning, Manager, Repair, or a custom duty. For every type choose:<\/p>\n\n<ul>\n<li>The trigger: new booking, guest registration, arrival, departure\/cleaning, or iCal cancellation.<\/li>\n<li>A calendar color.<\/li>\n<li>The visible booking data for each recipient.<\/li>\n<li>Recipient language; for the first recipient, the number of days before arrival or departure when the task begins.<\/li>\n<li>Recipient order and the escalation interval in hours.<\/li>\n<li>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 \u201cDo not add a link to emails\u201d when no link should be sent.<\/li>\n<\/ul>\n\n<p>Set <strong>Daily staff notification time<\/strong> to choose when the daily arrival and departure notifications are sent. The time uses the WordPress site timezone and is kept local across daylight-saving changes.<\/p>\n\n<p>For arrival and departure types, enable <strong>Require confirmation and escalate<\/strong> 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.<\/p>\n\n<p>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.<\/p>\n\n<p>Existing installations do not need to re-enter their settings. Legacy rules in the old <code>email|fields|events|language|days_before<\/code> format are migrated automatically during the upgrade and shown in the structured form.<\/p>\n\n<p>Available fields:<\/p>\n\n<ul>\n<li><code>unit<\/code> - apartment name.<\/li>\n<li><code>dates<\/code> - stay dates.<\/li>\n<li><code>guests<\/code> - guest count.<\/li>\n<li><code>status<\/code> - booking status.<\/li>\n<li><code>source<\/code> - booking source.<\/li>\n<li><code>customer<\/code> - customer name.<\/li>\n<li><code>contact<\/code> - customer email and phone.<\/li>\n<li><code>price<\/code> - booking total and currency.<\/li>\n<li><code>note<\/code> - booking note.<\/li>\n<li><code>booking_reference<\/code> - external booking reference on guest registrations.<\/li>\n<li><p><code>guest_names<\/code> - names submitted in guest registrations.\nAvailable triggers:<\/p><\/li>\n<li><p><code>new_booking<\/code> - email when a new booking is created.<\/p><\/li>\n<li><code>registration<\/code> - email when guest registration details are submitted.<\/li>\n<li><code>arrival<\/code> - email before check-in; it can be turned into a confirmed handover task.<\/li>\n<li><code>departure<\/code> - email before checkout; it can be turned into a confirmed cleaning task.<\/li>\n<li><code>ical_cancelled<\/code> - email when a future imported iCal reservation disappears from its source feed and is treated as cancelled.\nFor 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.<\/li>\n<\/ul>\n\n<p>For a staff booking list with status controls, create a WordPress page or post, protect it with a WordPress password, and add:<\/p>\n\n<pre><code>[vstrb_staff_bookings email=\"cleaner@example.com\" fields=\"unit,dates,guests,status\"]\n<\/code><\/pre>\n\n<p>For the color-coded duty calendar with daily details, assignment state, and confirmation buttons, use:<\/p>\n\n<pre><code>[vstrb_staff_tasks email=\"cleaner@example.com\" days=\"90\"]\n\n\n[vstrb_staff_bookings] optional shortcode parameters:\n<\/code><\/pre>\n\n<ul>\n<li><code>email=\"EMAIL\"<\/code> - staff rule to use.<\/li>\n<li><code>fields=\"FIELDS\"<\/code> - optional comma-separated subset of the fields allowed for this recipient. For example: <code>unit,dates,guests,status<\/code>. Use <code>all<\/code> to use all fields configured for the recipient.<\/li>\n<li><code>days=\"N\"<\/code> - number of upcoming days to display; use <code>0<\/code> for all current and future reservations (default: <code>0<\/code>).<\/li>\n<li><code>unit=\"ID\"<\/code> - limit to one apartment.<\/li>\n<li><code>limit=\"N\"<\/code> - maximum number of bookings (default: <code>50<\/code>).<\/li>\n<li><code>include_registrations=\"0\"<\/code> - hide guest registration groups.<\/li>\n<li><code>status=\"all\"<\/code> - include cancelled and blocked bookings too.<\/li>\n<\/ul>\n\n<p>Select the staff booking page for the matching notification recipient. Email links add <code>vstrb_booking_id<\/code> 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.<\/p>\n\n<pre><code>[vstrb_staff_tasks] optional shortcode parameters:\n<\/code><\/pre>\n\n<ul>\n<li><code>email=\"EMAIL\"<\/code> - required email address of a configured recipient; it limits the calendar to that person's duties.<\/li>\n<li><code>days=\"N\"<\/code> - number of upcoming days to display (default: <code>90<\/code>, maximum: <code>365<\/code>).<\/li>\n<li><code>unit=\"ID\"<\/code> - limit the calendar to one apartment.<\/li>\n<\/ul><\/dd>\n<dt id=\"how%20can%20ai%20posts%20be%20generated%20automatically%3F\"><h3>How can AI posts be generated automatically?<\/h3><\/dt>\n<dd><p>Open <strong>Bookings -&gt; AI Post Generator<\/strong> and use <strong>Scheduled AI generation profiles<\/strong>. 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.<\/p>\n\n<p>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.<\/p><\/dd>\n<dt id=\"can%20i%20add%20google%20vacation%20rental%20structured%20data%3F\"><h3>Can I add Google Vacation Rental structured data?<\/h3><\/dt>\n<dd><p>Yes, with the optional <strong>Vachr Short-Term Rental Reservations Pro<\/strong> add-on. Open <strong>Bookings -&gt; Google SEO Data<\/strong>, select an apartment, and generate editable <code>VacationRental<\/code> JSON-LD from its existing settings.<\/p>\n\n<p>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.<\/p>\n\n<p>Place the generated structured data on the public apartment detail page with:<\/p>\n\n<pre><code>[vstrb_vacation_rental_schema unit=\"YOUR_ID\"]\n<\/code><\/pre>\n\n<p>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.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.70<\/h4>\n\n<ul>\n<li>Added an editable booking form block with toolbar settings and shortcode conversion, and updated the page wizard to create configured booking form blocks.<\/li>\n<li>Added payment-method choices and a direct link to payment settings in the page wizard, plus settings controls for existing booking-form shortcodes.<\/li>\n<li>Completed translations for the page wizard and booking form block in all available language catalogs, and fixed generated shortcode attribute formatting.<\/li>\n<\/ul>\n\n<h4>2.1.69<\/h4>\n\n<ul>\n<li>Added a global local-time setting for daily staff notification emails and kept the schedule stable across daylight-saving changes.<\/li>\n<li>Improved frontend asset cache invalidation by including each asset's modification time in its version and invalidating custom styling after saving Appearance settings.<\/li>\n<\/ul>\n\n<h4>2.1.68<\/h4>\n\n<ul>\n<li>Added a custom phone country-code option so guests can enter a prefix that is not in the catalogue.<\/li>\n<\/ul>\n\n<h4>2.1.67<\/h4>\n\n<ul>\n<li>Fixed the nationality selector so the complete country list remains available beyond the first 50 results.<\/li>\n<li>Added country calling prefixes for all ISO country\/territory entries, with browser-region preselection for country and phone fields, alphabetical fallback, a custom phone-prefix option, and a filter for site-specific custom prefixes.<\/li>\n<\/ul>\n\n<h4>2.1.66<\/h4>\n\n<ul>\n<li>Added booking-form calendar month and month-column controls to the <strong>Create apartment page<\/strong> wizard.<\/li>\n<li>The generated booking form defaults to 2 calendar months in 1 column and keeps the selected values in the generated shortcode.<\/li>\n<\/ul>\n\n<h4>2.1.64<\/h4>\n\n<ul>\n<li>Show a valid discount code in calendar prices while keeping stay-length discounts for the complete selected-date calculation.<\/li>\n<li>Apply stay-length discounts after the discount code and keep the same order in the quote and reservation price breakdown.<\/li>\n<\/ul>\n\n<h4>2.1.63<\/h4>\n\n<ul>\n<li>Excluded all stay-length pricing adjustments from individual calendar-day previews; complete stay pricing remains in the quote.<\/li>\n<\/ul>\n\n<h4>2.1.62<\/h4>\n\n<ul>\n<li>Kept stay-length discounts and discount codes out of individual calendar-day previews; they are applied in the complete reservation quote after dates are selected.<\/li>\n<\/ul>\n\n<h4>2.1.61<\/h4>\n\n<ul>\n<li>Fixed the calendar preview so discounts that require a minimum stay are not applied to individual day prices.<\/li>\n<\/ul>\n\n<h4>2.1.60<\/h4>\n\n<ul>\n<li>Applied discount codes to the final accommodation price after seasonal and other pricing discounts.<\/li>\n<\/ul>\n\n<h4>2.1.59<\/h4>\n\n<ul>\n<li>Improved handling of discount codes together with other accommodation pricing adjustments.<\/li>\n<\/ul>\n\n<h4>2.1.58<\/h4>\n\n<ul>\n<li>Fixed calendar discount-code prices so they match the final reservation calculation when other pricing adjustments are active.<\/li>\n<\/ul>\n\n<h4>2.1.57<\/h4>\n\n<ul>\n<li>Added support for multiple reusable discount codes per accommodation and applied matching codes to calendar prices.<\/li>\n<\/ul>\n\n<h4>2.1.56<\/h4>\n\n<ul>\n<li>Added reusable percentage discount codes per accommodation with optional booking-form visibility, validity dates, and support for the <code>discount_code<\/code> GET parameter.<\/li>\n<li>Recorded applied discount codes and amounts in reservations and booking emails.<\/li>\n<\/ul>\n\n<h4>2.1.55<\/h4>\n\n<ul>\n<li>Added a document collection page action to the accommodation list.<\/li>\n<li>Renamed the accommodation setup button from Add Apartment to Add Accommodation.<\/li>\n<li>Added translations for the new document collection page and accommodation button in all supported plugin languages.<\/li>\n<\/ul>\n\n<h4>2.1.54<\/h4>\n\n<ul>\n<li>Added configurable staff booking page links to notification emails, including a direct reservation filter.<\/li>\n<li>Added a password-protected staff booking shortcode with status controls and a reset link for current and upcoming reservations.<\/li>\n<li>Added shortcode field filtering with the <code>fields<\/code> parameter and immediate creation of the protected page from notification settings.<\/li>\n<li>Added a configurable option to automatically confirm bookings submitted through forms without an enabled payment method.<\/li>\n<li>Added translations for the new booking confirmation option in all supported plugin languages.<\/li>\n<li>Fixed payment-free booking forms being submitted as cash payments, which could incorrectly mark the booking as paid and confirmed.<\/li>\n<li>Added a confirmation email to guests when staff changes a reservation status to confirmed.<\/li>\n<li>Added staff controls to mark a reservation payment as paid from the staff booking page.<\/li>\n<li>Improved visibility of pending reservation and payment statuses with red status chips in the admin table and staff booking shortcode.<\/li>\n<\/ul>\n\n<h4>2.1.52<\/h4>\n\n<ul>\n<li>Updated pending booking emails and the post-submission message so they clearly state that the request is being processed and is not yet confirmed.<\/li>\n<li>Updated the corresponding English and translated language files.<\/li>\n<\/ul>\n\n<h4>2.1.51<\/h4>\n\n<ul>\n<li>Fixed translations for the wizard's Add Services and Add Amenities buttons.<\/li>\n<\/ul>\n\n<h4>2.1.50<\/h4>\n\n<ul>\n<li>Fixed base currency switching in the apartment setup wizard when no apartment exists yet. Selecting a different base currency now replaces the initial currency and switches the price form without adding a duplicate currency.<\/li>\n<\/ul>\n\n<h4>2.1.49<\/h4>\n\n<ul>\n<li>Fixed a fatal error after saving guest registration when an older UbyPort plugin does not provide the confirmation_url() method. Registration now returns a successful response without a confirmation link when the method is unavailable.<\/li>\n<\/ul>\n\n<h4>2.1.48<\/h4>\n\n<ul>\n<li>Added base currency selection to the apartment setup wizard.<\/li>\n<li>Expanded the wizard currency selector with the full supported ISO currency catalog.<\/li>\n<li>Automatically added a newly selected base currency to the plugin's available currencies.<\/li>\n<li>Updated wizard pricing fields and validation for the selected base currency.<\/li>\n<\/ul>\n\n<h4>2.1.47<\/h4>\n\n<ul>\n<li>Improved apartment setup wizard validation: errors in hidden steps now open the relevant step and show the browser validation message.<\/li>\n<li>Made <code>0 \/ 0<\/code> a valid way to disable the optional basic long-stay discount.<\/li>\n<li>Added a Terms and Conditions wizard step that creates, assigns, and preserves a required consent checkbox for the apartment.<\/li>\n<li>Displayed the wizard-created Terms and Conditions checkbox immediately before the booking form submit button.<\/li>\n<li>Added asset modification times to frontend cache-busting versions so changed JavaScript is fetched automatically.<\/li>\n<\/ul>\n\n<h4>2.1.44<\/h4>\n\n<ul>\n<li>Added the total number of guests, adult and child counts, and child ages to reservation information and customer confirmation emails.<\/li>\n<li>Added a configurable calendar color for available dates, including live preview and translations for all available plugin languages.<\/li>\n<li>Fixed calendar and booking-form styling when the Lazy-load Booking Form option is enabled.<\/li>\n<li>Added styling cache invalidation after saving appearance settings.<\/li>\n<\/ul>\n\n<h4>2.1.43<\/h4>\n\n<ul>\n<li>Added a dedicated <code>vstrb_booking_child_ages<\/code> database table for structured child ages instead of storing them in generic booking metadata.<\/li>\n<li>Added an idempotent migration for child ages created by version 2.1.42.<\/li>\n<\/ul>\n\n<h4>2.1.42<\/h4>\n\n<ul>\n<li>Added dynamically generated child-age fields to the booking form. The fields follow the selected number of children, require ages from 0 to 17, and are enabled by default.<\/li>\n<li>Saved child ages with reservations and displayed them in the administration.<\/li>\n<li>Added the <code>show_children_ages=\"0\"<\/code> shortcode option for disabling the fields on a specific booking form.<\/li>\n<\/ul>\n\n<h4>2.1.40<\/h4>\n\n<ul>\n<li>Improved guest registration actions, compacted reservation pairing controls, and separated WinTOP actions from the main registration actions.<\/li>\n<li>Added modal editing for bookings, price offers, guest contacts, guests, and invoices to keep reservation tables uncluttered.<\/li>\n<li>Improved modal behaviour so only the selected editing form is shown and it can be reliably closed.<\/li>\n<\/ul>\n\n<h4>2.1.39<\/h4>\n\n<ul>\n<li>Improved the bookings row actions menu and updated multilingual labels for creating offers and viewing guest registrations.<\/li>\n<\/ul>\n\n<h4>2.1.38<\/h4>\n\n<ul>\n<li>Fixed bookings created without any enabled payment method being incorrectly marked as paid. They now remain pending until a payment is actually recorded.<\/li>\n<\/ul>\n\n<h4>2.1.36<\/h4>\n\n<ul>\n<li>Added historical billing contact selection when editing invoices.<\/li>\n<li>Added proforma invoice access from the invoices and transactions page.<\/li>\n<\/ul>\n\n<h4>2.1.35<\/h4>\n\n<ul>\n<li>Fixed guest-registration document photos silently failing to upload when larger than the server's upload limit (common with phone camera photos). Photos are now shrunk to fit in the browser before upload (with a server-side fallback resize too) and are uploaded one at a time in the background after the registration itself is saved, so no photo can ever delay or block the registration. A progress notice is shown while photos are still uploading and the guest is warned before leaving the page early; any upload that still fails is reported to the guest instead of being dropped silently.<\/li>\n<\/ul>\n\n<h4>2.1.34<\/h4>\n\n<ul>\n<li>Fixed detail, guest\/contact editing, and expandable guest controls in the administration when scripts are loaded from cache or in a different order.<\/li>\n<li>Added reliable cache busting for the plugin's custom CSS and JavaScript assets.<\/li>\n<\/ul>\n\n<h4>2.1.33<\/h4>\n\n<ul>\n<li>Fixed guest-registration country and nationality selectors: full country lists, search, and correct dropdown positioning.<\/li>\n<\/ul>\n\n<h4>2.1.32<\/h4>\n\n<ul>\n<li>Added configurable booking form layout and section order to the page creation wizard.<\/li>\n<li>Added translations for the new booking form layout controls.<\/li>\n<\/ul>\n\n<h4>2.1.31<\/h4>\n\n<ul>\n<li>Updated the default English accommodation menu labels.<\/li>\n<\/ul>\n\n<h4>2.1.30<\/h4>\n\n<ul>\n<li>Renamed the accommodation menu labels in all available translations.<\/li>\n<\/ul>\n\n<h4>2.1.19<\/h4>\n\n<ul>\n<li>Added Czech translations for the document-photo upload labels.<\/li>\n<li>Reduced the maximum document-photo size from 15 MB to 1 MB per file.<\/li>\n<\/ul>\n\n<h4>2.1.18<\/h4>\n\n<ul>\n<li>Changed guest uploads to per-person document-photo fields.<\/li>\n<li>Removed public media URLs for document photos and added protected admin-only downloads.<\/li>\n<\/ul>\n\n<h4>2.1.17<\/h4>\n\n<ul>\n<li>Added the photo upload field to the public guest\/contact registration form.<\/li>\n<li>Connected uploaded photos to the matched reservation, with a registration folder fallback when no reservation is matched.<\/li>\n<li>Added the registration photo-path database field and migration.<\/li>\n<\/ul>\n\n<h4>2.1.16<\/h4>\n\n<ul>\n<li>Added reservation photo uploads with multiple-file support, previews, deletion, and per-reservation folders.<\/li>\n<li>Added a configurable server-side photo storage path with a secure admin download fallback for folders outside public WordPress uploads.<\/li>\n<li>Added optional, required, and disabled modes for reservation photo uploads.<\/li>\n<\/ul>\n\n<h4>2.1.15<\/h4>\n\n<ul>\n<li>Improved caching to improve performance and ensure refreshed booking data is displayed correctly.<\/li>\n<\/ul>\n\n<h4>2.1.11<\/h4>\n\n<ul>\n<li>Improved frontend form accessibility by associating labels with controls and adding accessible calendar navigation labels.<\/li>\n<\/ul>\n\n<h4>2.1.10<\/h4>\n\n<ul>\n<li>Improved booking-list performance with indexes for checkout dates, apartment\/date ranges, status\/date, and source\/date filters.<\/li>\n<li>Added a composite booking metadata index for booking and metadata-key lookups.<\/li>\n<\/ul>\n\n<h4>2.1.9<\/h4>\n\n<ul>\n<li>Prevented caching of booking REST API responses by WP Super Cache, browsers, CDNs, and reverse proxies.<\/li>\n<li>Added WP Super Cache and CDN configuration guidance for the booking API.<\/li>\n<\/ul>\n\n<h4>2.1.8<\/h4>\n\n<ul>\n<li>Improved responsive calendar pricing: prices are shown inline when they fit, reveal on hover when space is limited, and wrap safely for selected compact calendar days.<\/li>\n<li>Added localized currency symbols for supported currencies, including \u20ac, $, \u00a3, \u00a5, K\u010d, and Ft.<\/li>\n<li>Prevented available-day labels from taking space needed by calendar prices.<\/li>\n<li>Added check-in and check-out date inputs below the booking calendar, synchronized with calendar selection and the price quote.<\/li>\n<li>Added availability validation for manually entered dates in the quote and booking endpoints.<\/li>\n<\/ul>\n\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>fixed missing file<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Added an apartment-page wizard that creates editable Gutenberg pages with a chosen layout, language, currency, booking form, calendar, amenities, and image placeholder.<\/li>\n<li>Added direct access to the apartment-page wizard from the Apartments menu and apartment row actions.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Enhanced the apartment setup wizard with clearer basic details, a simplified monthly availability selection, separate amenities, and automatic public-code generation.<\/li>\n<li>Streamlined base pricing to show only the selected price input, added basic long-stay discounts, and linked to advanced pricing policies.<\/li>\n<li>Added the apartment-wizard strings to all bundled language catalogs.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Added a guided apartment setup wizard with inline catalog additions and validation.<\/li>\n<li>Simplified apartment availability configuration with monthly booking selection and advanced options.<\/li>\n<li>Added a basic long-stay discount and direct access to advanced pricing policies in the apartment wizard.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Documented staff task automation, signed confirmation links, escalation timing, the staff calendar, and the structured notification migration.<\/li>\n<li>Reorganized Settings into tabs for general options, notifications, payments, invoicing, calendar, appearance, services, amenities, and contact fields.<\/li>\n<li>Kept iCal Imports as a dedicated Bookings menu item and updated administration links accordingly.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Replaced pipe-separated staff notification editing with a structured notification type and recipient form.<\/li>\n<li>Added optional per-task confirmation, ordered email escalation, and takeover notices.<\/li>\n<li>Added the color-coded <code>[vstrb_staff_tasks]<\/code> staff calendar with daily task details.<\/li>\n<li>Existing staff rules are automatically presented in the new structured editor and retained on save.<\/li>\n<li>Consolidated general, notification, payment, invoicing, calendar, appearance, services, amenities, and contact-field configuration into tabs on the Settings page while keeping iCal imports in the main plugin menu.<\/li>\n<\/ul>\n\n<h4>2.0.18<\/h4>\n\n<ul>\n<li>Fixed WordPress coding-standard issues in iCal export and cancelled-booking cleanup queries.<\/li>\n<\/ul>\n\n<h4>2.0.17<\/h4>\n\n<ul>\n<li>Fixed iCal import safety so HTTP errors, invalid calendar responses, or empty parsed feeds do not remove existing imported reservations.<\/li>\n<li>Changed iCal cancellation cleanup to mark missing imported reservations as cancelled first, then permanently delete only old unlinked cancelled records after a retention period.<\/li>\n<\/ul>\n\n<h4>2.0.16<\/h4>\n\n<ul>\n<li>Added a separate iCal export URL for direct booking-system reservations only, excluding imported external iCal blocks.<\/li>\n<\/ul>\n\n<h4>2.0.15<\/h4>\n\n<ul>\n<li>Added an admin extension hook for booking row actions so Pro modules can add booking-specific invoice actions.<\/li>\n<li>Added a public admin helper for issuing an invoice for an existing booking through the invoicing workflow.<\/li>\n<\/ul>\n\n<h4>2.0.14<\/h4>\n\n<ul>\n<li>Fixed an incomplete 2.0.12 package: bundled the previously missing payment QR and country-list files (<code>includes\/payment-qr.php<\/code>, <code>includes\/countries.php<\/code>, <code>assets\/payment-qr.js<\/code>) and the <code>assets\/vendor<\/code> libraries (tom-select, qrcodejs) that the plugin requires.<\/li>\n<li>Added translations<\/li>\n<\/ul>\n\n<h4>2.0.12<\/h4>\n\n<ul>\n<li>Added an isolated live preview to the Styling administration page.<\/li>\n<li>Styling changes are now previewed immediately without affecting the published booking calendar or form until they are saved.<\/li>\n<li>Added desktop and mobile preview widths.<\/li>\n<li>The preview includes representative available, occupied, selected, check-in, check-out, discount, and surcharge calendar states.<\/li>\n<li>Added live previews for calendar colors, typography, headings, price badges, form background, maximum width, and booking button styling.<\/li>\n<li>Added preview support for an external custom CSS URL when Custom CSS mode is enabled.<\/li>\n<\/ul>","raw_excerpt":"A professional short-term rental booking engine for WordPress with two-way iCal synchronization.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/283320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=283320"}],"author":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/chuckumi"}],"wp:attachment":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=283320"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=283320"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=283320"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=283320"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=283320"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=283320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}