---
title: Warehouse rooms
order: 3
updated: 2026-07-12
---

# Warehouse rooms

Inside each warehouse (a *Godown*) you define **rooms** — physical sub-locations such as floors, sections, bays, or zones. Each room in turn holds **racks**, and a rack is the leaf location where individual stock finally sits. The full hierarchy is three levels deep: *Godown → Room → Rack*. This page covers everything you can do on the rooms screen — adding, editing, deleting, searching, generating QR codes, and drilling into the racks inside each room.

Rooms and racks are only *labels for places*. Recording stock into them happens on the inventory screens — see [Storage locations](/docs/inventory/storage-locations) and [Add a stock arrival](/docs/inventory/add-stock-arrival).

## Before you start

- The warehouse must already exist. See [Warehouses](/docs/records/warehouses).
- Decide on a naming scheme everyone recognises. Short, consistent names (`Section A`, `Cold Zone`, `Floor 2`) work better than long descriptions.
- Room names must be **unique within their warehouse** (case-insensitive), so `section a` and `Section A` count as the same name. The same room name *can* be reused in a different warehouse.

## Open the rooms screen

1. Open *Data Entry* in the sidebar, click *Utilities*, then open the *Warehouses* tab.
2. Find the warehouse in the list and click its *Manage Rooms* button.

The rooms screen opens with the heading *Rooms in `<warehouse name>`* and a count chip next to it. The chip reads the number of rooms loaded so far, with a trailing `+` (e.g. `20+`) while more pages are still available below the fold.

The back arrow at the top-left returns you to the warehouses list.

## The rooms list

The list is a standard table. Each room row shows:

- **Room Name** — the room's name, in bold.
- **Description** — the optional note, or `—` when empty.
- **QR** — a *Generate QR* button (see [Generate QR codes](#generate-qr-codes)).
- **Racks** — a *Manage Racks (`N`)* button showing the current rack count; opens the racks for that room (see [Manage racks](#manage-racks)).
- **Actions** — *Edit* and a delete (trash) icon. This whole column only appears if you have permission to manage this warehouse's rooms (see [Who can add, edit, and delete](#who-can-add-edit-and-delete)).

The list loads `20` rooms at a time and pulls in the next page automatically as you scroll. Rooms are sorted alphabetically by name.

### Find a room

Type into the *Search rooms…* box to narrow the list. Search matches the room **name** (case-insensitive, partial matches allowed) within the current warehouse only, and returns up to `30` matches. The search is debounced — it fires shortly after you stop typing. Clear the box to return to the full, scrollable list.

## Add a room

1. On the rooms screen, click *Add Room* (top-right).
2. Fill in the fields:
   - *Room Name* — **required**. Leading and trailing spaces are trimmed; an empty or spaces-only name is rejected.
   - *Description* — optional free text (for example `Cold storage zone`).
3. Click *Create Room*.

On success the modal closes and the new room appears in the list.

### What the server checks

Every add is re-verified on the server, so a forged or malformed request cannot slip through or break the list:

- The name must be present after trimming.
- The parent warehouse must be a valid ID that actually exists — otherwise you get `Parent godown not found`.
- You must hold the right permission scoped to this warehouse (see [Who can add, edit, and delete](#who-can-add-edit-and-delete)); otherwise the request is refused with a `Forbidden` message.
- A duplicate name in the same warehouse is blocked with `A room named "…" already exists in this godown`.
- The description is sanitised — any script/HTML injection attempt is stripped before saving and logged as a security event.

There is no fixed character limit on the name or description, but keep names short and scannable.

## Edit a room

1. On the room's row, click *Edit*.
2. Adjust the *Room Name* and/or *Description*.
3. Click *Save Changes*.

The same validation and duplicate-name rules as adding apply (the duplicate check ignores the room you are editing). You **cannot** move a room to a different warehouse from here — the parent warehouse is fixed once the room is created, and the server rejects any attempt to re-parent it with a `parentGodown mismatch` error.

## Delete a room

1. On the room's row, click the trash icon.
2. A confirmation reads *Delete "`name`"?* with the note that deletion will fail if the room contains racks or is referenced by historical stock movements. The only button is *Delete*.
3. Click *Delete* to confirm.

A room can only be deleted when it is completely unused. The server enforces two guards, in order:

1. **The room still has racks.** Deletion is refused and you see `Cannot delete: this room has N rack(s). Remove all racks first.` Open *Manage Racks* and delete the racks first.
2. **The room is referenced by stock history.** Even with no racks, a room cannot be deleted if any past stock movement points at it — a stock arrival received *into* the room, a delivery dispatched *from* it, a transfer *in or out*, a stock adjustment, or a stock conversion. When this happens a *where-used* dialog opens listing exactly which records still reference the room, so you can see why it is locked. Historical records are never silently broken.

Only when both guards pass is the room removed.

## Manage racks

Each room row has a *Manage Racks (`N`)* button, where `N` is the rack count. Click it to open the *Racks in `<room>`* modal (the warehouse name is shown underneath as context).

The racks modal mirrors the rooms screen:

- A count chip shows how many racks the room holds.
- *Bulk QR* (top-right, shown only when the room has at least one rack) generates QR codes for every rack at once.
- *Add Rack* adds a new rack (shown only if you have permission).
- A *Search racks…* box filters by rack name (case-insensitive, within this room, up to `30` matches, debounced).
- The table lists *Rack Name*, *Description*, a *Generate QR* button, and — with permission — *Edit* and delete actions.

### Add a rack

1. In the racks modal, click *Add Rack*.
2. Fill in *Rack Name* (**required**, e.g. `Rack A1`) and an optional *Description* (e.g. `Top shelf`).
3. Click *Create Rack*.

Rack names must be **unique within their room** (case-insensitive). The server verifies the parent room exists, checks your permission, blocks duplicates with `A rack named "…" already exists in this room`, and sanitises the description exactly as it does for rooms.

### Edit a rack

Click *Edit* on the rack's row, change the name or description, and save. The same uniqueness and sanitisation rules apply. A rack cannot be moved to a different room.

### Delete a rack

Click the trash icon and confirm *Delete "`name`"?*. Unlike a room, a rack has no children, so there is only one guard: it cannot be deleted while any historical stock movement references it (arrival into the rack, delivery from it, transfer in/out, adjustment, or conversion). If it is referenced, a *where-used* dialog lists the blocking records.

## Generate QR codes

Every location — warehouse, room, and rack — can be turned into a printable QR code. Scanning it with the Intigra **mobile app** jumps straight to that location's stock.

- **One room:** click *Generate QR* on the room's row.
- **All rooms:** click *Bulk QR* in the rooms-screen header (only shown when there is at least one room).
- **One rack / all racks:** the racks modal has the same *Generate QR* per row and *Bulk QR* in its header.

All of these open the same QR modal. It is titled *Generate QR Code* for a single location (with a *Room: `name`* or *Rack: `name`* subtitle) or *Generate `N` QR Codes* for a bulk set, with a live preview of the first code.

### QR options

The modal keeps the styling fixed and exposes just two controls:

- *QR Size (inches)* — the printed size of each code. Range `0.5`–`8` inches, step `0.25`, default `2`.
- *Paper Size (PDF)* — the sheet size used for the PDF export. Options: `A4`, `A4 Half`, `A4 Quarter`, `Letter`, or `Custom`. Default `A4`. This only affects the PDF; it is ignored for PNG and SVG exports.

The look of the code itself is not adjustable here — every code is rendered with rounded dots, extra-rounded corner squares, black on a white background, high error-correction, and the Intigra logo (rendered in black & white) embedded in the centre.

### Export options

Three buttons at the bottom:

- *PNG* — a raster image of the single previewed code, rendered at print resolution (about `300` DPI for the chosen size).
- *SVG* — a scalable vector of the single previewed code.
- *PDF* — a print-ready document. For a bulk set this automatically tiles as many codes per page as fit the chosen *Paper Size* and *QR Size*, adding pages as needed; each tile prints the location name above the code and the location type (`ROOM` / `RACK`) below it.

Files download through your browser. There is no separate "send to printer" button in this modal — export the PDF and print it.

### What the QR encodes

Each code carries a compact payload identifying your firm, the location type (`room` or `rack`), and the location's ID. It does **not** embed stock figures — those are looked up live when the mobile app resolves the scan, so a printed label never goes stale.

## Who can add, edit, and delete

Access is governed by inventory permissions, set per user under [Users and permissions](/docs/settings/users-and-permissions). A firm administrator can do everything.

**Rooms** — adding, editing, and deleting a room require the *manage godowns (CRUD)* permission **scoped to this warehouse** (either "all warehouses" or this specific one). Without it, the *Add Room* button and the whole *Actions* column are hidden, and the server independently refuses the write even if the request is forged.

**Racks** — adding, editing, and deleting a rack are allowed if you have either the *manage rooms (CRUD)* permission scoped to the parent room, **or** the *manage godowns (CRUD)* permission scoped to the parent warehouse. The server accepts whichever path grants access.

**Viewing** — you can open and browse a warehouse's rooms if you have any relevant scope over it (manage or CRUD, at the warehouse or room level). Users limited to specific rooms see only those rooms in the list.

## Common questions

### How is the warehouse organised?

Each warehouse contains rooms, and each room contains racks — a fixed three-level tree (*Godown → Room → Rack*). Rooms do not nest inside other rooms, and racks do not nest inside other racks.

### Can two rooms have the same name?

Not inside the same warehouse — names are unique there, and the check ignores capitalisation. You can reuse a name in a *different* warehouse. The same rule applies to racks within a room.

### Why can't I delete this room?

Either it still contains racks (delete those first), or a past stock movement references it (an arrival, delivery, transfer, adjustment, or conversion touched it). In the second case a *where-used* dialog opens and lists the exact records that are blocking the delete. This protects your stock history from being broken.

### Why don't I see the Add Room or Edit buttons?

You do not have permission to manage this warehouse's rooms. Managing rooms needs the CRUD-godowns permission scoped to this warehouse; managing racks needs CRUD-rooms on the room or CRUD-godowns on the warehouse. Ask an administrator to grant it — see [Users and permissions](/docs/settings/users-and-permissions).

### Do I have to record the room when adding stock?

That depends on how your inventory module is configured. When room (and rack) location is required, every stock arrival asks which room and rack the item is going into. See [Add a stock arrival](/docs/inventory/add-stock-arrival) and [Storage locations](/docs/inventory/storage-locations).

### Can I change the QR code's colours or style?

No. The QR modal only lets you set the printed size and the PDF paper size; the dot style, corner style, colour, and centre logo are fixed so every printed label scans reliably and looks consistent. You can still export as PNG, SVG, or PDF.

### The QR won't do anything when I scan it with my phone camera — why?

The codes are meant for the Intigra **mobile app**, which decodes the embedded location payload and opens that location's stock. A generic camera or QR reader will not understand it.
