Core Concepts
Five concepts underlie every screen in the manual. Read this once; every other section assumes you know what these words mean.
Tenant
A tenant is one organisation using the platform. FlatsBratislava is one tenant. As the platform onboards new operators, each becomes a new tenant.
- Tenants are isolated: data, settings, integrations, and users never cross a tenant boundary at the application layer.
- Only superadmins can switch between tenants. Regular admins and operators only ever see one.
- Each tenant has its own WhatsApp Cloud API number, Hospitable connection, Nuki account, and language defaults.
The tenant boundary is the most important security and data-integrity boundary in the system. If you ever see data from someone else's tenant, that's a bug — file it with the security label immediately.
Property
A property is one bookable unit — typically a flat or an apartment in a building. Properties belong to a tenant and have:
- An address and photos
- Check-in / check-out windows (
checkInTime,checkOutTime— defaults the rules engine falls back to when a reservation doesn't override) - One or more Nuki smart locks (front door, apartment door, garage)
- A guidebook PDF generated per reservation
- Default pricing inputs for the revenue simulation
See Properties → Configuration for the full editor.
Reservation
A reservation is one stay — one guest (or guest party), one property, a check-in date, and a check-out date. Reservations arrive at the platform via webhook from a booking channel:
- Hospitable (the primary source — channel-aggregates Airbnb, Booking.com, direct)
- Beds24 (legacy, kept for migration tenants)
- Direct API push (for direct bookings)
Each reservation has a canonical guest row in the guests table — that's where the per-stay PIN code, 2N intercom code, and guidebook personalisation live.
⚠ One reservation can produce multiple guest rows if the booking channel re-syncs. The system always picks the canonical row (the most-populated, most-recent). If you ever see a Send Check-in task blocked because "reservation.nukiAccessCode is_not_null" is false — and you've confirmed the PIN exists — that's the canonical-row picker doing its job (or a bug, see #260).
See Reservations for the list view and per-reservation actions.
Task
A task is one unit of work tied to one reservation. Tasks are not created by hand; they are generated by task templates (rules) that watch for reservation events:
| Event | Example task fired |
|---|---|
reservation.created |
Schedule cleaning, Generate access code |
reservation.checkin (~24h before) |
Send check-in instructions, Confirm arrival window |
reservation.checkin (at time) |
Notify cleaner cleaning is overdue |
reservation.checkout (~2h before) |
Send pre-checkout reminder |
reservation.checkout (at time) |
Mark cleaning required, Request review |
Each task has:
- A name (human-readable, language-resolved)
- An action (e.g.
whatsapp.sendTemplate,nuki.generateCode,report.sendReply) — what fires when the task completes - An assignee (which role/teammate it goes to)
- A due date/time
- Zero or more checklist items — including optional auto-resolve conditions
Tasks are surfaced in three places: the Pulse dashboard (today's work), Operations → Tasks (full list, filterable), and WhatsApp (interactive button notifications). See Tasks for the full lifecycle.
Teammate
A teammate is one person who acts inside the tenant: an owner, host, cleaner, admin. Each teammate has:
- A role (admin / host / cleaner / viewer)
- A language (the default outbound language for messages they author or the AI ghost-writes for them)
- A set of properties they're responsible for (optional — admins span all)
- A Nuki access code generated by the platform (so they can enter properties on their days; auto-revoked when their role ends)
- A WhatsApp phone number the system uses to route tasks to them
Teammates are managed under Team & Account — see Team & Access → Teammates.
⚠ Removing a teammate's access code does NOT yet always revoke the Nuki PIN — see issue #166 for the fix and current state.
How they connect
Tenant
├─ Properties
│ └─ Nuki locks
├─ Teammates (cleaners, hosts, admins)
│ └─ Per-teammate Nuki access codes
└─ Reservations
├─ Guest (canonical row with per-stay PIN)
└─ Tasks
├─ Generated by task templates
├─ Assigned to one teammate (role)
└─ Fired through WhatsApp (button-driven)
Everything in the rest of the manual is a screen on top of this graph.
Related issues
- #260 — canonical-guest-row selection (5-duplicate-row bug).
- #137 — NULL
propertyNameon reservation (data quality). - #166 — teammate access-code removal & Nuki revocation.