> ## Documentation Index
> Fetch the complete documentation index at: https://zenskar.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Products reference

<Note>
  This page is a field-level lookup. For task steps, see [how to add a product](/docs/20260301/product-modules/products/how-to-guides/add-a-product) and [how to manage products](/docs/20260301/product-modules/products/how-to-guides/manage-products). For the reasoning behind these fields, see [products: concepts](/docs/20260301/product-modules/products/concepts/products), [point in time: quantity](/docs/20260301/product-modules/products/concepts/product-type-point-in-time), and [period of time: quantity](/docs/20260301/product-modules/products/concepts/product-type-period-of-time).
</Note>

## Product fields

| Field                    | Description                                                                                                                     |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| Name                     | Name of the product or service, visible to customers                                                                            |
| Tax category             | Required for automated tax calculation. Without it, the product is treated as non-taxable or handled outside Zenskar            |
| Description              | Optional, customer-facing                                                                                                       |
| Product type             | Point in time or period of time. Locked once a pricing preset is attached                                                       |
| Subtype                  | Must be compatible with the product type, see table below                                                                       |
| Unit (singular / plural) | Labels shown on invoices, checkout, and the customer portal. Use the plural form for prices covering multiple units in a bundle |
| SKU                      | Internal identifier                                                                                                             |
| Slug                     | Optional reference to an external system. Supported by the API; not yet exposed in the dashboard's product form                 |
| Status                   | Active, inactive, or archived                                                                                                   |

## Type and subtype compatibility

| Product type   | Allowed subtypes                                                                  |
| -------------- | --------------------------------------------------------------------------------- |
| Point in time  | Quantity. Credits or custom currency is planned but not yet selectable, see below |
| Period of time | Quantity. On/off is planned but not yet selectable, see below                     |

Credits or custom currency and on/off are both on the roadmap. The subtype selector in the dashboard's product creation flow currently disables them, so quantity is the only subtype you can select for either product type today.

Point in time products are charged per event. Period of time products are charged for access or capacity held across a window. See [products: concepts](/docs/20260301/product-modules/products/concepts/products#types-point-in-time-vs-period-of-time) for why this split exists, and [how to add a product](/docs/20260301/product-modules/products/how-to-guides/add-a-product#phase-1-define-the-product) for where this choice is made.

## Product status

| Status   | Description                                                                                           |
| -------- | ----------------------------------------------------------------------------------------------------- |
| Active   | Default status. Marks a product as current                                                            |
| Inactive | Marks a product as not intended for new business. Existing contracts using the product are unaffected |
| Archived | End of life for a product. Cannot be set on creation                                                  |

```mermaid theme={null}
flowchart LR
    Start(["Product created"]) --> Active
    Active -->|"Blocked if any contract references the product"| Inactive
    Inactive -->|"Available again"| Active
    Active --> Archived
    Inactive --> Archived
```

Archiving is intended to be permanent. There is no supported way to move a product back to active or inactive once it's archived.

Status changes are currently API-only. The dashboard doesn't have status controls yet. See [how to change a product's status](/docs/20260301/product-modules/products/how-to-guides/manage-products#change-a-products-status) for the task steps.

## How product changes ripple into contracts and invoices

| Change                                      | Effect on contracts                                                                 | Effect on invoices                                                                                                           |
| ------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Name, description, SKU, slug, or unit label | Reflected on next read, no recomputation needed                                     | Future invoices show the updated value. Finalized invoices are unaffected                                                    |
| Status to inactive                          | Blocked if any contract references the product. Existing contracts continue working | No impact on existing invoices                                                                                               |
| Status to archived                          | Existing contracts continue working unchanged                                       | No impact on finalized invoices                                                                                              |
| Type change                                 | Blocked once any pricing preset exists                                              | Not applicable: type can only change before a product has any pricing preset, so there's never existing pricing to reconcile |

An already-created pricing preset is the one thing that can't be edited or removed once created (see [What is not yet supported](#what-is-not-yet-supported)), only added to. Contracts and invoices reference a product by ID rather than copying its fields, which is why the changes above are visible to contracts and invoices immediately, without any recomputation step.

The dashboard's product creation flow requires a pricing preset and a usage-tracking configuration in the same flow, so a product created from the dashboard always has pricing attached from the start. The API is more permissive: product creation and pricing creation are separate calls, so an API-created product can exist with no pricing at all until a preset is explicitly attached. The type-change restriction described above only applies once a pricing preset exists: for an unpriced product, type is still open.

## Pricing presets

A product can carry more than one pricing preset. One preset per product can be marked default, which is the one used when the product is added to a contract, unless a different preset is explicitly selected for that contract.

A pricing preset is defined in two parts: the rate itself, and how usage is tracked to determine the quantity that rate applies to.

### Rate fields

| Field          | Description                                                        |
| -------------- | ------------------------------------------------------------------ |
| Pricing model  | Per unit, volume, or tiered                                        |
| Currency       | Based on the currencies supported by the product's business entity |
| Price per unit | The rate for the per unit model, or the relevant tier/volume rate  |
| Tax behavior   | Whether the price is tax-inclusive or tax-exclusive                |

### Usage tracking fields

| Field                   | Description                                                                          |
| ----------------------- | ------------------------------------------------------------------------------------ |
| Usage is metered        | Toggle. Determines quantity source, see below                                        |
| Meter                   | Required if usage is metered. The aggregate that tracks usage for this product       |
| Quantity strategy       | On demand or recurring, available for both point in time and period of time products |
| Partial period handling | Prorate or charge full. Only applies when quantity strategy is recurring             |

### Quantity source vs. quantity type

These are two independent axes, easy to conflate since the UI presents them close together:

| Axis            | Options              | What it governs                                                                                       |
| --------------- | -------------------- | ----------------------------------------------------------------------------------------------------- |
| Quantity source | Fixed, metered       | Whether the quantity is declared explicitly, or tracked from usage through a meter                    |
| Quantity type   | On demand, recurring | Whether the billing relationship is a single, non-renewing instance, or continues period after period |

Both point in time and period of time products support on demand and recurring quantity types.

On demand is not equivalent to a "one-off invoice." A one-off invoice is a contract set up to produce a single invoice ever, a separate, invoice-level construct that Zenskar's v3 does not support. On demand and recurring both still get invoiced on whatever cadence the contract specifies; the distinction is about whether the billing relationship renews on its own, not about invoice count.

See [how to add a product: phase 3](/docs/20260301/product-modules/products/how-to-guides/add-a-product#phase-3-define-how-usage-is-tracked) for the step-by-step flow, and [point in time: quantity](/docs/20260301/product-modules/products/concepts/product-type-point-in-time) or [period of time: quantity](/docs/20260301/product-modules/products/concepts/product-type-period-of-time) for how this axis plays out differently by product type.

## Deletion behavior

A product cannot be deleted while any contract still references it. Deleting a product soft-deletes its pricing presets along with it. Already-finalized invoices retain their historical data regardless, since the underlying records are kept for audit purposes even after deletion.

Deletion is currently API-only. There's no delete action in the dashboard yet.

See [how to delete a product](/docs/20260301/product-modules/products/how-to-guides/manage-products#delete-a-product) for the task steps, and [products: concepts](/docs/20260301/product-modules/products/concepts/products#deletion-is-permanent-but-contract-references-hold-it-back) for why deletion works this way.

## Tax configuration

Tax identity is attached to the product, not the contract, since the product is the SKU that determines the applicable tax category. Each product carries a tax code. Pricing presets separately specify whether the price is tax-inclusive or tax-exclusive. Zenskar combines the product's tax category with the pricing's tax nature to determine the applicable tax rate and value for invoicing.

Tax rates are managed at the organization level, under sales tax settings, and can pull from Avalara or be managed manually for geographies where Avalara is not used.

## What is not yet supported

* Product groups and bundles.
* Editing or deleting an already-created pricing preset. Pricing can only be added, not changed or removed, once created.
* Custom attributes on the product schema are supported in the data model, but not yet exposed in the contract or product UI.
* Changing a product's status, or deleting a product, from the dashboard. Both are available today only through the API.
