Skip to main content

How to Show Hotel Room Availability and Offers

Completion Time: 30 minutes

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​

  1. Go to Datasources and click Add internal datasource.
  2. Set Structure type to Table.
  3. Create a table named Hotel Inventory with 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​

  1. Select the price Widget.
  2. On the Other tab, in the Data section, open Hide based on (also available inside Bind anything).
  3. Bind it to the room's Availability column 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​

  1. Select the badge Widget, bound to the Badge column.
  2. Open Hide based on, bind it to the same Badge column, 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:

OptionHow it worksChoose 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 awayThe PMS can send HTTP requests on change
B. Spreadsheet in betweenStaff or the PMS export to a Google Sheet; Wallboard refreshes it on a schedule, for example every 5–10 minutesThe PMS cannot push, but can export
C. JSON APIWallboard polls the PMS's REST API as a JSON datasource on a scheduleThe 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.

Switching to a spreadsheet or JSON source

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