Product attributes
Route: /org/inventory/attributes · Module: org_inv_attributes — 6 permissions
Permission to view: View Product atributes
This module is org_inv_attributes, but its permissions are all
org.inventory.prodcat.attribute.* — under the product category prefix, not an attributes
one. The permission to grant is View Product atributes. See
Permissions.
1. What a product attribute is
A reusable option set. Spice Level is an attribute; Mild, Medium, Hot, Extra Hot are its values. Attributes are defined once here and then used across many products.
They exist to produce variations. A product with a Serving Size attribute of Single / Half / Full has three sellable rows, each with its own SKU and price.
| Attribute | Category | Unit | |
|---|---|---|---|
| Answers | Which version of this product? | What kind of thing is this? | How is it counted? |
| Structure | Flat list of values | A nested tree | A single code |
| Customer sees | The variation selector | Navigation | "6 Pieces" |
2. How attributes spread through the application
| Surface | Uses attributes to |
|---|---|
| Product editor | Bind values to each variation |
| Variations | Distinguish one sellable row from another |
| Storefront product page | Render the option selector a customer picks from |
| External API | Expose the option set under inventory:config:read |
3. Step by step
Step 1 · Read an existing attribute
Each card carries four things.
The name is what staff read. The technical code beneath it — cooking_method — is the
stable identifier used by analytics and the API.
The description explains the attribute's purpose to whoever picks values later.
The chips are the attribute's values, in order.
Renaming Cooking Method to Preparation changes the label everywhere. The code cooking_method
stays, and it is what an API consumer or a report is matching on. Change the code only if you are
prepared to update those.
Step 2 · Create an attribute
Create Attribute opens a right-hand drawer.
Attribute Name and Technical Code — the code's helper text says "Technical identifier used
for analytics", and the placeholder suggests the convention: spice_lvl, lower snake case.
The Active toggle defaults on.
Attribute Values starts empty — "No values defined yet." — with Add the first value.
Step 3 · Add values
Add Value appends a row; the counter beside the section heading tracks how many. The helper line states the intent plainly: "Values define the options available for this attribute (e.g., Red, Blue for Color)."
It saves happily, appears in the library, and produces no variations — because there is nothing to choose between. An attribute is only useful once it has at least two values.
Step 4 · Use it on a product
Attributes are not assigned to products on this screen. Binding happens in the product editor, per variation.
4. Field reference
| Field | Type | Required | Notes |
|---|---|---|---|
| Attribute Name | text | ✅ | The staff-facing label |
| Technical Code | text | ✅ | Lower snake case by convention. Used by analytics and the API |
| Active | toggle | — | Defaults on. Inactive attributes are not offered on new variations |
| Description | textarea | — | Shown on the card |
| Attribute Values | repeating rows | — | Added one at a time; the count shows beside the heading |
Language Context
English · Bengali · Hindi, in the header. As on the other master-data screens, it selects which stored translation is displayed rather than translating anything.
5. The admin contract
| Must be true | Or else |
|---|---|
| A project is selected | The library renders empty |
| The role holds View Product atributes | The screen is not reachable |
| The attribute has ≥ 1 value | It produces no variations |
The attribute is Active | It is not offered on new variations |
6. Downstream — what changes when this changes
| Change | Effect |
|---|---|
| Rename the attribute | Label changes everywhere, including the storefront selector |
| Change the technical code | Analytics and API consumers matching on the old code stop matching |
| Add a value | Available immediately for new variations; existing variations unchanged |
| Remove a value | Variations already bound to it keep their binding |
| Deactivate | Existing variations unaffected; not offered for new ones |
7. Don't confuse this with…
| Categories | Classify products against each other. Attributes distinguish variants within a product |
| Variations | The sellable row that results from attribute values |
| Tags | Free labels on a product, used for filtering only |
8. Troubleshooting
| Symptom | Cause |
|---|---|
| Library is empty | No project selected |
| A role with "attributes" permissions sees nothing | The prefix is prodcat.attribute.* — see the warning at the top |
| The attribute produces no variations | It has no values |
| A value is missing from the variation editor | The attribute is inactive, or the value was added after the variation was built |
| Deleting an attribute is refused | DELETE is gated on prodcat.attribute.**edit**, not .delete — the .delete permission is never checked. See Permissions |