# Price List

A named set of offers for one channel, customer group or period; it groups prices, it holds none.

A Price List is a named set of offers for one channel, customer group or period. The prices live on each offer. Its seller and currency are derived from those offers, never stored. A price change is a new list with new dates, not an edit of an old one. BDS type: schema:OfferCatalog.

## Fields

| Field | Storage | Meaning |
| --- | --- | --- |
| Name* | Text | Audience and year, as a seller says it |
| Sales Channel° | Single choice | Direct, Wholesale, Online, Marketplace; blank means every channel |
| Valid From° | Date | First day the list applies |
| Valid Through° | Date | Last day; blank means still current |
| Is Default° | Checkbox | Sellers start from this list when the client has none |
| Lifecycle Status* | Single choice | Draft, Active, Archived |
| Offers | Linked records | [Offers](/systems/products/entity-offer) that link this list; set from the offer |
| Seller (from Offers) | Rollup | Distinct sellers of the linked offers |
| Currency (from Offers) | Rollup | Distinct currencies of the linked offers |
| List Check | Formula | ⚠ fragments for mixed sellers, mixed currencies or no offers |
| Currency - OLD | Single choice | Retired 2026-09-23; nothing reads it |
| Owner - OLD | Linked records | Retired 2026-09-23; nothing reads it |
| Created At | Created time | When the row was created |
| Created by | Created by | Who created it |
| 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.

[![Price List grid: seller and currency are derived from the linked offers.](/systems/products/screens/products-price-list-grid.png)](/systems/products/screens/products-price-list-grid.png)

## Calculated rules

### List Check

```text
IF(FIND(" | ", {Seller (from Offers)} & "") > 0, "⚠ Offers from more than one seller. ", "") &
IF(FIND(" | ", {Currency (from Offers)} & "") > 0, "⚠ Offers in more than one currency. ", "") &
IF(LEN({Offers} & "") = 0, "⚠ No offers on the list. ", "")
```

The two rollups read Seller* and Price Currency* of every linked offer. Their descriptions say they return distinct values joined with a bar; confirm the aggregation formula in each rollup's field settings.

## Links and cardinality

One list has many offers. An offer should belong to at most one list, but Price List° on the offer accepts several. Is Default° should be checked on exactly one active list per channel and currency; nothing checks it.

## 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(LEN(TRIM({Name*} & "")) = 0, "Create - 1", "Create - 2"), "")
```

## Lifecycle

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

Draft while it is being assembled, Active while sellers quote from it, Archived when a newer list replaced it. Set Valid Through° before archiving.

## Example

Name* = Direct - 2026; Sales Channel° = Direct; Is Default° checked; Lifecycle Status* = Active; three offers; Seller (from Offers) shows one company; Currency (from Offers) = USD; List Check blank.

## Next steps

[Manage price lists](/systems/products/manage-price-lists) · [All entities](/systems/products/entities)