---
id: ADR-PFM-MTD-005
title: Shared typed persistence for custom records
product_area: platform
module: metadata
revision: 1
status: proposed
design_intent: confirmed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: Platform owns runtime custom categories and persists their entries in shared record rows and typed property-value
  rows, with plain property keys.
constrains:
- DOM-PFM-MTD-004
- DOM-PFM-MTD-005
- SVC-PFM-MTD-custom-objects
- WF-PFM-MTD-005
origin: Custom objects architecture D-01, D-02, D-03 and D-05 (approved by Andrew 2026-10-18; services- platform:docs/milestones/PLAT-M5-custom-records.md#Decisions)
alternatives:
- option: Table-style values embedded on another record
  why_not: Such content would lack the independent identity, history and relationships needed for a custom register.
- option: Separate custom-record macroservice
  why_not: The approved architecture places this runtime configuration and storage in Platform.
- option: Dedicated table for each custom category
  why_not: Category configuration would require schema migrations rather than runtime definitions.
consequences:
- Activation supplies a dataset without deploying a per-object schema.
- Properties reuse shared custom-field conversion and validation.
- Supported numeric values carry scaled comparison shadows.
supersedes: []
evidence:
- 'services-platform at ad3f6a65: modules/custom-objects/**; docs/custom-objects.md; docs/proposals/custom-objects/09-decisions.md'
---

# Shared typed persistence for custom records

## Context

Organizations need independent records beyond the fixed application catalogue. Those entries need ordinary identity, querying, connections and history.

## Decision

Platform owns runtime custom categories and persists their entries in shared record rows and typed property-value rows, with plain property keys.

## Alternatives Considered

Table-style values embedded on another record: Such content would lack the independent identity, history and relationships needed for a custom register. Separate custom-record macroservice: The approved architecture places this runtime configuration and storage in Platform. Dedicated table for each custom category: Category configuration would require schema migrations rather than runtime definitions.

## Consequences

Activation supplies a dataset without deploying a per-object schema. Properties reuse shared custom-field conversion and validation. Supported numeric values carry scaled comparison shadows.
