Swedish table management with the BokaBord booking portal in front of it. Connects through WaiterAid's Reservation API, with keys released on your restaurant's approval. WaiterAid / BokaBord official site ↗
What it covers
Live table availability for your own restaurant, and, once certified, bookings. The concierge reads your bookable meals and checks the times WaiterAid offers for a party size and date (or across a range of dates); those three reads are certified and on by default, and the guest completes the booking on the link you have configured. The booking tools are built and listed below as not yet certified: booking with the guest's real name, email and phone, waitlisting a full time, sending a large-party request, looking up or cancelling a booking and reading or setting the party's allergies after the guest confirms their identity with a code Maison emails them, gift card listing and extension, and WaiterAid's own email verification code. They cannot be switched on until Maison certifies them with the restaurant.
What you need
- An API key and a client secret, issued by WaiterAid for your restaurant once the restaurant approves the integration.
- Your restaurant's encrypted hash, also issued by WaiterAid. All three are sent on every call; none is ever visible to the agent.
- Optionally, a guest language code (for example
svoren) so WaiterAid's confirmation emails go out in that language.
Setup steps
Ask WaiterAid to release your keys
Write to info@waiteraid.com naming your restaurant. WaiterAid issues the API key, the client secret and the restaurant hash on the restaurant's approval.Enter them in the admin console
Paste the restaurant hash, API key and client secret on the integration's settings page and save. They are encrypted at rest and never shown again.Choose the guest language
Set the language code WaiterAid should use for the guest's confirmation email, or leave it blank for the restaurant's default.Test inside an agreed window
Ask the concierge for a table for two on a date next week. It reads your meals, checks live times and books; cancel the test booking afterwards.
Available tools
3 tools are available for WaiterAid / BokaBord. The concierge calls them on a guest's behalf during a conversation; which are enabled is set per property, so you only turn on what you want it to be able to do.
Enabled by default (3)
Every certified tool is on as soon as the integration is connected.
| Tool | What it does |
|---|---|
waiteraid_get_availability_range | Bookable times for a party size and meal across a range of dates in one call — for 'any evening next week?' or 'the first Friday you have'. Returns slots: a list of { date (YYYY-MM-DD), time (HH:MM), timestamp (unix) } — a date with no entries has nothing online. from and to are inclusive and the window is at most 31 days — ask the guest to narrow a wider one. Needs a mealid from waiteraid_get_restaurant_config. A time found here can be booked directly with waiteraid_create_reservation; the restaurant re-checks it at booking time. |
waiteraid_get_available_time_slots | Check which times a table can be booked for a party size on one date for one meal. Returns availableTimes (the bookable times, HH:MM), allTimes (the meal's full time grid, so you can see which times exist but are taken) and alternate_restaurants, a vendor field WaiterAid does not document — pass it through without explaining it to the guest. Call waiteraid_get_restaurant_config first for the mealid. Always ask the party size — never assume one. An empty availableTimes is the answer — no tables online for that party and date — not an error: do not retry; offer other times or dates, and for a party above settings.max_people use waiteraid_send_reservation_request instead. Present three to five times, not the whole list. |
waiteraid_get_restaurant_config | Read the restaurant's booking setup before any availability check: the meals (services) that can be booked — each with its mealId, name, seating length in minutes, the party sizes it accepts (minAmount/maxAmount), the days it does not take bookings (disabledDays, as WaiterAid numbers them), the languages it supports, and a calendar of date → 1 (open) or 0 (closed) — plus settings.max_people (the largest party bookable online), whether larger parties may send a request (reservation_request_form_enabled, with max_people_message to relay when not), whether a waitlist exists (allowWaitlist / settings.waitlist), whether the restaurant sells gift cards (giftcards), and its booking terms. Every availability and booking call needs a mealId from this list: pick the meal that matches what the guest asked for (dinner, lunch, brunch…) and ask when it is ambiguous. Call once per conversation and reuse the ids; never invent a mealId. |
Not yet certified (13)
Built and working against the WaiterAid / BokaBord API, but Maison is not yet certified with WaiterAid / BokaBord to use them in production, so they cannot be enabled today. Listed so you can see what is coming rather than discover the gap when you ask for it.
| Tool | What it does |
|---|---|
waiteraid_cancel_reservation | DESTRUCTIVE: cancel a table booking by its booking code (id), after booker verification. Confirm the guest's intent first and read back the date, time and party size from waiteraid_get_reservation before calling. Cancellation is immediate and cannot be undone through this integration — a guest who changes their mind must book again. There is no modify: to change a booking, cancel it and create a new one only after the guest has explicitly agreed to that, and only once availability for the new time is confirmed. |
waiteraid_clear_all_allergies | DESTRUCTIVE: remove EVERY allergy for EVERY guest on a table booking, after booker verification. Only when the guest explicitly asks to clear all allergies on the booking — to change one guest's allergies use waiteraid_set_guest_allergies instead. Read the current allergies back to the guest with waiteraid_list_allergies, get an explicit yes, then call with confirm = true. Pass the verified reservation_id as id. |
waiteraid_create_reservation | Book a table. Collect and confirm with the guest BEFORE calling: the date, the time (exactly one of the availableTimes from an availability call), the party size (amount), the meal (mealid from waiteraid_get_restaurant_config), and the guest's first name, last name, email and phone — WaiterAid emails the confirmation and the booking code to that address, and the guest later needs that code to view or cancel. Ask once for special requests (allergies, a highchair, an occasion, seating wishes) and pass them as comment — never promise to add one afterwards. One call per booking; never retry a call that timed out or answered ambiguously — check with the guest instead. The result carries booking.short_code: give it to the guest as their booking code. If booking.confirmed is 0 and booking.no_show_text is present, the restaurant requires a card guarantee: the booking is not final until the guest completes it at booking.confirmLink — say so and give the link. Failures name a code: table-already-taken, booking_error, no-tables-err or resv-temp-already-fill-err mean the slot went while you were talking — re-run availability and offer alternatives; widget_double_booking means this guest already holds a booking here that day; past-book-err means the date is in the past; email-err, mobile-empty, firstname-empty or lastname-empty mean a guest detail is missing or malformed — ask for it again. This books a table; to put the guest on the waitlist for a full time use waiteraid_join_waitlist instead. |
waiteraid_extend_gift_card | Extend the validity of a guest's existing, not-yet-expired gift card. Needs giftcard_identifier (the code printed on the card) and giftcard_valid_to — the card's CURRENT end date, YYYY-MM-DD, exactly as last shown to the guest; ask the guest for both. Returns the identifier and the new valid_to. Whether extension is possible at all is the restaurant's setting, and only cards sold with the eligible duration qualify — a refusal is the restaurant's rule, not an error to retry. A conflict-refresh failure means the end date changed since it was shown: ask the guest for the date now printed on the card (or on their receipt) and retry once with exactly that date. |
waiteraid_find_reservation | Look up an existing table booking by the booking code the guest received by email, after booker verification. Flow: ask for the booking code, call request_integration_verification with it as the confirmation number (provider waiteraid), have the guest type the code Maison emails them, call verify_integration_code, then call this with confirmationNumber = the booking code and reservationId = the reservation_id returned by verification. Returns the booking's date, times, party size and confirmation state — never the guest's contact details. Reveal nothing about a booking before verification succeeds. |
waiteraid_get_reservation | Full details of one table booking by its booking code, after booker verification: restaurant, date, start and end time, party size, waitlist and confirmation state, the special-request comment, and the guest's name and contact under guest. Pass the reservation_id returned by verify_integration_code as id — it is the booking code. If confirmed is 0 and no_show_text is present, the booking still needs the card guarantee at confirmLink. For the booking's allergies use waiteraid_list_allergies. |
waiteraid_join_waitlist | Put the guest on the restaurant's waitlist for a time that has no availability. Only when waiteraid_get_restaurant_config reported allowWaitlist (or settings.waitlist) true, only after an availability call showed the time is full, and only when the guest explicitly asks to be waitlisted. Takes the same details as waiteraid_create_reservation: date, time (HH:MM), party size (amount), meal (mealid), first name, last name, email, phone and an optional comment. The result is a waitlist entry (booking.waitlist = 1), NOT a confirmed table: tell the guest the restaurant will contact them if a table frees up, and give them booking.short_code as their reference. invalid-wl-booking, invalid-wl-guest or temp-book-err-waitlist mean the waitlist is not available for that time — say so and offer other times. |
waiteraid_list_allergies | Read the allergies on a table booking, after booker verification: allergies (the restaurant's own list — id and name — the only ids waiteraid_set_guest_allergies accepts), booking_allergies (the ids already selected, per guest_id) and other_allergies (free-text notes per guest). Pass the verified reservation_id as id. Call this before setting allergies so you use the restaurant's ids, never invented ones. |
waiteraid_list_gift_cards | List the gift cards the restaurant sells — id, name, description, the value range (min_value/max_value) and default price (def_price), each with optional add-on products (id, name, price, vat) — only when waiteraid_get_restaurant_config reported giftcards true; an empty list means none are on sale. Names follow the restaurant's guest language. Buying is not possible through chat — describe what is on offer and point the guest to the restaurant. |
waiteraid_send_email_code | Email the guest a 4-digit WaiterAid code that proves they own the email address (WaiterAid's own check, separate from Maison's booker verification). Use verify = true for a pure ownership check during a booking — the email need not be a saved WaiterAid guest; without it the email must already exist as a guest (login mode). The code is valid for 5 minutes and WaiterAid issues at most one code every 10 seconds per sending address, which Maison shares across hotels — code-already-sent means wait ten seconds and try once more. After waiteraid_verify_email_code succeeds, a booking made with that email within 10 minutes is flagged as email-verified. no-email-exists means login mode found no guest (use verify = true instead); code-not-available is a temporary vendor problem — try later. |
waiteraid_send_reservation_request | Send a reservation REQUEST to the restaurant for a party larger than settings.max_people (from waiteraid_get_restaurant_config), when reservation_request_form_enabled is true. This is not a booking: the restaurant reviews the request and replies to the guest; the result carries a request_id and a success message. Tell the guest plainly that the table is requested, not confirmed. Needs the date, a time (HH:MM, one the restaurant serves that meal), the party size, the mealid, the guest's first name, last name, email and phone, and the request details as comment (occasion, seating wishes, anything the restaurant should know). When reservation_request_form_enabled is false, give the guest settings.max_people_message and the restaurant's contact details instead. |
waiteraid_set_guest_allergies | Set the allergies for ONE guest of a table booking, after booker verification. guest_number is the guest's position in the party (1 for the first guest, 2 for the second…); allergies is a list of at least one allergy id from waiteraid_list_allergies (never a name, never an id you did not see there); other_allergies is an optional free-text note for anything not on the list. The submitted list REPLACES that guest's existing allergies — include the ones to keep. Never send an empty list: it would delete every allergy for every guest on the booking; to do that deliberately use waiteraid_clear_all_allergies. Pass the verified reservation_id as id. |
waiteraid_verify_email_code | Check the 4-digit code the guest received from waiteraid_send_email_code. Pass the same email and the same verify value as when it was sent. valid = true means the email is verified with WaiterAid for the next 10 minutes; guest carries the saved guest's own name and email in login mode (never their mobile number) and is null in verify mode. invalid-code means the code is wrong or has expired (after 5 minutes) — offer to send a new one. save keeps the guest logged in on WaiterAid's own site for 7 days (login mode only) and has no effect on a booking made through Maison. |