---
title: Warehouses
order: 2
updated: '2026-07-12'
---

# Warehouses

A warehouse — labelled a *Godown* on the buttons and forms — is the top level of the storage hierarchy where you keep stock. The structure is three levels deep: a **godown** (warehouse) contains **rooms**, and each room contains **racks**, which is where individual items finally sit. This list needs to exist before you can record *where* stock is kept, transfer it between locations, or print scannable QR labels.

Godowns are firm-wide reference data. Everyone in the firm sees the same list (subject to the per-user location scope described below), and the room/rack counts on each row update automatically as the structure underneath grows.

## Open the warehouses list

1. Open *Data Entry* in the sidebar and click *Utilities*.
2. Open the *Warehouses* tab.

The *Warehouses* tab only appears if you are a firm administrator or hold at least one warehouse permission — specifically *CRUD Godowns* (`inventory.crudGodown`), *Manage Stock in Godowns* (`inventory.manageGodown`), *CRUD Rooms* (`inventory.crudRoom`), or *Manage Stock in Rooms* (`inventory.manageRoom`). If you hold none of these, the tab is hidden and *Utilities* shows only the tabs you can use. See [Users and permissions](/docs/settings/users-and-permissions).

The tab header shows a *Warehouses* title with a live count chip of how many godowns you can see, a *Bulk QR* button (when at least one godown exists), and an *Add Godown* button (only if you can create godowns — see below).

### What you can see vs. what you can change

Two different permission questions apply on this page, and they are answered independently:

- **Which godowns appear** — Admins and anyone with an `all` godown scope see every godown. A user scoped to specific godowns sees only those. A user given only room-level or rack-level scope sees the *parent* godowns those rooms/racks belong to (derived automatically), and nothing else. A user with warehouse permissions but no valid scope entries sees an empty list.
- **Whether you can add / edit / delete** — The *Add Godown* button, the *Edit* button, and the delete icon only appear if you are an administrator **or** you hold *CRUD Godowns* (`inventory.crudGodown`) **with** a godown CRUD scope of `all`. A scope limited to specific godown IDs is enough to *view* and manage *rooms*, but not to create, rename, or delete the godown container itself. The server re-checks this on every add/update/delete request, so a hidden button cannot be worked around by a forged request.

## Add a warehouse

1. Click *Add Godown* in the header.
2. Fill in the fields (below) and click *Create Godown*.

The new godown appears in the list with `0 rooms` and `0 racks`. From there you add the rooms inside it — see [Warehouse rooms](/docs/records/warehouse-rooms).

### Name

The warehouse's display name — what shows in the list, on the rooms screen heading, and on printed QR labels. Placeholder: `Main Warehouse`.

- **Required.** Leading and trailing spaces are trimmed; an empty (or spaces-only) name is rejected both in the form and again by the server.
- **Must be unique within the firm, case-insensitively.** `Main Warehouse` and `main warehouse` are treated as the same name — the server refuses the second with `A godown named "…" already exists`. This check ignores accent/case differences.
- There is no fixed character limit enforced beyond "at least one character."

### Description

An optional free-text note (placeholder `Ground floor storage`). Shown as grey sub-text under the name in the list. Leave it blank if you don't need it — it defaults to an empty string.

The description is sanitised on the server before it is stored: any HTML/script content is stripped, and an actual injection attempt is logged as a security event. Whatever you type that isn't markup is kept as-is.

## Find a warehouse

Use the *Search godowns…* box above the list. Typing filters the list by **name** (case-insensitive, partial match). The search waits about a third of a second after you stop typing before it runs, and it returns up to `30` matches at a time. Clear the box to return to the full list.

The search is scope-aware on the server: it only ever returns godowns you are allowed to see, so you cannot surface a hidden warehouse by guessing its name.

## The warehouse list

Each row shows:

- **Godown Name** — the name, with the description underneath if one is set.
- **Structure** — a live count of rooms and racks: for example `3 rooms · 12 racks`. The rack count is the total across *all* rooms in that godown, not per room. Both counts come from the server and update whenever you add or remove rooms/racks.
- **QR** — a *Generate QR* button (see [Print QR labels](#print-qr-labels)).
- **Rooms** — a *Manage Rooms* button that opens the rooms screen for that godown. See [Warehouse rooms](/docs/records/warehouse-rooms).
- **Actions** — an *Edit* button and a delete icon. This whole column is hidden unless you can create/manage godowns (admin or `crudGodown` + `all` scope).

## Edit a warehouse

If the *Actions* column is visible, click *Edit* on a row to open the *Edit Godown* form. It has the same *Name* and *Description* fields as the add form, pre-filled with the current values. Change what you need and click *Save Changes*.

- The same case-insensitive uniqueness rule applies — you cannot rename a godown to a name another godown already uses (the check excludes the godown you are editing, so re-saving without changing the name is always fine).
- Editing only changes the container's name and description. It does not touch the rooms, racks, or any stock already recorded inside.
- The server re-verifies your permission (admin or `crudGodown` + `all` scope) and that the godown still exists before saving.

## Delete a warehouse

Click the trash icon in the *Actions* column. A confirmation appears reading *Delete "name"?* with the note *"Deletion will fail if the godown contains rooms or is referenced by historical stock movements."* The only button is *Delete*; close the modal to cancel.

Deletion is guarded in two stages on the server, and either stage can block it:

### Blocked because it still has rooms

If the godown contains any rooms, the delete is refused and you get a plain error toast: *"Cannot delete: this godown has N room(s). Remove all rooms first."* Open *Manage Rooms*, delete the rooms (which in turn requires their racks to be gone first), then try again. See [Warehouse rooms](/docs/records/warehouse-rooms).

### Blocked because stock movements reference it

Even an empty godown cannot be deleted if it is referenced anywhere in the firm's stock history. The server checks every place a godown can be recorded:

- stock arrivals received *into* this godown,
- stock deliveries dispatched *from* it,
- stock transfers with this godown as source or destination,
- stock adjustments recorded against it,
- stock conversions using it on either the source or destination side.

If any such reference exists, the delete is refused and a *Where-used* panel opens listing what is still pointing at the godown, so historical records are never silently orphaned. There is no "force delete" — the references are permanent stock history. If a godown is truly retired, simply stop using it; leaving it in the list costs nothing. See [Deleting records](/docs/records/deleting-records) for how the where-used check works across the app, and [Transfer stock](/docs/inventory/transfer-stock) / [Add a stock arrival](/docs/inventory/add-stock-arrival) for the movements that create these references.

Deleting also requires admin or `crudGodown` + `all` scope; the server rejects the request otherwise.

## Print QR labels

Every godown can be turned into a scannable QR label. Scanning it with the Intigra mobile app jumps straight to that location's stock. The QR encodes only a compact pointer — the firm, the location type (`godown`), and the location's internal ID — nothing else.

- **One godown** — click *Generate QR* on its row.
- **Every godown at once** — click *Bulk QR* in the header. This queues a label for every godown currently in the list.

Both open the same *Generate QR Code* modal (titled *Generate N QR Codes* in bulk). A live preview of the (first) code is shown at the top. The modal has just two settings and three export buttons:

### QR Size (inches)

The printed size of each QR square, in inches. Range `0.5`–`8`, adjustable in steps of `0.25`, default `2`. Values are shown to two decimal places. This drives both the on-page size and how many labels fit per sheet in a PDF. QR images are rendered at 300 DPI for export, so even small labels stay crisp.

### Paper Size (PDF)

The page size used **only** for the PDF export. Options (default *A4*):

- `A4` — 210 × 297 mm.
- `A4 Half` — 210 × 148.5 mm.
- `A4 Quarter` — 105 × 148.5 mm.
- `Letter` — 216 × 279 mm.
- `Custom` — 76 × 76 mm (a small square, handy for single-label sheets).

This setting is ignored by the PNG and SVG exports, which produce a single bare QR image.

### Export buttons

- *PNG* — downloads a single high-resolution (300 DPI) PNG of the previewed code. In bulk mode this exports only the first code, not the whole set.
- *SVG* — downloads a single scalable vector version of the previewed code (best for re-sizing without quality loss).
- *PDF* — lays the code(s) out on the chosen paper size and downloads a print-ready document. In bulk mode it tiles as many labels per page as fit (based on the QR size and paper size) and adds more pages automatically. Each label on the PDF is captioned with the location **name** in bold above the code and the location **type** (e.g. `GODOWN`) below it.

Downloaded files are named after the location — for example `godown-Main Warehouse-qr.pdf` for a single code, or `godowns-qr-bulk.pdf` for a bulk sheet. There is no direct "send to printer" action; open the downloaded PDF/PNG and print it from your viewer.

### Fixed QR appearance

The label style is fixed and not configurable: black rounded dots on a white background, rounded corner markers, the Intigra logo rendered in black-and-white in the centre, and a high error-correction level (so the code still scans even with the centre logo or minor print smudging). There are no controls for dot style, corner style, logo on/off, borders, or colour.

## Common questions

### Why does the button say *Add Godown* but the page says *Warehouses*?

*Godown* is the local term the system uses on buttons and forms; *Warehouse* is the plain-English label on the page and in this guide. They mean exactly the same thing — the top level of the storage hierarchy.

### How many warehouses can I add?

There is no fixed limit. Add a separate godown for every physical location, however small — even a single storage room in your office. Each name just has to be unique within the firm.

### Why don't I see the *Add Godown* / *Edit* buttons?

Those actions need administrator rights or the *CRUD Godowns* permission with an `all` scope. If your scope is limited to specific godowns you can still open them and manage their rooms, but you can't create, rename, or delete the godown container itself. Ask a firm administrator to widen your scope. See [Users and permissions](/docs/settings/users-and-permissions).

### Why do I see fewer warehouses than a colleague?

The list is filtered to the locations your permissions cover. Admins and users with an `all` scope see everything; a user scoped to specific godowns (or only to rooms/racks inside them) sees just those. This is enforced on the server, so the same filtering applies to search too.

### I renamed a warehouse — did it change the QR codes I already printed?

No. The QR encodes the godown's internal ID, not its name, so previously printed labels keep working after a rename. The printed *caption* on new labels will show the new name, but old labels still scan to the same location.

### The delete keeps failing — how do I actually remove one?

A godown can only be deleted once it is completely empty of rooms **and** is not referenced by any stock history (arrivals, deliveries, transfers, adjustments, conversions). Remove all its rooms first (each room needs its racks removed first). If stock movements still reference it, it cannot be deleted at all — that history is permanent. In that case just leave the godown unused. See [Deleting records](/docs/records/deleting-records).

### Can I organise stock below the room level?

Yes — each room holds racks, and racks are the most granular location. Rooms and racks are managed from the *Manage Rooms* screen. See [Warehouse rooms](/docs/records/warehouse-rooms) and [Storage locations](/docs/inventory/storage-locations).
