How to Show Hotel Room Availability and Offers
This guide shows you how to build a room-offer display for a hotel lobby: each room type shows its price, a LAST ROOMS or DEAL -20% badge when one applies, and SOLD OUT instead of the price when no rooms are left.
Where the pricing logic belongs
Keep the pricing rules in the hotel's property management system (PMS), or in a spreadsheet between the PMS and Wallboard. Wallboard is the display layer: it shows the price, availability and badge it receives, and hides what does not apply.
You can calculate prices inside Wallboard with scripts and datasource actions, but it is harder to build and maintain. When the PMS changes its rules, the display follows without any change in Wallboard.
Step 1: Create the inventory datasource
- Go to Datasources and click Add internal datasource.
- Set Structure type to Table.
- Create a table named
Hotel Inventorywith these columns and rows:
{
"Hotel Inventory": {
"header": {
"Room type": "string",
"Price": "string",
"Availability": "number",
"Badge": "string"
},
"rows": [
{ "Room type": "Standard Room", "Price": "$ 129", "Availability": 12, "Badge": "" },
{ "Room type": "Deluxe Room", "Price": "$ 189", "Availability": 3, "Badge": "LAST ROOMS" },
{ "Room type": "Suite", "Price": "$ 299", "Availability": 0, "Badge": "SOLD OUT" },
{ "Room type": "Junior Suite", "Price": "$ 239", "Availability": 8, "Badge": "DEAL -20%" }
],
"connectors": {}
}
}
Price is a finished text. The PMS or the spreadsheet has already applied any discount; Wallboard only displays it.
❓ Confirm how to paste table JSON in the new datasource editor; you can also add the columns and rows by hand.
Learn more: Internal Table Datasources
Step 2: Build one card per room type
For each room type, add Widgets for the room name, the price and the badge, and bind each one to the matching column of that room's row.
❓ The Notion demo does not say how the cards are bound (one row per card, or a repeating layout). Check the demo Content before publishing this step.
Learn more: Databinding
Step 3: Hide the price when the room is sold out
- Select the price Widget.
- On the Other tab, in the Data section, open Hide based on (also available inside Bind anything).
- Bind it to the room's
Availabilitycolumn and set the rule:- Evaluation type: equals
- Value:
0
The price is hidden while the rule is true, so a sold-out room shows no price. Put the SOLD OUT text where the price would be.
Step 4: Show the badge only when there is one
- Select the badge Widget, bound to the
Badgecolumn. - Open Hide based on, bind it to the same
Badgecolumn, and set Evaluation type to is empty.
Rooms with an empty Badge show no badge; the others show LAST ROOMS, DEAL -20% or SOLD OUT, as sent by the PMS.
Step 5: Get the data in
Choose one of three ways, depending on what the hotel system supports:
| Option | How it works | Choose it when |
|---|---|---|
| A. Webhook from the PMS (recommended) | The PMS calls a Wallboard webhook whenever availability or a price changes, and the internal datasource updates straight away | The PMS can send HTTP requests on change |
| B. Spreadsheet in between | Staff or the PMS export to a Google Sheet; Wallboard refreshes it on a schedule, for example every 5–10 minutes | The PMS cannot push, but can export |
| C. JSON API | Wallboard polls the PMS's REST API as a JSON datasource on a schedule | The PMS exposes an API |
With option A, the internal datasource from Step 1 stays the source. Learn more: Datasource actions
With option B or C, the data comes from an external datasource instead, and the bindings must point at it.
A Google Sheet or JSON source does not have the same structure as an internal table, even when the column names match. Plan to re-check every binding and Hide based on rule after the switch. ❓ Confirm whether a Base data path swap keeps the bindings when the column names match; the restaurant example on the same Notion page says bindings break when switching to Google Sheets or Excel.
Learn more: Google Sheet datasource
Learn more: JSON datasource
Related articles
- Learn more: How to connect a template to base data path (the same pattern for a restaurant menu)
- Learn more: Evaluation Types