---
title: Setting up catalogue data
description: Creating an item group, its decodification master, a released item code, and pricing a driver row — in the order the product actually requires.
sidebar:
  label: Catalogue setup
  order: 6
---

## What this process achieves

A brand-new product family goes from nothing to quotable: a named family with
its prefixes, an option menu that composes its model number, and one released
size a quotation can actually pick.

## Who is involved

**Catalogue maintainers** do all three creates. Today there is no separate
permission key for item groups or decodification masters — all three screens
sit behind the single `item:*` permission set (`item:view` / `item:create` /
`item:edit`) in the catalogue module. See [Roles](/business/roles) for
who holds it.

## What starts it

A new family needs a catalogue entry, or an existing family needs another
released size.

## The steps

The product enforces a stricter order than "create three things": **an item
group's decodification master must be published before that group is offered
anywhere an item code is released against it.** Author the menu before the
size, not after.

### 1. Create the item group

`Master → Item Group Master → Add Item Group`. Pick a category, name the
family, and set its **prefix** (starts the item-code series) and **factor**
(what the codes vary by — line size, pressure range, length, …). The **model
prefix** auto-derives from the prefix; edit it only if it should differ.

![The Item Group Master list](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-01-item-group-list.png)

![The Add Item Group dialog, filled in for a new "Guide Demo Flowmeter" family](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-02-item-group-dialog.png)

The new group appears with its decodification master marked **Not authored**
and zero item codes — expected, since nothing has been built for it yet.

![The new item group in the list, decodification master "Not authored"](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-03-item-group-created.png)

### 2. Author the decodification master

`Master → Decodification Master → Add Master`, pick the item group just
created (only groups with **no** current master are offered), name it, and
you land in the block editor.

![The Add Decodification Master dialog](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-04-decodification-dialog.png)

Every master starts with one implicit block — there is no "add block"
control today, so everything is authored inside it. **Add row** offers four
kinds:

![The four row kinds: Section heading, Field, Select, Components](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-05-add-row-kinds.png)

Adding a **Select** row (searching the shared row library, or typing a new
label to create one) opens it empty in the inspector on the right:

![A freshly added "Flowtube MOC" row, no options yet](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-06-row-inspector-empty.png)

**Options and positional codes.** Every option comes from the shared option
library via **From library**; its code is auto-assigned (`C1`, `C2`, …) in
the order options are added to *that row* — there is no field to type a
custom code. This is what makes a code positional rather than global: adding
PTFE then SS 304 to Flowtube MOC gives SS 304 the code `C2` —

![Flowtube MOC with two options: PTFE = C1 (default), SS 304 = C2](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-07-flowtube-moc-options.png)

— while the very same SS 304 library value, added as the *first* option on a
different row (Process Connection MOC), gets `C1` there instead:

![Process Connection MOC with one option: SS 304 = C1](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-08-process-connection-options.png)

**Inherit**, without gating. A row's "Parent header" names one sibling row for
two independent things — Gate and Material — and either can be used alone.
Picking Flowtube MOC as Process Connection MOC's parent and setting Material
to "Flowtube MOC (itself)" makes this row's material follow the parent's,
while Gate stays off ("always shown"). The banner names any parent option
this row has no matching option for yet:

![Parent header set for Material inheritance; Gate still "always shown"; a banner flags PTFE has no match here](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-09-inherit-set.png)

Scoping the inheritance to one parent option reads back in plain language:

![Inherit scoped to "SS 304" only — "Applies only when the parent resolves to this option"](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-10-inherit-scoped.png)

**Gate**, with the safety check for "Not Applicable." A row can instead be
asked only once a parent is answered. Turning that on for a parent with no
option marked "Not Applicable" is caught immediately — it can never fire:

![Gate turned on ("only shown once answered") on a "Transmitter" parent with no N/A option — inline warning](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-11-gate-warning.png)

Marking the parent's "not needed" option **N/A** is what lets the gate work at
all:

![The "Transmitter Not Required" option on the Transmitter row, marked N/A](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-12-na-marked.png)

Back on the gated child, the warning is gone:

![The same gate, now valid — no warning](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-13-gate-resolved.png)

**Process factors** name which enquiry conditions (fluid, operating
temperature, operating pressure, density, …) a row should eventually be
judged against. There is no fixed vocabulary yet — it is a free-text chip
list, shared with autocomplete across every master:

![A "fluid" process-factor chip added to Flowtube MOC](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-14-process-factor.png)

**Publishing.** A master's blocks are immutable once published — editing them
again always writes a new version, reviewed as a diff before it is confirmed.
A metadata-only edit (name, active) saves immediately with no new version.

![The publish review dialog, listing every row added since the last version](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-15-publish-review.png)

![The list after publishing: v1, 4 fields, 6 options, Active](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-16-published.png)

**Known gap:** publishing a master does not, by itself, point the item group
at it — `decodificationMasterId` on the group has to be set separately, and
today there is no button in the Item Group dialog that does it. Until that
lands, an administrator sets it directly (`PATCH /products/item-groups/:id`).
Every family already in the catalogue was set up this way before this guide
was written.

### 3. Release an item code

Once the group has a current master, it is offered in `Master → Item
Master → Add Item`:

![The Item Master list](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-17-item-master-list.png)

Pick the item group, name the variant (`DN50`, a pressure range, …), and fill
in classification. **Item code** and **model number** both auto-compose from
the group's prefixes — item code from the prefix plus the next serial, model
number from the model prefix plus whatever the row defaults resolve to. HSN
is required once Goods Type is Finished.

![The Add Item dialog, fully filled in for DEMO-0001](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-18-item-master-dialog.png)

![The new item code in the list: DEMO-0001, DN50, Finished, HSN 9026](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-19-item-master-created.png)

### 4. Price a driver row in the Pricing Library

Pricing is not part of the group-before-master-before-code sequence above —
a row can be marked Driver and priced whenever it is ready, before or after
items are released against the group. A menu with real material choices
does not price itself: mark the row that should move price, choose how each
option is charged, then hand the actual rupee figures to the Pricing
Library.

**Marking Driver reveals a Priced by… control per option.** Opening a
select row — here, Flowtube MOC on the Guide Demo Flowmeter family used
throughout this guide — shows a **PRICE** control that starts with no
price impact:

![Flowtube MOC before pricing: PRICE unset, two options with no Priced by control](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-20-flowtube-before-driver.png)

Switching it to **Driver** saves immediately, and a **Priced by…** selector
appears next to every option on the row:

![Driver switched on: a Priced by… selector appears on both PTFE and SS 304](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-21-flowtube-driver-priced-by.png)

**Four charge methods, chosen per option, not per row** — the same row can
charge one option a flat amount and another by size:

![The Priced by… menu: Per option, Per unit measured, Rate table (two axes), Base variant](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-22-priced-by-options.png)

PTFE is set to **Per option** (a flat figure) and SS 304 to **Rate table
(two axes)** (one figure per size). Unlike marking Driver, a Priced by
choice is part of the row itself — it takes a new published version, the
same as any other coded-position change:

![The Publish as v2 review dialog, listing both Priced by changes](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-23-publish-v2-review.png)

**Entering the actual rupee amounts happens in the Pricing Library, not
here.** `Master → Pricing Library`, open the priced value, and its **By
item group** list shows every group that uses it. A group with a driver row
newly published but nothing priced yet reads "Nothing to price at this
version":

![PTFE's Pricing Library page: Guide Demo Flowmeter group expanded, Flowtube MOC unpriced](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-24-ptfe-pricing-unpriced.png)

Entering ₹450 against PTFE's **Per option** field prices it for every size
at once:

![₹450 entered and saved for PTFE against Flowtube MOC](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-25-ptfe-fixed-amount-saved.png)

SS 304's **Rate table** renders as a grid instead — rows are the item
group's driver rows, columns are its released sizes (here, just DN50, from
DEMO-0001 above). Clicking an empty cell opens a small amount field:

![SS 304's rate table: one unpriced cell for Flowtube MOC × DN50](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-26-ss304-rate-table-cell.png)

Saving it turns the group's price-coverage badge from **0/1 priced** to
**1/1 priced**:

![₹1,250 saved for SS 304 at DN50 — badge now reads 1/1 priced](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-27-ss304-rate-table-saved.png)

**Price coverage, back in Decodification Master.** Toggling **Show price
info** in the block editor adds a coverage bar across the whole master —
how many rows are drivers, inert, or still unreviewed:

![Show price info toggled on: 1 driver, 0 inert, 3 unreviewed rows](/blume-assets/content/content/business/workflows/setting-up-catalogue-data-28-price-coverage.png)

**Known gap:** as of this writing, a price entered in the Pricing Library
does not refresh the Priced by… control's own per-option hint back in
Decodification Master — PTFE and SS 304 both still read "no price set" and
"no size rates" there after saving real rates for both, confirmed directly
against the running app and the database (`option_rate` genuinely carries
both rows; only the row editor's hint is stale). Worth closing the next
time this area changes.

## What the business does here

- Name the family, author its option menu, then release sizes against it —
  in that order; the product will not let a size skip the menu.
- Keep codes positional: the same material can print a different code on
  every row it appears on, by design.
- Never edit a published version in place. A correction is a new version,
  reviewed before it goes live.
- Mark a row Driver and choose each option's charge method before it can be
  priced at all; enter the actual rupee figures in the Pricing Library, not
  in Decodification Master.

## Rules that apply

R32–R35 govern how this menu is later shown and resolved on a quotation
line. R59 governs how a saved price is overwritten (latest entry wins, no
approval). The group-before-master-before-code sequence itself is enforced
by the product (confirmed directly against the running app while writing
this guide) but is not yet a numbered rule in [Business rules](/business/business-rules) — worth
closing that gap the next time this area changes.

Related: [Item Group Master](/business/features/item-groups) ·
[Item Master](/business/features/item-master) ·
[Decodification Master](/business/features/decodification) ·
[Pricing Library](/business/features/pricing-library).
