Products model
The products model is your product catalog: discrete products or SKUs that can be tied to subscriptions and account metrics for multi-product reporting. Use it when a single account can buy multiple products and you need consistent product_id values across models.
Prerequisites
- Accounts model
- Optional but common: Subscriptions using the
productsJSON field; Account metrics when metrics are product-scoped
Field reference
Model key
| Property | Type | Description |
|---|---|---|
product_id | string | Stable product identifier across FunnelStory models. |
Default properties
| Property | Type | Description |
|---|---|---|
name | string | Display name. |
description | string | Optional longer description. |
Optional properties
| Property | Type | Description |
|---|---|---|
features | json | Array of the features that can be bought with this product. Not a default mapping — map a JSON column to a property named features. See Product features. |
Custom properties may be mapped for segmentation.
Product features
Each entry in features is an object:
| Field | Required | Description |
|---|---|---|
key | Yes | Lowercase letters, digits, and underscores, starting with a letter. Unique across every product in the workspace, because subscriptions and metrics refer to a feature by key alone. |
name | Yes | Display name. |
kind | Yes | capability (the account has it or doesn't, such as SSO) or amount (sold as a quantity with an allowance, such as API calls). |
metrics | No | Array of the account metric IDs that measure this feature. A metric that no feature lists stays a measure of the product. |
SELECT
'analytics' AS product_id,
'Analytics' AS name,
'[{"key": "analytics_reports", "name": "Reports", "kind": "capability", "metrics": ["reports_run"]},
{"key": "analytics_api_calls", "name": "API calls", "kind": "amount", "metrics": ["api_calls_made"]}]' AS features
If a row's features is unmapped or an empty list, the refresh leaves that product's stored features alone, so features defined on the Products catalog page survive. A non-empty list replaces them. A product row whose features are invalid — a malformed key, a key repeated within the product or already used by another product, a missing name, or an unknown kind — is skipped on refresh, and the product keeps its previous state.
Subscriptions grant these features; see Subscriptions → Feature entitlements.
Configure
- Add model → Product.
- Query your source of truth for product definitions (warehouse table, CRM product object, etc.).
- Map
product_id,name, anddescription, plusfeaturesif your source defines them. - Save and refresh.
- In subscriptions, ensure
productsJSON references these ids consistently. For account metrics, mapproduct_idwhen metrics are per product—see Account metrics.
Related
- Products catalog — view products and edit their features in the app
- Subscriptions
- Account metrics
- Data models overview