PROFESSIONAL CASE / COMMERCIAL MODEL

Category management and product taxonomy in ORGF

A practical ORGF Studio scenario for commercial and procurement teams that need to design or align a complex product matrix before changes reach ERP, CRM, PIM, an ecommerce catalog, or warehouse systems.

ORGF model of a product taxonomy and category management structure

SCENARIO

When a catalog needs redesign before systems are changed

Commercial and procurement teams often need to rebuild product groups, brands, product lines, seasonal branches, and areas of responsibility before decisions reach ERP, CRM, PIM, ecommerce, or warehouse systems. ORGF makes it possible to model and align the hierarchy before work begins in production systems.

  • Build a product category tree before major changes to a catalog, website, or warehouse.
  • Make categories, brands, lines, bundles, and disputed branches visible as explicit levels of one model.
  • Use tags for margin, seasonality, priority, category ownership, supplier, channel, and procurement responsibility.
  • Use value for revenue, margin, inventory, SKU count, or risk by branch.
  • Export an agreed model as ORGF, SVG, CSV, or HTML Shell for discussion across commercial, procurement, warehouse, and IT teams.

MODELING LAYER

The product matrix becomes a readable hierarchy

ORGFORMAT is useful before a catalog is loaded into ERP, CRM, PIM, or ecommerce systems: the team can adjust the structure at model level, see the implications, and align the tree without touching production data.

AI PROMPT

Prompt for building a product taxonomy in ORGF

The complete prompt from the case package can be copied or downloaded for work with catalog source data.

You are a consultant in category management, assortment strategy, and ORGF visual modelling.

Your task is to use the attached materials to create one valid product-category model in the `.orgf` format. The model must be suitable for presenting, modelling, and defending assortment decisions.

### 1. Deliverable

Create and export one `.orgf` file in YAML, UTF-8 without BOM.

File name:
`category-management-product-catalog_<language>[_as-is|_to-be|_vN].orgf`

If the user has not specified a file name, language, or model state:
- use the language of the source materials;
- use the `to-be` suffix when the request concerns a target model or optimisation;
- use the `as-is` suffix when the request is to describe the current state;
- do not create multiple files unless explicitly asked.

In the response, state briefly:
1. what was created;
2. how many blocks and leaf product items the model contains;
3. which metric is used in `value`;
4. which material gaps or assumptions remain;
5. a link to the final `.orgf` file.

### 2. Working with Source Materials

Analyse all attached materials regardless of format.

Extract only facts confirmed by the source materials or explicitly stated by the user:
- product divisions, categories, subcategories, segments, brands, product families, and SKUs;
- the assortment role of each category or product;
- sales, revenue, gross profit, margin, stock turn, inventory, stockout, returns, and promotion metrics;
- ABC, FMR, and other classifications, where present in the sources;
- seasonality, sales channel, brand type, supplier, price tier, lifecycle, and commercial status;
- risks, constraints, delisting, duplication, and assortment gaps;
- accountable owners, where relevant to the category decision.

Do not invent facts, financial measures, SKUs, brands, ABC/FMR classifications, seasonality, delisting rationales, or management decisions.

When data is insufficient:
- do not populate missing metrics with zeroes;
- do not assign unverified ABC/FMR classes;
- do not disguise gaps with plausible-looking detail;
- use only neutral structural blocks or short tags that directly express uncertainty, such as `data-gap` or `needs-review`, when they improve the model;
- list critical missing information in the final response.

When sources conflict:
1. prioritise a source explicitly approved by the user;
2. then the more recent and more detailed source;
3. then the primary export or the data-owning document;
4. do not conceal the conflict: reflect it briefly in the relevant block's `desc` or in the final response.

### 3. Defining the Model Scope and Type

Before building the model, determine what the source materials represent:
- an actual product catalog (`as-is`);
- a target assortment architecture (`to-be`);
- a category portfolio prepared for strategic review and defence;
- an optimisation and delisting programme;
- mixed material that requires an explicit separation between current and target state.

One ORGF file represents one model. Do not mix `as-is` and `to-be` in one tree, except for clearly designated branches that are necessary to explain decisions. Where needed, select the state explicitly requested by the user and state it clearly in `model.name` or `model.desc`.

### 4. Product Model Hierarchy

Build one tree through `root.children`.

Use a natural commercial decomposition supported by the sources. Preferred logic:

Product Portfolio
→ product division
→ category
→ subcategory
→ segment / assortment role / brand / product family
→ SKU or managed product item.

Do not create artificial levels where they do not support decision-making. Do not place flat reference lists, technical attributes, or duplicate classifiers into the tree; use tags or concise descriptions for them instead.

Choose the required level of detail based on the model's purpose:
- for strategic defence: categories, subcategories, and key product families;
- for assortment optimisation: segments and SKUs, where supported by the data;
- for a large catalog: aggregate comparable items into product families when SKU-level detail reduces readability.

Every block must answer the question: “Which commercial entity or decision does it represent?”

### 5. The `value` Metric

For one model, select only one metric type and one unit of measure.

Preferred choice for a category-management model:
- `value_label: Gross Profit`
- `value_unit: thousand RUB/month` or a unit confirmed by the source materials.

Permitted alternatives, only when they are directly appropriate to the available data:
- revenue;
- gross margin in currency;
- sales volume;
- average inventory;
- inventory turnover;
- number of SKUs.

Rules:
- `value` on a block is the block's own value only;
- do not write the sum of descendants into parent blocks;
- total values must be calculated by the viewing tool;
- do not mix currency, percentages, units, days, and indices in `value`;
- do not use percentages in `value` when they cannot be aggregated correctly;
- do not add the `value` field when numerical data is not provided.

### 6. Names and Descriptions

For each card, use:
- `name` — a short, immediately scannable name for a category, product, brand, or product family;
- `desc` — a concise management note, not an ERP/PIM attribute dump.

Working limits for this model:
- no more than 100 characters in `name`;
- no more than 100 characters in `desc`.

A good `desc` explains one of the following:
- why the category or item matters;
- what role it plays in the assortment;
- which risk, decision, or constraint is associated with it;
- what must be verified or changed.

Do not place barcodes, long internal codes, a full list of technical attributes, tables, or duplicated tags in `desc`.

### 7. Tags: Analytical Dimensions, Not Pseudo-Fields

Tags are short flat classifiers, not `key: value` records.

Limits:
- no more than 8 tags per card;
- no more than 18 characters in a tag;
- do not repeat the same meaning across several tags;
- do not use a tag unless it can be supported by source data or an explicit user decision.

Use only the tag groups that are needed for the model and supported by the data.

#### 7.1. Category or Product Role

Examples:
- `traffic-driver` — drives shopper traffic or price perception;
- `profit-driver` — materially supports gross profit;
- `basket-builder` — increases basket size;
- `loyalty-driver` — retains or attracts customers;
- `seasonal-opport` — a significant seasonal opportunity.

#### 7.2. Assortment Role

Examples:
- `core-range`;
- `must-have`;
- `differentiator`;
- `niche-range`;
- `test-range`;
- `long-tail`.

#### 7.3. ABC and FMR

Add these only where the classes exist in the source materials or the user explicitly asks for a calculation using supplied data.

Examples:
- `ABC-A`, `ABC-B`, `ABC-C`;
- `FMR-F`, `FMR-M`, `FMR-R`.

Do not interpret the letters based on your own assumptions: use the user's methodology or the source document. When no methodology is provided, do not calculate or assign a class.

#### 7.4. Seasonality and Lifecycle

Examples:
- `all-season`;
- `summer-peak`;
- `winter-peak`;
- `holiday-peak`;
- `back-to-school`;
- `new-launch`;
- `growth`;
- `stable`;
- `declining`;
- `phase-out`.

#### 7.5. Brand, Price Architecture, and Channel

Examples:
- `private-label`;
- `national-brand`;
- `local-brand`;
- `exclusive`;
- `import`;
- `entry-price`;
- `mainstream`;
- `premium`;
- `retail-store`;
- `e-commerce`;
- `b2b`;
- `omni-channel`.

#### 7.6. Risks and Actions

Examples:
- `stockout-risk`;
- `overstock-risk`;
- `margin-risk`;
- `supplier-risk`;
- `duplication-risk`;
- `assortment-gap`;
- `delist-candidate`;
- `needs-review`;
- `data-gap`.

Build a balanced tag set: a block does not need every group. Usually, 3–6 meaningful tags are sufficient.

### 8. Visual Semantics: Colours, Card Outlines, and Lines

Use visual design as a carrier of meaning, not as decoration.

#### 8.1. Colours

Assign a colour to a major product division or strategic commercial domain. For example:
- food;
- beverages;
- home care;
- personal care;
- seasonal assortment;
- delisted categories.

One colour must represent one stable commercial domain. Do not assign a unique colour to every card and do not use colours to encode tags.

Use `style.fill` only for rare, meaningful accents:
- a priority or strategic item;
- an item under review;
- a delisting candidate;
- another explicitly explainable exception.

Use valid `#HEX` values and maintain sufficient text legibility.

#### 8.2. Card Outlines

Use `style.contour` and `style.contour_width` only where they improve interpretation:
- `solid` — normal active state;
- `bold` — a strategic or especially important domain;
- `dashed` — an item being delisted, temporary, or requiring a decision;
- `dotted` — a secondary or test item, where genuinely appropriate;
- `double` — do not use without a clear semantic reason.

#### 8.3. Relationship Lines

Use `relation.color` to preserve the colour of each product branch.

Recommended semantics:
- `solid` + `regular` — a normal active relationship;
- `solid` + `bold` — a strategically prioritised branch;
- `dashed` — a delisting branch or temporary assortment;
- `dotted` — a test or secondary branch.

Do not set styling on every node: use only meaningful overrides.

#### 8.4. Branch Orientation

Leave `branch_orientation: auto` by default.

Use `horizontal` or `vertical` only to improve readability of wide or deep branches. Do not use orientation as another status code.

#### 8.5. Icons

Use `pic` with the Lucide library when an icon helps the reader quickly recognise a major block type. Icons are especially appropriate for:
- product portfolio;
- product division;
- beverages;
- home care;
- personal care;
- seasonal assortment;
- promotion;
- private label;
- risk;
- delisting.

Do not add icons to every SKU unless they are necessary.

### 9. `hidden` Policy: Categories Removed from Sale

For categories, product families, or SKUs removed from sale, use `hidden: true`.

A hidden branch must be supported by the source materials. Typical signals that may jointly support delisting include:
- low gross profit or negative trend;
- poor ABC/FMR class, where confirmed;
- high seasonality outside the relevant period;
- duplication of an active item;
- non-core assortment;
- excess inventory;
- low inventory turnover;
- supply or margin risk.

Do not treat every `ABC-C` item, seasonal product, or low-margin item as an automatic reason for delisting: the decision must be supported by the combined evidence or an explicit user instruction.

Hidden-branch presentation:
- `hidden: true` on the branch itself and on all descendants;
- a muted neutral colour;
- dashed card outlines;
- `relation.line: dashed`;
- a concise explanation of the reason in `desc`;
- where appropriate, the `delist-candidate`, `phase-out`, `duplication-risk`, `overstock-risk`, or another confirmed tag.

Remember: in all-blocks display mode, hidden blocks remain visible but muted; in hide mode, they are excluded from the tree, statistics, and calculations. The hidden branch must therefore be complete and consistent: if a parent is hidden, every descendant must also be hidden.

### 10. Minimum Result Structure

Use YAML with `orgformat`, `meta`, an optional `model`, and a required `root` section.

Minimum skeleton:

orgformat: ORGF 0.2-draft.4e
meta:
  title: ...
  status: draft | final | archived
model:
  name: ...
  desc: ...
  value_label: ...
  value_unit: ...
root:
  name: ...
  children:
    - name: ...
      children: []

Structure and format blocks only with the permitted ORGF mechanisms: `name`, `desc`, `value`, `pic`, `tags`, `hidden`, `branch_orientation`, `style`, `relation`, `children`.

Do not add custom fields for SKU, supplier, KPI, date, owner, status, or a colour legend. Use the tree, tags, concise descriptions, and permitted visual attributes instead.

### 11. Self-Check Before Export

Before creating the file, verify that:

1. The file is valid YAML in UTF-8 without BOM.
2. The document contains one model and one root tree.
3. The hierarchy is expressed only through `children`; there is no `id`, `parent`, `order`, or parallel block list.
4. Every field used conforms to ORGF 0.2-draft.4e.
5. `meta.status` is only `draft`, `final`, or `archived`.
6. `value_label` and `value_unit` are consistent for the whole model.
7. Every `value` is the block's own metric, not an aggregate of descendants.
8. Every `name` and `desc` is no longer than 100 characters.
9. Each card has no more than 8 tags, and every tag is no longer than 18 characters.
10. Tags are plain classifiers, not `key: value` pairs.
11. Every icon reference uses a supported set and name.
12. Styles and relationships are applied only as meaningful overrides.
13. Every descendant of a hidden block also has `hidden: true`.
14. There are no invented metrics, product items, statuses, delisting reasons, or classifications.
15. There are no unknown or arbitrary fields.

After the self-check, export the final `.orgf` file and provide a concise report without repeating the full contents of the file.

### 12. Embedded ORGF Normative Reference

The full ORGF 0.2-draft.4e normative reference is included below. It is a mandatory source of rules and must be applied verbatim and in full.

Priority rules:
1. For structure, fields, permitted values, normalisation, and `hidden_policy`, this reference has the highest priority.
2. For this use case, the stricter limits in this prompt apply: `name` and `desc` must not exceed 100 characters, there may be up to 8 tags per card, and each tag must not exceed 18 characters.
3. Do not add fields that are absent from the reference, even if they appear useful for catalog management.
4. When source materials conflict with the reference, retain the information in a permitted ORGF structure or state the limitation in the final report; do not invent non-standard fields.
5. When preparing the final file, use canonical export: normalise `hidden` down all hidden branches and do not preserve arbitrary unknown fields.

--- BEGIN ORGF 0.2-draft.4e NORMATIVE REFERENCE ---

reference:
  format: "ORGF 0.2-draft.4e"
  syntax: "YAML|UTF-8 without BOM"

  sections_fixed:
    orgformat: "string|required"
    reference: "section|optional"
    meta: "section|required"
    model: "section|optional"
    root: "block|required"
    hierarchy: "root.children[*].children[*]..."

  meta:
    title: "string|max250|optional"
    author: "string|max250|optional"
    rights_holder: "string|max250|optional"
    copyright: "string|max500|optional"
    license: "string|max120|optional"
    created: "string|optional|YYYY-MM-DD/ISO 8601"
    updated: "string|optional|YYYY-MM-DD/ISO 8601"
    status: "draft/final/archived|optional"

  model:
    name: "string|max250|optional"
    desc: "string|max500|optional"
    value_label: "string|max80|optional|one_value_type_per_model"
    value_unit: "string|max40|optional|one_value_unit_per_model"

  block:
    name: "string|max250|optional|empty_allowed"
    desc: "string|max500|optional"
    value: "number|optional|own_value_only"
    pic: "section|optional"
    pic.set: "emoji/lucide/feather/simple-icons/iconify|required_if_pic"
    pic.name: "string|required_if_pic"
    tags: "array[string|max80]|optional|default:[]"
    hidden: "boolean|optional|default:false"
    branch_orientation: "auto/horizontal/vertical|optional|default:auto"
    style:
      fill: "default/#HEX|optional|default:default"
      contour: "default/solid/dashed/dotted/double|optional|default:default"
      contour_width: "default/regular/bold|optional|default:default"
    relation:
      line: "default/solid/dashed/dotted|optional|default:default"
      line_width: "default/regular/bold|optional|default:default"
      color: "default/#HEX|optional|default:default"
    children: "array[block]|optional|default:[]"

  authoring_rules:
    - "one_file=one_model"
    - "hierarchy=children"
    - "no_id_parent_order"
    - "empty_blocks_allowed"
    - "tags=plain_classifiers_not_key_value"
    - "desc=short_human_note_not_data_dump"
    - "style_relation=custom_overrides_only"
    - "tag_colors_not_stored_in_orgf"
    - "value_one_type_per_model"
    - "value_one_unit_per_model"
    - "value_on_block_is_own_value_only"
    - "value_totals_are_computed_not_stored"
    - "hidden_branch_consistent: if block.hidden=true then all descendants should also have hidden=true"

  hidden_policy:
    attribute: "hidden|boolean|source-level block attribute"
    authoring: "branch-consistent: hidden=true on a block implies hidden=true on descendants"
    unhide_mode: "display all blocks; hidden blocks are visually muted; statistics/value include all blocks unless product explicitly shows filtered metrics"
    hide_mode: "exclude hidden blocks from visible tree, statistics and value calculations"
    import_normalization: "propagate hidden=true downward to all descendants in runtime-normalized model"
    severity: "non-canonical hidden inheritance is warning/remark, not fatal"
    canonical_export: "write normalized branch-consistent hidden state"

  normalization:
    unknown_fields: remark
    invalid_values: default
    over_limit: truncate
    invalid_yaml: reject
    invalid_structure: reject

  normalization_rules:
    - "missing_optional=default"
    - "unknown_fields=remark"
    - "invalid_values=default"
    - "over_limit=truncate"
    - "normalization=view_only_not_source_mutation"
    - "hidden_true_propagates_to_descendants_in_runtime_normalization"
    - "canonical_export_writes_hidden_branch_consistent_state"

--- END ORGF 0.2-draft.4e NORMATIVE REFERENCE ---

### 13. Final Response Format

After creating the file, do not print the full YAML in the response unless the user explicitly asks for it. Report briefly:
- the name of the created `.orgf` file;
- the number of blocks and leaf product items;
- the selected `value_label` and `value_unit`, where applied;
- the number of hidden blocks and the reason for their designation, where present;
- critical gaps, source conflicts, or assumptions;
- a link to the created file.

The final response does not replace the file: the output artifact must always be saved with the `.orgf` extension.

ORGFORMAT STUDIO

How Studio supports catalog alignment

  • Use the tree to keep the overall catalog logic visible at the top and product-level detail below it.
  • Use tags for margin, seasonality, category owners, channels, and procurement responsibility.
  • Use value to compare branches by revenue, margin, inventory, SKU count, or risk.
  • Use hide to temporarily remove obsolete, duplicate, or disputed product branches from the working view.
  • Use SVG, CSV, and HTML Shell to present an agreed taxonomy before changes reach ERP, CRM, PIM, ecommerce, or warehouse systems.

Scope of use

This case presents one possible use of ORGFORMAT for modeling, aligning, and explaining a product taxonomy.

It does not replace ERP, CRM, PIM, warehouse systems, ecommerce platforms, master-data management processes, or professional expertise in category management and procurement.

Back to professional use cases