-
Notifications
You must be signed in to change notification settings - Fork 1
Zones and Assets
A floor is just a container — the zones colour-group the plan and the assets are the actual bookable things. This page walks through both.
A zone is a coloured region on a floor plan. Every bookable asset belongs to exactly one primary zone and may optionally appear in additional zones. Zones have no geometry of their own — they exist only as a label + colour that groups assets visually on the plan.
From the floor editor (Admin → Buildings → building → floor → Manage):
- Click Add Zone.
- Fill in:
-
Name (required) — e.g.
Window Row,Team A,Phone Booths. -
Colour — 6-digit hex (
#6366f1by default). The colour picker shows the current palette and tints the markers for every asset in the zone. - Zone Group (optional) — see below.
-
Name (required) — e.g.
- Save.
Zones can be renamed or recoloured at any time (PUT /api/v1/zones/:id).
Deleting a zone is blocked if it's still the primary zone of any asset — move
or delete those assets first.
Floor managers (see Users Groups and Permissions) can create, edit and delete zones on the floors they manage. SUPER_ADMINs can do it anywhere.
By default Roomer stops a user from holding two overlapping bookings on the same zone. Use a zone group when you want the same rule to apply across multiple zones on a floor.
Common case: you have two zones Hot Desks — East and Hot Desks — West and you want a user to have at most one hot desk booked at any time. Put both zones in the same zone group and the booking API will reject a second, overlapping booking.
To create a group:
- From the floor editor, click Add Zone Group (or the "Manage groups" button in the zones panel).
- Give it a name — only for your own reference.
- Edit each zone and set its Zone Group dropdown to the new group.
Zone groups are floor-scoped — they don't span buildings or floors.
"Asset" in Roomer covers two distinct concepts that share the same record:
| Type | isBookable |
Lives where | Examples |
|---|---|---|---|
| Bookable asset | true |
Placed on a floor plan at (x, y) with width/height | Desks, meeting rooms, phone booths, parking bays |
| Inventory asset | false |
Unplaced, managed from Admin → Assets | Laptops, phones, keyboards, adapters |
Both live in the same Asset table — the isBookable flag just controls
whether they appear on a floor plan and go through the booking flow, or sit in
the inventory registry. This page focuses on the bookable side; the inventory
side is in Reports and Leases (assignment tracking is the same primitive).
Every asset belongs to an asset category. Categories define a default icon, a default colour, and whether assets in that category are bookable by default.
Categories are managed in Admin → Assets → Categories. Fields:
| Field | Notes |
|---|---|
| Name (required, unique) | e.g. Desk, Meeting Room, Laptop, Phone Booth
|
| Description | Free text |
| Default Is Bookable | New assets in this category are created as bookable by default |
| Default Icon | One of the Lucide icons supported by the canvas |
| Colour | Hex #rrggbb, default #6366f1 (used when no zone colour applies) |
Categories can be created directly, or auto-created by CSV import — the
importer creates a category named after the category cell if none exists.
When you add a bookable asset you set:
| Field | Required | Description |
|---|---|---|
| Category | ✓ | One of the asset categories above. |
| Name | ✓ | Displayed on the marker. Convention: short codes like A-01, MR-Jupiter. |
| Booking Label | "Desk", "Room", "Bay". Shown in emails and on the booking dialog. Defaults to Desk. |
|
| Amenities | Free-text tags shown on the marker tooltip. CSV import accepts a semicolon-separated list (e.g. monitor;docking-station;adjustable-desk). |
|
| Serial Number / Asset Tag | Optional free-text identifiers. Asset tag must be unique across the whole system. | |
| Primary Zone | Which zone the marker is coloured by. Must be on the same floor as the asset. | |
| Floor, x, y, width, height, rotation | Position on the plan (grid units). New placements default to x=50, y=50, w=3, h=2. |
|
| Booking Status | See below. Defaults to OPEN. |
This governs who — if anyone — can book the asset. It's independent of the
inventory status (AVAILABLE, ASSIGNED, MAINTENANCE, RETIRED,
DISABLED), which applies to physical tracking of the asset:
| Value | Meaning | Who can book |
|---|---|---|
OPEN |
Default. Anyone with access to the floor can book. | Every user with floor access. |
RESTRICTED |
Allow-list only. | Only users explicitly added to the asset's allow list. |
ASSIGNED |
Permanently assigned to one or more specific users. | The assigned users — plus anyone the assigned user has "offered" time to, via an availability window. |
DISABLED |
Temporarily or permanently withdrawn from booking. | Nobody. Marker renders greyed out with a "disabled" badge. |
See Booking and Queue for how statuses surface in the UI.
There are three ways to create bookable assets and place them on a plan:
-
One-by-one, on the plan. Open the floor editor and use the Add Asset toolbar button. Pick a category, pick a zone, give it a name — it drops at
x=50, y=50with a default3 × 2footprint. Drag it to the right spot, resize by dragging the corner handles, rotate with the top handle. Positions are persisted viaPATCH /api/v1/assets/positions. -
Per-floor CSV bulk import (covered in depth in Bulk CSV Import). The floor editor has a Bulk Import button that accepts a CSV with these columns:
name,category,bookingStatus,bookingLabel,amenities,serialNumber,assetTag,notes,zoneName A-01,Desk,OPEN,Desk,monitor;docking-station,,,,Window Row A-02,Desk,OPEN,Desk,,,,,Window Row MR-Jupiter,Meeting Room,OPEN,Room,whiteboard;tv,,,,Rooms-
bookingStatusacceptsOPEN,RESTRICTED,ASSIGNED, orDISABLED(uppercase). Empty cell defaults toOPEN. -
amenitiesis a semicolon-separated list (,is already the column separator). Empty cell = no amenities. -
zoneNameis matched case-insensitively against existing zones on the floor. If no match, the asset is placed in the floor's first zone (create your zones first for predictable placement). - Assets are all dropped at
(50, 50)with a3 × 2footprint — after import, rearrange them on the plan. - Maximum 500 rows per import.
-
-
Global CSV import (Admin → Import). Creates buildings, floors, zones and assets from one sheet — useful for initial seeding. See Bulk CSV Import.
If an inventory asset was created via Admin → Assets → New with
isBookable = true but no floor, it shows up under the floor editor's
Unplaced Assets list. Click Place on plan to drop it at the default
position in the selected zone.
From the floor editor, click a marker → Edit to update name, amenities, status, primary zone or booking status. Amenities in the inline form are entered as a comma-separated list — the form splits and trims. Floor managers can edit any asset on their floors.
There are two distinct mechanisms; pick whichever matches your intent.
"Only these specific users can book this asset."
- Set Booking Status → Restricted.
- In the asset's Allow List tab, add users one at a time.
- Save.
The asset renders with a lock icon for users not on the list (and status: restricted in GET /floors/:id/availability). Only allow-listed users (and
SUPER_ADMINs) can call POST /bookings.
"This desk belongs to Alice." or "This desk is shared between Alice and Bob."
- Set Booking Status → Assigned.
- In the asset's Assigned Users tab, add one or more users. One can be marked primary.
- Save.
The assigned users see the asset under My Assets and can book it any time (it still goes through the normal booking flow — bookings can be for an hour, for a day, or ongoing).
Setting bookingStatus = ASSIGNED via the API when no user is assigned yet is
legal; the asset will simply be unbookable by anyone until a user is added.
Removing the last assigned user automatically resets the booking status to
OPEN.
An assigned user can let the wider team book "their" desk for a period when they'll be away. From My Assets:
- Click the asset.
- Add availability window — start/end datetime + optional note.
- Save.
While a window is active, any user with floor access can book the asset as if
it were OPEN. Outside the window, only the assigned user(s) can. Windows can
be deleted by the owner or by a SUPER_ADMIN.
Create these in Admin → Assets → New with Is Bookable = false. They don't appear on floor plans — they exist for inventory tracking:
- Serial number / asset tag for scans and audits.
- Purchase date / warranty expiry — free fields, shown on the asset page.
-
Assign / unassign: Admin → Assets → select asset → Assign to record
that a laptop is currently with a specific user. The assigned user sees the
asset under My Assets. Unassigning returns it to
AVAILABLE. -
History: the assignment ledger is preserved (
returnedAtmarks the end of each loan).
The same Asset record can be both bookable and tracked — for example a
portable monitor that is permanently assigned to a desk on a floor plan still
has a serial number and warranty fields.
When you have many assets to assign at once, use the Bulk assign users button rather than adding each user one at a time.
Where to find it:
- Admin → Buildings → [a building] — Bulk assign users button in the page header.
- Admin → Assets — Bulk assign users button above the asset table (SUPER_ADMIN only).
ASSET_ID,USER_EMAIL,IS_PRIMARY
<asset-uuid>,jane.smith@example.com,true
<asset-uuid>,john.doe@example.com,false| Column | Required | Notes |
|---|---|---|
ASSET_ID |
✓ | The Roomer asset UUID. |
USER_EMAIL |
✓ | Must match an existing Roomer user account. |
IS_PRIMARY |
true or false. Defaults to false. Only one user per asset can hold the primary flag — setting a new primary clears any existing one. |
In the Bulk assign users dialog on a building page, click Download
[building] assets. This exports a pre-populated CSV of all assets in the
building with their current USER_EMAIL assignments (blank for unassigned
assets). Fill in or update the emails and re-upload.
On the Assets page (no building context), download the blank template and
fill in asset IDs manually, or retrieve them via
GET /api/v1/assets/user-assignments/export?buildingId=<id>.
The dialog shows a row-by-row preview before importing. Rows with missing or
invalid fields are flagged as errors and skipped — valid rows still
import. After import, a result screen shows the success count and lists any
failures by row with an error reason (e.g. User not found,
Asset not found).
On the building detail page, each floor card has a Clear assignments
button (user-minus icon). After confirmation, this removes every permanent
user assignment from every asset on that floor and resets their booking
status to OPEN. The action cannot be undone.
- Point users at a new floor — see Users Groups and Permissions.
- Flip on email notifications for bookings — see Email Notifications.
- Do the first real booking run — see Booking and Queue.
Install & Run
- Getting Started
- Development Setup
- Production Deployment
- Kubernetes Deployment
- Backup and Recovery
- TLS Configuration
- Configuration Reference
Using Roomer
- Buildings and Floors
- Zones and Assets
- Users, Groups and Permissions
- Booking and Queue
- Bulk CSV Import
- Enterprise Auth
- Email Notifications
- Webhooks
- Reports and Leases
Developer