---
title: Products
order: 4
updated: 2026-07-12
---

# Products

A product in the catalogue is called a *Product Head* (the list screen is titled *Product Heads*, and the app also calls them "product categories" — the search box reads *Search product categories…*). Each product head is one broad type of item you buy or sell — for example, *Steel Pipes*. The specific sizes, grades, or brands of that item live underneath it as **product codes**. A head carries the shared defaults — description, HSN code, tax rate, the units it can be measured in, and the makes it can be branded with — and every code and enquiry line under it inherits or is constrained by those defaults.

This page covers creating, editing, searching, and deleting product heads, plus the guard rails that fire when you change a head that already has data behind it. For the variant-level screen see [Product codes](/docs/records/product-codes).

## Open the products screen

1. Open *Data Entry* in the sidebar and click *Products*.
2. The list shows every product head, sorted by name (case-insensitive), with a running count badge next to the title. It loads `20` at a time and fetches more as you scroll.

What you can do here depends on your permissions (see [Users and permissions](/docs/settings/users-and-permissions)):

- Seeing the list at all needs *View Product Head List* (`database.viewProductHeadList`).
- *Add Product Head* appears only with *Add Product Head* (`database.addProductHead`).
- The *Edit* and *Documents* buttons appear only with *Edit Product Head* (`database.editProductHead`).
- The *Delete* button appears only with *Delete Product Head* (`database.deleteProductHead`).
- The *Product Code* button reads *Update Product Code* with *Edit Product Code* (`database.editProductCode`), otherwise *View Product Code*.
- *Transfer Code* (in the options menu) appears only with *Edit Product Code*.

Every one of these rules is re-checked on the server, so a button that is hidden for you cannot be triggered by other means.

## Find a product head

Type into the *Search product categories…* box at the top of the list. Search is a fuzzy match on the head name, runs after a short pause as you type, and returns up to `30` results. Clear the box to return to the full, infinitely-scrolling list. Search matches names only — not descriptions, HSN codes, or the codes underneath.

## Add a product head

Click *Add Product Head* to open the *Add Product Head* modal. It has two tabs — *Details* and *Units & Makes*. If you press *+ Add Product Head* while a required field is missing, the modal jumps to the tab that holds the first error. Fill both tabs, then press *+ Add Product Head* to save.

### Details tab

#### Product Head Name

The internal name of the category, e.g. `Steel Pipes`. This is what you and your team search and pick by. It is required — the modal will not save an empty name. Typing here also auto-fills the *External Display Name* below, up until the moment you edit that field by hand.

#### External Display Name

The customer-facing category name printed on quotation PDFs, order PDFs, and outgoing emails — shown at the top of each product row, above the product code name. Use it when your internal name carries codes or jargon a customer would not recognise (internal `SS-304 Seamless Pipes` → external `Stainless Steel Pipes`). It is **optional**; leave it blank and documents fall back to the plain head name. It auto-fills from the head name as you type but can be edited independently at any time (once you touch it, it stops tracking the head name). See [Generate a quotation](/docs/enquiry-bank/generate-quotation) for where it appears on the document.

#### Default Description

A rich-text description that is pre-filled onto a quotation whenever this product appears on one. Formatting (bold, lists, etc.) is preserved. The text is sanitised on the server before it is stored — any script or unsafe markup is stripped and the attempt is logged — so paste freely; only clean formatting survives. Leave it blank if you prefer to write the description per enquiry.

#### Default HSN Code

The HSN classification number for the item, e.g. `7304`. It is a whole number only (no decimals), the minimum is `0`, and the default is `0`. A value of `0` effectively means "no HSN set yet" — you can fill it in later by editing the head. This is the value new product codes and enquiry lines start from.

#### Default Tax Rate

The GST slab applied to this item by default. Pick one of the fixed slabs:

- `0% — Exempt`
- `5% — GST`
- `12% — GST`
- `18% — GST`
- `28% — GST`

These five slabs (`0`, `5`, `12`, `18`, `28`) are the only allowed values, and the server rejects anything else. There is no free-typed rate.

#### HSN code is same for all product codes

A checkbox, **off by default**. When on, every product code under this head — and every enquiry line that uses one of those codes — is locked to the head's *Default HSN Code*: you will not be able to change the HSN while adding a product code or an enquiry. Leave it off if different variants under the same head carry different HSN codes. Turning this on (or changing the HSN while it is on) on an existing head triggers the [cascade warning](#what-is-the-cascade-warning-when-i-edit-hsn-or-tax).

#### Tax rate is same for all product codes

The same idea for tax: **off by default**, and when on it locks every code and enquiry line under the head to the head's *Default Tax Rate*. Leave it off when variants are taxed at different slabs. Turning it on (or changing the rate while on) on an existing head triggers the cascade warning.

### Units & Makes tab

#### Allowed Units

The units of measure valid for this item — for example *Meter*, *Kilogram*, *Number*. Search and pick from your firm's unit list; selected units show in a small table with their short-forms, and the `×` button removes one. **At least one unit is required** — the modal blocks saving with an empty list. The unit list itself is shared across the whole catalogue and is maintained under *Data Entry → Utilities → Product Units*; see [Utilities](/docs/records/utilities).

#### Allowed Makes

The makes (brands/manufacturers) this item can be branded with — for example a pipe head might allow *Jindal*, *Tata*. This list is **optional** (it can be empty). Search and pick from your firm's make list. The server verifies every make you pick actually exists before saving. Makes are maintained on their own screen — see [Manufacturers](/docs/records/manufacturers). Which makes a head allows matters later: a product code can only be used with a make its head allows, and this constraint is enforced when you [transfer a code](#transfer-a-code-to-another-head) too.

## Manage product codes

Each row's *Product Code* button opens the codes screen for that head (*Update Product Code* if you can edit codes, otherwise *View Product Code*). That is where you add and manage the specific variants. Full details are on the [Product codes](/docs/records/product-codes) page.

## Edit a product head

With edit permission, each row shows an *Edit* button that opens the *Edit Product Head* modal. It is the same two-tab form as *Add*, pre-filled with the head's current values, and saved with *Save Changes*. The difference is what happens when your edit touches data that other records already depend on. The server runs several guards **in order**, and the modal reacts to each:

### Removing a unit that is still in use

If you remove a unit from *Allowed Units* and any product code under this head is still using that unit (in an enquiry, order, or stock record), the save is **blocked**. A "where used" modal opens listing every place the removed unit is referenced, so you can go and change those records first. There is no "proceed anyway" here — you must clear the references, then come back and save. The check is scoped to codes under *this* head, so a unit used only under other heads does not block you.

### Removing a make that is still in use

If you remove a make from *Allowed Makes* and it is still referenced by records under this head — the server message names *enquiries, sales orders, purchase orders, RFQs, or stock entries* — a **warning** modal opens listing every place it is used, with links to open each record. Unlike the unit case, this one lets you continue: tick the confirmation and choose to proceed, and the removal goes through. Existing entries keep the make they already have; only *new* entries can no longer pick that make for products under this head. Clean up first, or proceed knowingly — your choice.

### Editing HSN or tax while "same for all codes" is on

If *HSN code is same for all product codes* (or the tax equivalent) is ticked and you change the value — or you newly tick the box — saving is intercepted by a *Cascade Warning*. Because the value is enforced firm-wide for this head, confirming will overwrite the HSN code / tax rate on **every product code under the head and every enquiry line that uses one of those codes**. You must tick *I understand the risk* to enable *Confirm Update*; the action cannot be undone. If the box is *off*, changing the default HSN/tax is harmless — it only sets the starting value for future codes and does not touch existing ones.

## Attach documents to a product head

With edit permission, each row also has a *Documents* button that opens the attachments screen for that head. Drag files in or browse to upload; each attached file shows its name, size, uploader, and date, with preview and remove actions. Uploading and removing require the same *Edit Product Head* permission, enforced on the server. Use it for spec sheets, datasheets, or reference images tied to the whole category (individual variants have their own documents on the [product codes](/docs/records/product-codes) screen).

## Delete a product head

With delete permission, each row shows a *Delete* button. It opens a *Delete Product Head* confirmation ("This action cannot be undone."). Deletion is guarded on the server in two steps:

1. **Child codes first.** If the head still has any product codes under it, the delete is refused and you are told exactly how many child codes to remove first. Delete those codes (each runs through its own reference checks) and try again. The head is never cascade-deleted with its codes — that would orphan the enquiries, orders, and stock records those codes appear in.
2. **Other references.** Even with no codes, if the head is referenced elsewhere — most commonly as a supplier's product category — the delete is blocked and a "where used" modal lists those references so you can clear them.

Only when a head has no codes and no other references does the delete go through. See [Deleting records](/docs/records/deleting-records) for how the app's reference checks work in general.

## Transfer a code to another head

If a code was filed under the wrong head, you can move it to a different head without re-creating it or disturbing the enquiries, orders, and stock records that use it — those records resolve a code's head live, so they simply start showing it under the new head. No historical amounts change.

1. On the *Products* page, open the options menu (the slider icon at the top right) and choose *Transfer Code*. (This menu item only appears if you can edit product codes.)
2. In the *Move from* panel (right), pick the **source head**, then the **code** to move.
3. In the *Move to* panel (left), pick the **destination head** — it must be different from the source.
4. Click *Transfer Code* and confirm.

Before the move, the server checks that the destination head can actually hold the code, and **blocks** the transfer if any of these fail:

- the destination head does not allow one of the **units** the code uses;
- the destination head does not allow a **make** the code is actually used with in enquiries/orders (only in-use makes are checked, and the modal points you at where those makes are used);
- the destination head enforces a fixed **HSN code** that differs from the code's; or
- the destination head enforces a fixed **tax rate** that differs from the code's.

Fix the destination head (or the code) and retry — nothing changes until every check passes. The move itself is a single field change on the code; the app also re-checks that the code really still belongs to the source head you named, so a stale screen cannot move the wrong item.

## Manage units and makes

- **Units** — the measure list shared across the whole catalogue lives under *Data Entry → Utilities → Product Units*. See [Utilities](/docs/records/utilities).
- **Makes** — brands/manufacturers are maintained on their own screen. See [Manufacturers](/docs/records/manufacturers).

## Common questions

### What is a "head" versus a "code"?

The head is the broad item/category; the code is the specific variant. *Steel Pipes* is the head, and `SP-50MM-A` is a code under it. Enquiries and other documents are built from codes, but the code's head supplies the shared defaults and the display name.

### Can a product head have just one code?

Yes. Many firms keep one default code per head. A head with no codes at all is allowed too — you just cannot use it on an enquiry until at least one code exists under it.

### What if I do not know the HSN code yet?

Leave *Default HSN Code* at `0` and fill it in later by editing the head. Don't tick *HSN code is same for all product codes* until the number is right, or you'll cascade a placeholder value onto every code.

### Why can't a colleague change the HSN or tax on a code?

The parent head has *HSN code is same for all product codes* (or the tax equivalent) ticked, which locks that value on every code and enquiry line under it. Open the head, untick the box, save, and the field becomes editable on the codes again.

### What is the cascade warning when I edit HSN or tax?

It appears only when the head enforces a uniform HSN or tax (*…same for all product codes* is on) and you change that value or newly turn the enforcement on. Confirming overwrites the value on every product code under the head and every enquiry line using those codes — it is deliberate and cannot be undone. With the box off, changing the default affects only new items and shows no warning.

### I removed a make/unit but the app won't let me save — why?

Because something still uses it. Removing a **unit** that codes under this head still use is blocked outright — clear those references first. Removing a **make** that is still referenced shows a warning you can override; if you proceed, old records keep the make and only new ones lose the option. In both cases the modal lists exactly where the item is used.

### What happens to old enquiries and orders when I transfer a code to another head?

Nothing breaks. Those records point at the code, not the head, and derive the head live — so after a successful transfer they simply display under the new head. Historical prices, taxes, and quantities are untouched. The transfer is only allowed if the new head already covers the code's units, in-use makes, and any enforced HSN/tax.

### Why is the External Display Name filled in automatically?

As a convenience: when you type the head name, the display name copies it so you don't type twice. Edit the display name whenever you want a cleaner customer-facing label — once you edit it, it stops mirroring the head name. Leave it blank and documents just use the head name.
