# Product Component

One line of what a product includes: another product, in a quantity, per period.

A Product Component is one line of what a Product includes: the whole, the part, a quantity and a unit. A program that includes Keyword Tracking, 30 per day, is one line; a kit that includes a part, 2 each, is another. Both the whole and the part are Products. The same table will hold a menu item's ingredients if Inventory migrates; there is no separate recipe or bundle table. BDS type: schema:TypeAndQuantityNode.

## Fields

| Field | Storage | Meaning |
| --- | --- | --- |
| Name* | Text | Typed as whole - part - quantity unit |
| Product* | Linked records | [Product](/systems/products/entity-product), the whole |
| Includes* | Linked records | [Product](/systems/products/entity-product), the part |
| Quantity* | Number | Whole number of the part per unit; for a range, the lower bound |
| Unit* | Single choice | each, per day, per week, per month, per quarter, per year |
| Notes° | Long text | What the deck or contract says that the quantity does not |
| Lifecycle Status* | Single choice | Draft, Active, Archived |
| Component Check | Formula | ⚠ fragments for missing or invalid inputs |
| Component (Name) | Formula | The part with its quantity and unit |
| Created At | Created time | When the line was created |
| Intake Step | Formula | Routes Draft or blank-status rows to their next creation step; blank for Active and Archived |
| Tags° | Linked records | [Tags (mirror)](/systems/products/entity-tags); optional |

Reference grid captured on 2026-10-28, before the intake views and label updates. Use the current view names in this guide.

[![Product Component grid: one line per part, with quantity and unit.](/systems/products/screens/products-component-grid.png)](/systems/products/screens/products-component-grid.png)

## Calculated rules

### Component Check

```text
IF(LEN({Product*} & "") = 0, "⚠ No product. ", "") &
IF(LEN({Includes*} & "") = 0, "⚠ Nothing included. ", "") &
IF(AND(LEN({Product*} & "") > 0, {Product*} & "" = {Includes*} & ""), "⚠ A product cannot include itself. ", "") &
IF({Quantity*} = BLANK(), "⚠ No quantity. ", "") &
IF(LEN({Unit*} & "") = 0, "⚠ No unit. ", "")
```

### Component (Name)

```text
IF(LEN({Includes*} & "") > 0, {Includes*} & " × " & {Quantity*} & " " & {Unit*}, "")
```

## Links and cardinality

Each line should link exactly one whole and one part. Both fields accept several records; Component Check flags blanks and the case where the linked whole and part read the same, not a line with two parts, a partial overlap or an indirect loop. On the products, the whole shows the line in Components and the part in Component Of.

## Intake routing

The creation intake uses these local formulas. Active and Archived records leave the routed steps; lifecycle changes remain manual.

### Intake Step

```text
IF(OR({Lifecycle Status*} = "Draft", {Lifecycle Status*} = BLANK()), IF(OR(LEN(TRIM({Name*} & "")) = 0, LEN({Product*} & "") = 0, LEN({Includes*} & "") = 0), "Create - 1", IF(OR(LEN({Quantity*} & "") = 0, LEN({Unit*} & "") = 0), "Create - 2", "Create - 3")), "")
```

## Lifecycle

[Create this record through the intake](/systems/products/intakes-and-checks).

New lines start as Draft. Active means the product includes this part today. Archived means it no longer does; keep the row because history may point at it. Name* is typed, so rewrite it after changing a link or the quantity.

## Example

Name* = Example Program - Keyword Tracking - 30 per day; Product* = Example Program; Includes* = Keyword Tracking; Quantity* = 30; Unit* = per day; Component (Name) = Keyword Tracking × 30 per day; Component Check blank.

## Next steps

[Compose a product](/systems/products/compose-product) · [All entities](/systems/products/entities)