Custom fields and the dimensional substrate
The dimensional substrate lets a tenant extend selected pillar records with versioned custom-field declarations. Pillars keep ownership of their native tables and business rules; the substrate supplies a shared declaration, validation, query, and migration contract.
Current extensible records
The physical baseline includes contacts, companies, activities, Commerce orders, products, fulfillments, and marketing campaigns. Journal entries, journal lines, balances, and accounting periods are explicitly closed to custom fields.
Supported field types are text, rich text, number, money, date, boolean, picklist, multi-select, reference, and formula. Write validation enforces declared names, types, options, bounds, required values, and formula immutability.
Selected scalar fields can be promoted to typed generated columns with indexed: true; each schema may promote at most eight. Formula fields are implemented and classified for in-row or materialized evaluation according to their expression.
Schema lifecycle
An authenticated integration submits the complete proposed schema to POST /api/entity-schema. Additive changes activate directly. Breaking changes preserve the prior version and activate a new one, followed by the explicit idempotent /api/entity-schema/backfill migration.
There is no current tenant settings page or MCP schema-declaration tool. Agents can query and update values after a schema exists through inblack_query_records and inblack_update_record.
Commerce product-group field definitions remain a separate catalog system and do not synchronize with substrate declarations. See Custom fields: overview before choosing a path.