Extensible Fields
The extensible fields system lets you attach typed custom attributes to any platform entity — without writing code or changing the schema. Tenant administrators define the fields they need, assign them to specific entity types, and start recording values immediately.
Overview
Different tenants deploy the platform for different purposes. A tenant managing vending machines needs different device attributes than one managing pool tables or showers. Rather than hard-coding fields for each use case, the extensible fields system provides a structured runtime extension mechanism.
The core idea is simple: administrators define a category (a named group of attributes), attach typed attribute definitions to it, assign that category to the relevant entity type, and then record values against individual entities.
No schema migrations, no code deploys — new fields appear as soon as they are configured.
Architecture
The system uses a four-part model:
| Component | Role |
|---|---|
| Category | A named group of related attributes. Categories are reusable across entity types. |
| Attribute | A single typed field definition within a category — name, data type, and optional validation. |
| Assignment | A link between a category and a specific entity type, optionally scoped to a subtype. |
| Value | The actual stored value for one attribute on one entity instance. |
Each layer is independent. The same category can be assigned to multiple entity types. Changing attribute definitions does not require touching existing values.
Data model
The extensible fields system exposes four views:
fnd_categories
Stores category definitions. Each category has a unique code within the tenant, a display name, and an entity type that constrains which kind of entity it can be assigned to.
| Column | Purpose |
|---|---|
category_id | Unique identifier |
category_code | Machine-readable code (e.g. DCM_VENDING) |
category_name | Display name |
entity_type | The kind of entity this category applies to (e.g. DCM_DEVICE) |
description | Optional description of what this category represents |
active | Whether the category is available for new assignments |
fnd_category_attrs
Stores attribute definitions within a category. Each attribute belongs to exactly one category and has a declared data type that controls storage and validation.
| Column | Purpose |
|---|---|
attr_id | Unique identifier |
category_id | The parent category |
attr_code | Machine-readable code within the category (e.g. MAX_SLOTS) |
attr_name | Display label |
data_type | Storage type: TEXT, NUMBER, DATE, BOOLEAN, or LOOKUP |
lookup_type | For LOOKUP attributes — the lookup type that constrains allowed values |
required | Whether a value must be provided |
default_value | Optional default applied when no value is recorded |
display_order | Sort position within the category |
fnd_category_assignments
Links a category to a specific entity type and optional subtype. An assignment is what makes a category's attributes available on a particular kind of entity.
| Column | Purpose |
|---|---|
assignment_id | Unique identifier |
category_id | The category being assigned |
entity_type | The entity type receiving this category (e.g. DCM_DEVICE) |
entity_subtype | Optional refinement — restricts the assignment to a specific subtype (e.g. VENDING_MACHINE) |
active | Whether the assignment is currently in effect |
fnd_category_values
Stores the actual field values. Each row records one attribute value for one entity instance. Values are stored in typed columns — the correct column is populated based on the attribute's declared data_type.
| Column | Purpose |
|---|---|
value_id | Unique identifier |
assignment_id | The category assignment that applies to this entity |
attr_id | The attribute being valued |
entity_id | The specific entity instance |
text_value | Value for TEXT and LOOKUP attributes |
number_value | Value for NUMBER attributes |
date_value | Value for DATE attributes |
boolean_value | Value for BOOLEAN attributes |
Each entity can have at most one value per attribute — the combination of entity_id and attr_id is unique.
Supported attribute types
| Data type | Stored in column | Typical use |
|---|---|---|
TEXT | text_value | Short strings, codes, free text |
NUMBER | number_value | Counts, measurements, quantities |
DATE | date_value | Timestamps, installation dates, expiry dates |
BOOLEAN | boolean_value | Flags, capability indicators |
LOOKUP | text_value | Constrained values from a lookup list |
LOOKUP attributes store the lookup value code in text_value. The human-readable meaning can be resolved by joining with the appropriate lookup values view.
Related topics
- How to configure extensible fields — step-by-step instructions for creating categories, defining attributes, assigning to entity types, recording values, and querying field data
- Lookups and Reference Data — lookup types used for
LOOKUP-typed attributes - Data Model Overview — common data patterns shared across all Foundation entities
- Labels — lightweight free-form tagging, complementary to typed extensible fields