Skip to content

How to put JetBookIn on your website: every shortcode and Elementor widget with all its options, which page each belongs on, how to match your brand colours, how multilingual sites work, and – for developers – the REST API, hooks and WP-CLI commands.

The pages you need

A typical JetBookIn site has these pages. Every block can be placed with a shortcode (any theme or editor) or with the matching Elementor widget.

Page Put on it Elementor widget
Home page [jetbookin_search_hero] or [jetbookin_search], [jetbookin_rooms], [jetbookin_reviews] Search Hero, Booking Search, Rooms Grid / Carousel, Reviews
Book / search results (e.g. /book/) [jetbookin_results] Booking Results
Each room type’s page Built automatically (see Room pages), or [jetbookin_booking] plus the room shortcodes Room Booking Box, Room Gallery, Room Specs, Room Price From, Room Amenities, Room Policies & Rates
Booking confirmation [jetbookin_confirmation] – created for you on activation Booking Confirmation / Manage Booking
Contact / location [jetbookin_property_info] Property Info & Map
Review page (optional) [jetbookin_review] Review Form
Housekeeping (optional, Pro) [jetbookin_housekeeping] –
Owner page (optional, Pro) [jetbookin_owner] –

A setup for a small villa with three apartments can be as simple as: the home page with the Search Hero and the rooms grid, one page per apartment (built automatically), and the confirmation page. A 20-room hotel usually adds a Book page with the results, so the search on every page leads there.

Booking confirmation and checkout pages

Two settings in JetBookIn → Settings → General tell JetBookIn where guests go:

Setting Default What it does
Booking confirmation page ID The Booking confirmation page created on activation The page with [jetbookin_confirmation] or the Booking Confirmation widget. Guests land here after paying, and every e-mail link to View your booking opens it. It is also where guests find their booking by reference and e-mail.
Checkout page ID Empty Where Reserve in a room’s booking box continues: a page with the Booking Results or Booking Confirmation widget, e.g. your Book page. Empty = the booking confirmation page.
Terms & conditions URL Empty If set, guests must accept the terms before paying. The page opens in a sheet over the checkout.

The confirmation page shows, depending on how it is opened: the checkout for a stay chosen in a booking box; the guest’s booking (from a link with the booking reference and key); or the Find your booking form. You never need more than one such page per language. What guests can do there is described in The guest’s booking page.

To find a page’s ID, open it in Pages; the number after post= in the address bar is the ID.

Themes can adapt the page around the booking with two body classes: jbi-is-checkout while the guest is still booking, and jbi-is-booking once there is a booking to show – for example to hide a “Thank you” heading during checkout.

Settings, General section with the booking confirmation page ID, checkout page ID and terms URL fields
Settings → General: the pages guests are sent to.

Booking shortcodes

These blocks are interactive: they load availability and prices live and need JavaScript (visitors without it see Please enable JavaScript to book online.). For yes/no attributes, anything other than no counts as yes.

[jetbookin_search] – search form

Dates and guests, then a search button. Without a results page the results open under the form.

Attribute Values Default What it does
results_url A URL Empty Page with [jetbookin_results] to send the search to. Empty = results under the form.
property Property ID 0 (all) Search only this property’s rooms.
layout horizontal, vertical horizontal A bar across the page, or stacked fields for a sidebar.
button Text Search Button label.
prices yes, no yes Lowest nightly price under each day of the date picker.
[jetbookin_search results_url="/book/" button="Check availability"]

[jetbookin_results] – search results and checkout

Lists the room types free for the chosen dates with their rates, lets the guest pick one or more rooms, and runs the checkout. If nothing is free it suggests other dates.

Attribute Values Default What it does
property Property ID 0 (all) Only this property’s rooms.
show_search yes, no yes Show the search bar above the results.

[jetbookin_booking] – room booking box

Calendar, guests, rates and price for one room type. Reserve continues on the checkout page with the stay filled in.

Attribute Values Default What it does
room Room type ID The current room type page Which room type. Required anywhere other than a room type’s own page.
months 1, 2 1 Months shown in the calendar.
checkout page, inline page page continues on the checkout page (a full page for details and payment). inline keeps the whole booking inside the box. Without any checkout or confirmation page the box books inline.
[jetbookin_booking room="42" months="2"]
A room page with the booking box showing the calendar with prices, guests and a Reserve button
The room booking box on a room page.

[jetbookin_calendar] – availability calendar

Attribute Values Default What it does
room Room type ID The current room type page Which room type.
months 1–3 2 Months shown.
prices yes, no yes Nightly prices on the days.

[jetbookin_confirmation] – booking confirmation / manage booking

No attributes. [jetbookin_manage] does exactly the same. Put it on one page only (per language) and set that page as the Booking confirmation page ID.

[jetbookin_search_hero] – full-width hero with search

Attribute Values Default What it does
image Image URL Empty Background photo.
overlay 0–90 35 How much the photo is darkened, in %.
heading Text Empty Main title.
heading_tag h1, h2, div h1 HTML tag of the title.
subheading Text Empty Line under the title.
min_height Pixels (240 or more) 560 Minimum height of the hero.
align left, center center Text alignment.
results_url A URL Empty Results page for the search (as in [jetbookin_search]).
button Text Check availability Button label.
[jetbookin_search_hero image="https://example.com/wp-content/uploads/pool.jpg" heading="Three stone houses above Elounda" subheading="Book direct for the best price" results_url="/book/"]

Room and property shortcodes

These are rendered on the server (good for speed and search engines). Where an attribute takes a room type, leaving it out uses the room type whose page is being shown; property attributes fall back to the current property, the current room’s property, or your first property.

When a block has nothing to show (no photos, no amenities…), guests see nothing; logged-in staff and the Elementor editor see a hint saying what to fill in.

[jetbookin_rooms] – rooms grid or carousel

Attribute Values Default What it does
property Property ID 0 (all) Only this property’s rooms.
ids Comma-separated room type IDs Empty (all) Only these rooms, in this order.
limit 1–50 12 Maximum number of rooms.
orderby menu_order, title, price menu_order Your custom order, by name, or lowest “from” price first.
layout grid, carousel grid A grid, or a scrolling row with arrows.
columns 1–4 3 Cards per row (cards visible at once in a carousel).
image_ratio e.g. 4/3, 3/2, 16/9, 1/1, 3/4 4/3 Shape of the card photo.
show_specs yes, no yes Guests, beds and size.
show_excerpt yes, no yes The room’s short description (excerpt).
amenities Number 4 How many amenities to show; 0 hides them.
show_price yes, no yes The “from … / night” price.
button Text (empty hides it) View & book Button label.
heading_tag h2, h3, h4, div h3 HTML tag of the room names.
[jetbookin_rooms layout="carousel" columns="3" orderby="price" amenities="0"]

[jetbookin_room_gallery]

Attribute Values Default What it does
room Room type ID Current room type Whose photos.
post Post ID Empty Show another post’s photos instead, e.g. the property’s.
layout mosaic, grid, slider mosaic Mosaic is one large photo and four small, with Show all … photos when there are more than five.
columns Number 3 Columns for grid and slider.
ratio e.g. 4/3 4/3 Photo shape in the grid.
limit Number 0 (all) Maximum photos.
featured yes, no yes no shows only the gallery photos, e.g. when the featured image is an illustration.
lightbox yes, no yes Open photos full screen on click.

[jetbookin_room_amenities]

Attribute Values Default What it does
room Room type ID Current room type Which room.
columns 1–4 3 Columns of the list.
limit Number 0 (all) Maximum amenities.
icons yes, no yes Show an icon next to each.

[jetbookin_room_specs]

Attribute Values Default What it does
room Room type ID Current room type Which room.
items Any of guests, beds, size, comma-separated guests,beds,size What to show, in this order.
layout inline, list inline In one line, or one under the other.

[jetbookin_room_price]

The lowest nightly price from your rates, e.g. from €95 / night.

Attribute Values Default What it does
room Room type ID Current room type Which room.
prefix Text from Before the price.
suffix Text / night After the price.
note Text Empty A small line under it, e.g. Best price when booking direct.

[jetbookin_room_policies]

Attribute Values Default What it does
room Room type ID Current room type Which room.
times yes, no yes Check-in and check-out times.
rates yes, no yes Each rate plan with its meals, cancellation and payment terms.
text yes, no yes The property’s policies text.

[jetbookin_property_info]

Attribute Values Default What it does
property Property ID Current / first property Which property.
items Any of checkin, checkout, address, phone, email, registry All six What to show, in this order. Address opens Google Maps, phone and e-mail are links.
layout list, grid list Stacked or in a grid.
map yes, no yes An embedded Google map of the property’s coordinates or address.
map_height Pixels (120 or more) 280 Height of the map.

Review shortcodes Pro

Both need the Guest reviews module; with it off they show nothing.

[jetbookin_reviews] – published reviews

The average score with its label (e.g. Excellent), review cards with your replies, a Show more button, and schema.org rating data for search engines.

Attribute Values Default What it does
property_id (or property) Property ID 0 Only this property’s reviews.
room_type_id (or room) Room type ID 0 Only reviews of guests who stayed in this room type.
limit Number 5 Reviews per page.
summary yes, no yes The average score at the top.
bars yes, no no Scores per category (cleanliness, comfort, location, staff, value).
schema yes, no yes Add the latest reviews to the page’s schema.org data. The overall rating is always included.
empty Text Empty Text shown when there are no reviews yet. Empty = nothing.
[jetbookin_reviews limit="3" bars="yes" empty="Be the first to review your stay."]

[jetbookin_review] – review form

No attributes. Only needed if you want guests to review on a page of their own: put it there and enter the page’s ID as Review page ID in Bookings → Reviews. Otherwise guests review on the booking confirmation page. The form opens from the signed link in the review e-mail.

Housekeeping and owner pages Pro

  • [jetbookin_housekeeping] (Housekeeping module): the daily cleaning list on a phone, for logged-in users with the Housekeeper role and booking managers. Others are asked to log in or told they have no access. Housekeepers are sent to this page after logging in.
  • [jetbookin_owner] (Owners & statements module): an owner’s monthly statements and occupancy calendar, for logged-in users with the Property Owner role linked to a property. Owners are sent here after logging in instead of wp-admin.

Neither has attributes. Both pages are kept out of page caches automatically. Create each as a normal, published WordPress page.

Room pages without a page builder

Each room type has its own page on your site. If it is not built with Elementor, JetBookIn turns it into a complete room page by itself: the photo gallery (a mosaic from five photos), guests / beds / size, the “from” price, your description, amenities, policies and the booking box – beside the details on wide screens, below them on phones.

If the room’s content already contains a [jetbookin_room_…] shortcode, only the booking box is added at the end; if it contains [jetbookin_booking], nothing is added. With Elementor, design a single template for room types in the Theme Builder and use the room widgets with — Current room type —.

Elementor widgets

In the Elementor editor, search for JetBookIn or open the JetBookIn category in the widget panel. Each widget renders exactly the same block as its shortcode.

The Elementor widget panel with the JetBookIn category open, showing all JetBookIn widgets
The JetBookIn category in Elementor.

Content controls

Widget Shortcode Content controls
Booking Search jetbookin_search Results page, Layout (Horizontal bar / Vertical), Button text, Show nightly prices
Booking Results jetbookin_results Show search bar above results
Room Booking Box jetbookin_booking Room type (— Current room type — for Theme Builder templates), Months shown (1–2), After “Reserve” (Continue on the checkout page / Book inside the box)
Availability Calendar jetbookin_calendar Room type, Months shown (1–3, default 2), Show nightly prices
Booking Confirmation / Manage Booking jetbookin_confirmation None
Search Hero jetbookin_search_hero Background image, Heading (default Your summer escape starts here), Heading tag, Subheading (default Book directly for the best price.), Results page, Button text, Alignment, Minimum height (px, per device), Darken image (%)
Rooms Grid / Carousel jetbookin_rooms Layout, Property, Only these rooms, Maximum rooms, Order (Custom order / Lowest price first / Name), Columns, Gap, Image ratio; Card content: Title tag, Guests, beds & size, Short description, Amenities shown, “From” price, Button text
Room Gallery jetbookin_room_gallery Photos of (Room type / Property), Room type, Property, Layout (Mosaic / Grid / Slider), Columns, Gap, Maximum photos, Include the featured image, Open full screen on click
Room Amenities jetbookin_room_amenities Room type, Columns, Gap, Maximum (0 = all), Icons
Room Specs jetbookin_room_specs Room type, Show (Guests / Beds / Size), Layout (Inline / List)
Room Price From jetbookin_room_price Room type, Before price, After price, Small note
Room Policies & Rates jetbookin_room_policies Room type, Check-in / check-out times, Rate plans (cancellation, payment, meals), Property policies text
Property Info & Map jetbookin_property_info Property, Show (Check-in, Check-out, Address, Phone, E-mail, Registration number), Layout (List / Grid), Map, Map height (px)
Reviews jetbookin_reviews Property, Room type (— All rooms / current room type —), Reviews per page, Average score, Category scores, Recent reviews for search engines, Text when there are no reviews
Review Form jetbookin_review None

Columns are responsive: by default 3 on desktop, 2 on tablet and 1 on phones, and you can set each device separately.

Style controls

Every JetBookIn widget has a Colors & shape section in the Style tab:

  • Primary (buttons, selection), Button text, Background, Text, Borders – colours;
  • Corner radius – 0 to 24 px;
  • Typography – font family, size, weight and so on for the whole widget.

Some widgets have more:

  • Rooms Grid / Carousel: Card (Background, Shadow, Padding), Room title and Price (typography and colour).
  • Room Amenities: Icons (Color, Size).
  • Room Price From: Price (typography and colour).
  • Search Hero: Heading and Subheading (typography and colour).
  • Reviews: Review title and Review text (typography and colour).

Tip: set the same Primary colour on the booking widgets of the page. The Finish booking button that appears for unpaid bookings takes its colours, corners and font from the booking widget on the page.

Colours and styling

All JetBookIn blocks read their colours and shapes from CSS variables set on the .jbi-widget wrapper. The Elementor style controls set these same variables. Without Elementor, set them in Appearance → Customize → Additional CSS or your theme’s stylesheet.

Variable Default Used for
--jbi-primary #1c1a17 Buttons, selected dates, icons
--jbi-on-primary #fff Text on buttons
--jbi-accent #5b3fd1 Accents and highlights
--jbi-surface #fff Background of boxes and cards
--jbi-surface-2 #f6f5f2 Secondary background (panels, rows)
--jbi-text inherit Text colour (your theme’s by default)
--jbi-muted #6b6f76 Secondary text
--jbi-border #e4e2dd Borders and lines
--jbi-good #1b7f4d Positive notes, e.g. free cancellation
--jbi-bad #b3261e Errors and warnings
--jbi-radius 10px Corner radius
--jbi-gap 24px Space between cards and items
--jbi-cols 3 Columns of grids
--jbi-shadow A soft two-layer shadow Card shadow

The variables are defined on .jbi-widget itself, so set them with a selector at least as strong, for example:

/* Sea-blue buttons, square corners, everywhere */
body .jbi-widget {
	--jbi-primary: #0e5e6f;
	--jbi-on-primary: #ffffff;
	--jbi-radius: 4px;
}

/* A dark booking box in one section only */
.booking-dark .jbi-widget {
	--jbi-surface: #1f1d1a;
	--jbi-surface-2: #2a2723;
	--jbi-text: #f4f1ea;
	--jbi-muted: #b9b4aa;
	--jbi-border: #3a3631;
}

Setting the variables on body or :root alone has no effect, because .jbi-widget sets its own defaults.

Multilingual sites (Polylang, WPML)

JetBookIn works with Polylang and WPML. Translations of a room type or property are the same room: they share availability, prices, bookings, the gallery and the main image. Guests see everything in the language of the page they book on, and get their e-mails and booking page in that language.

What to translate

  • Room types and properties: translate them with your multilingual plugin (title, description, excerpt). On a property’s translation you also write its check-in instructions in that language.
  • The booking confirmation page and, if you use one, the Book / checkout page: create a translation of each with the same shortcode or widget. Only the original’s ID goes into Settings; JetBookIn sends guests to the translation in their language.
  • Terms and privacy pages and the review page: translate them the same way. Checkout opens the version in the guest’s language.
  • Pages with search, rooms and reviews: translate them as normal pages; the shortcodes and widgets stay the same.

If a page has no translation, the original is used.

Names you type in the dashboard

Rate plan names, extras (name and description), promotions, custom fees and the bank transfer details are registered as strings: in Polylang under Languages → Translations (group JetBookIn), in WPML under String Translation (domain JetBookIn). Rate plans, extras and promotions also have In other languages fields right under their name in the dashboard; both places stay in step. An empty translation shows the original.

E-mails

E-mail texts are edited per language in Settings → E-mails, not with the multilingual plugin. See E-mails → One text per language.

Developers: REST API

Everything the dashboard does goes through the REST API under the namespace jetbookin/v1, e.g. https://example.com/wp-json/jetbookin/v1/availability/search. Staff endpoints need a logged-in user with the manage_jetbookin capability (administrators and the Booking Manager role) – a cookie with a REST nonce, or an Application Password for apps and other servers. The busier public endpoints (checkout, quotes, guest actions, reviews) are rate-limited per client.

Main public endpoints

Method and path What it does
GET /availability/search Free room types and rates for a stay: check_in, check_out (YYYY-MM-DD), adults, children, optional property_id, room_type_id.
GET /availability/calendar Day-by-day availability and prices of a room type: room_type_id, start, days (up to 120, default 62).
GET /availability/alternatives Nearby dates when the chosen stay is not available.
POST /availability/quote Live price of a stay with extras.
POST /checkout Creates a booking from the guest’s details and chosen stay, and starts the payment.
GET /booking-status Status of a booking (ref + key).
GET /resume, POST /resume/cancel This visitor’s unfinished booking; cancel it.
POST /guest/lookup Find a booking by reference and e-mail; returns the link to the booking page.
GET /guest/booking The guest’s booking page data (ref + key).
POST /guest/booking/pay, /cancel, /update, /verify, /resend, /proof, /card Guest actions: pay (or pay a request), cancel, save arrival time / requests / ID details, confirm by e-mail link, resend that link, upload a transfer receipt (multipart), add a new guarantee card.
GET /reviews/published Published reviews.
GET / POST /guest/review The review form for a booking, and submitting it.

Staff endpoints include /bookings (list, create, PUT /bookings/{id}, cancel, payments, payment requests, messages), /calendar, /quote, /settings, /emails, /reviews and /ical/connections. Payment providers call their own webhook routes in the same namespace.

Developers: hooks

All JetBookIn hooks start with jbi/. Use them from a small plugin or your child theme’s functions.php.

Actions

Action Arguments Fires when
jbi/booking_created $booking A booking was created (any source, any status).
jbi/booking_confirmed $booking A booking became confirmed.
jbi/booking_awaiting_payment $booking A booking waits for a bank transfer.
jbi/booking_status_changed $booking, $old, $new Any status change.
jbi/booking_cancelled $booking A booking was cancelled.
jbi/booking_modified $booking Dates, room or guests changed.
jbi/booking_deleted $booking A test booking was deleted.
jbi/payment_received $booking, $amount An online payment was completed.
jbi/balance_charge_failed $booking An automatic balance charge failed.
jbi/ari_changed $change (room type, unit or rate plan, start, end) Availability, rates or restrictions changed – the hook to push changes elsewhere.
jbi/review_submitted $review, $booking A guest left a review.
jbi/review_moderated $review, $fields A review was published, hidden or replied to.
jbi/housekeeping_changed $unit, $details A unit’s housekeeping status or note changed.
jbi/document_issued $doc A receipt, invoice or credit note was issued.
jbi/owner_paid $owner_id, $month, $fields An owner statement was marked as paid.
jbi/ical_conflict $connection, $events A calendar import found a possible double booking.
jbi/ical_failing $connection, $message A calendar import keeps failing.
jbi/hourly, jbi/daily – JetBookIn’s own hourly and daily jobs.
jbi/loaded $plugin JetBookIn finished loading (for add-ons).

Filters

Filter Default Purpose
jbi/max_open_holds 1 Unpaid bookings allowed per e-mail address.
jbi/max_open_holds_network 3 Unpaid bookings allowed per network.
jbi/max_rooms_public 4 Rooms per online booking.
jbi/max_rooms_per_booking 10 Rooms per booking, any source.
jbi/checkout_verify true Return a WP_Error to refuse a checkout – the place for a CAPTCHA such as Cloudflare Turnstile. Receives the REST request.
jbi/client_ip Settings → System → Visitor address The visitor’s IP behind a proxy or CDN (rate limits and unpaid-booking limits use it). Receives the address chosen by the setting and $_SERVER.
jbi/rate_limit Per bucket Requests allowed in the rate-limit window of a public endpoint (receives the limit and the bucket name, e.g. checkout).
jbi/render/{name} The HTML Change the output of a server-rendered block: rooms, gallery, amenities, specs, price, policies, property, reviews, hero.
jbi/auto_room_page true Return false to stop building full room pages; only the booking box is added.
jbi/auto_booking_box true Return false to add nothing to room type pages.
jbi/room_url The room’s link Where room cards link to (receives the room ID).
jbi/structured_data_enabled true on the front end Return false if an SEO plugin already outputs your lodging schema.
jbi/structured_data The JSON-LD graph Change the schema.org data.
jbi/structured_data_room_type Accommodation Schema type of a room, e.g. HotelRoom or Suite.
jbi/reviews/schema Review parts Change the review schema of a property.
jbi/ical_export_summary Not available The event title in your exported calendars.
jbi/module_enabled The setting Switch a module off in code. It cannot switch on a module the licence does not include.
// Allow two unpaid bookings per e-mail address.
add_filter( 'jbi/max_open_holds', fn() => 2 );

// Post every confirmed booking to another system.
add_action( 'jbi/booking_confirmed', function ( array $booking ) {
	wp_remote_post( 'https://example.com/hook', [ 'body' => [ 'ref' => $booking['ref'] ] ] );
} );

// Rooms are hotel rooms for search engines.
add_filter( 'jbi/structured_data_room_type', fn() => 'HotelRoom' );

The fixed alert e-mails can be overridden by copying admin-conflict.php, admin-sync-failing.php or admin-late-payment.php into yourtheme/jetbookin/emails/.

Developers: WP-CLI

Command What it does
wp jetbookin run-jobs [--limit=<n>] Runs every due job now: calendar imports, reminders, balance charges, expiries. --limit caps the queued actions processed (default 100).
wp jetbookin sync [<connection-id>...] [--force] Imports platform calendars now – all active import links, or the ones given. --force ignores HTTP caching.
wp jetbookin status Shows when the hourly and daily jobs last ran, whether a server cron is set up, overdue actions and failing calendars.

On live sites a real server cron is recommended instead of WordPress’s visitor-triggered cron, for example every 5 minutes:

*/5 * * * * cd /path/to/wordpress && wp jetbookin run-jobs --quiet

See Advanced settings for background jobs.

Questions

The booking box shows nothing.

Outside a room type’s own page it needs room="ID" (in Elementor: choose the Room type). Also check that the room type is published and has rates.

Search sends guests to the wrong page.

Set results_url on the search (or Results page in the widget) to the page with [jetbookin_results]. Without it, results open under the form.

My colours don’t change.

Set the variables on .jbi-widget (for example body .jbi-widget { … }), not only on body or :root. Clear any CSS cache or optimisation plugin afterwards.

Can I use the shortcodes in Gutenberg, Divi or Bricks?

Yes. Add a Shortcode block (or your builder’s shortcode element) and paste the shortcode.

Do I need a separate checkout page?

No. If Checkout page ID is empty, the booking box continues on the booking confirmation page. A dedicated Book page with the results is useful when you also want a search page.

I deleted the Booking confirmation page by mistake.

Create a page with [jetbookin_confirmation], publish it, and enter its ID as Booking confirmation page ID in Settings → General. Links in e-mails sent before still point to the old address, so send affected guests their booking link again if needed.