BDS0.1

Product Component

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

Reviewed 2026-11-04Markdown

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, the whole
Includes* Linked records 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); 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.

Calculated rules

Component Check

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)

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

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

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.

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 · All entities