Screens

Every screen below was generated from this object by OODS Foundry 0.10.1, in React and Vue, and shows the calls that made it and its content hash. Each runs as its generated app runs, in this site's brand, Aquex, in the theme you choose, with the sample records this object's own file carries. A value no record gives shows as a neutral one, such as an empty value or "Not recorded"; OODS Foundry invents none.

React app · sample recordsMaturity: betasha256:f4f2cc8d1be5…Open full size: Plan detail screen generated by OODS Foundry in React

What design_compose reported for every screen here:

  • OODS-V121 Object 'Plan' has maturity 'beta' — composed output may change.

For this screen it also reported:

  • OODS-V122 Object "Plan" has a single trait category group for context "detail". Consider using a single-section layout instead of tabs.
The calls that made the Plan detail apps, in React and Vue
3 calls, as the pipeline sent them
design_compose {
  "object": "Plan",
  "context": "detail",
  "preferences": {
    "brand": "Aquex",
    "theme": "light"
  }
}

code_generate {
  "schemaRef": "compose-c0aaeb96",
  "framework": "react",
  "profile": "build",
  "options": {
    "output": "application",
    "brand": "Aquex",
    "theme": "light",
    "payloadMode": "file"
  }
}

code_generate {
  "schemaRef": "compose-c0aaeb96",
  "framework": "vue",
  "profile": "build",
  "options": {
    "output": "application",
    "brand": "Aquex",
    "theme": "light",
    "payloadMode": "file"
  }
}

The React app's content hash: sha256:f4f2cc8d1be59cb335282752a07ca695c5182d16f760cd07c59d988f983701e6. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css

The Vue app's content hash: sha256:2d09ebfe461e4d4532f5ed92901bcf13189ff24ac49197bee2fc946b38a29541. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css

Fields

FieldTypeDescription
plan_coderequired string Provider specific identifier for the plan or price.
plan_namerequired string Human readable plan label rendered in list and detail contexts.
billing_intervalrequired string Billing cadence name selected from supportedIntervals.
interval_count integer Multiplier for interval (ex: 12 with monthly => yearly cadence).
amount_minorrequired integer Contract value expressed in minor currency units.
currencyrequired string ISO 4217 currency for the plan price.
trial_period_days integer Length of introductory trial period in days.
collection_method string How billing is collected (charge_automatically, send_invoice).
billing_anchor_day integer Day of month used to anchor renewals when prorating.
pricing_model string Price strategy (flat, per_unit, tiered, package).
meter_namerequired string Friendly metered feature name shown in UI (ex: Analytics Seats).
included_quantityrequired integer Quantity included in base plan before overages.
consumed_quantityrequired integer Actual quantity consumed in the active period.
unit_labelrequired string Label for display, defaults to the unit parameter.
period_startrequired date Date the usage accumulation window began.
period_endrequired date Date the usage accumulation window ends.
rollover_strategy string Strategy for unused units (inherits rolloverStrategy parameter).
overage_rate_minor integer Cost per additional unit expressed in minor currency units.
projected_overage_minor integer Forecasted overage spend derived from consumption trends.
samples UsageSample[] Rolling usage measurements for charts or anomaly detection.
owner_idrequired string Identifier of the owning principal scoped by owner_type.
owner_typerequired string Categorical owner type sourced from the ownerTypes parameter.
ownership_role string Optional role name describing how the owner governs the entity.
ownership_transferred_at datetime Timestamp recording when ownership was last transferred.
plan_idrequired string Stable identifier for the plan within the billing domain.
product_familyrequired string High level product family grouping for analytics and reporting.
statusrequired string (active, deprecated, private_beta, legacy) Availability state of the plan (active, deprecated, private_beta).
feature_matrix FeatureDescriptor[] Array of feature descriptors listing entitlement tiers.
add_on_ids string[] Identifiers for add-ons commonly sold with this plan.
upgrade_targets string[] Plans presented as upgrade destinations.
downgrade_targets string[] Plans that can be downgraded to from this plan.
notes string Internal commentary for packaging or finance teams.
owner_name string Display name of the team that owns the plan.

Traits

Each trait adds fields and behaviour. Every object with the trait gets the same.

Relationships

These arrows show declared relationships between object types. They don't join live records.

  • Plan, many-to-many, via upgrade_targets
  • Plan, many-to-many, via downgrade_targets
Relationships: Plan1 object types and 2 declared associations. Arrows point from source to target. Labels state source-relative cardinality and the via field; they do not assert live referential integrity. Plan to Plan: Downgrade destinations, many-to-many, via downgrade_targets. Plan to Plan: Upgrade destinations, many-to-many, via upgrade_targets.Downgrade destinationsmany-to-manyvia downgrade_targetsUpgrade destinationsmany-to-manyvia upgrade_targetsNormalized plan definition capturing pricing, packaging, and entitlement metadata.PlanTraits: SaaSBillingBillable,SaaSBillingMetered, OwnerableKey fields (6 of 33)plan_id: string *plan_name: string *downgrade_targets: string[]upgrade_targets: string[]product_family: string *status: string *

The object file

The Plan object definition in YAML: domains/saas-billing/objects/Plan.object.yaml
object:
  name: Plan
  version: 1.0.0
  domain: saas.billing
  description: Normalized plan definition capturing pricing, packaging, and entitlement metadata.
  tags:
    - billing
    - plan
    - packaging

traits:
  - name: SaaSBillingBillable
    alias: Pricing
  - name: SaaSBillingMetered
    alias: IncludedUsage
    parameters:
      unit: seats
      rolloverStrategy: none
      sampleWindowDays: 30
  - name: structural/Ownerable
    alias: PlanOwnership

schema:
  plan_id:
    type: string
    required: true
    description: Stable identifier for the plan within the billing domain.
  product_family:
    type: string
    required: true
    description: High level product family grouping for analytics and reporting.
  status:
    type: string
    required: true
    description: Availability state of the plan (active, deprecated, private_beta).
    validation:
      enum:
        - active
        - deprecated
        - private_beta
        - legacy
  feature_matrix:
    type: FeatureDescriptor[]
    required: false
    description: Array of feature descriptors listing entitlement tiers.
    default: []
  add_on_ids:
    type: string[]
    required: false
    description: Identifiers for add-ons commonly sold with this plan.
    default: []
  upgrade_targets:
    type: string[]
    required: false
    description: Plans presented as upgrade destinations.
    default: []
  downgrade_targets:
    type: string[]
    required: false
    description: Plans that can be downgraded to from this plan.
    default: []
  notes:
    type: string
    required: false
    description: Internal commentary for packaging or finance teams.
  owner_name:
    type: string
    required: false
    description: Display name of the team that owns the plan.

semantics:
  plan_id:
    semantic_type: billing.plan.id
    token_mapping: tokenMap(billing.plan.id)
  # The one-line summary under the plan's name in lists: the product family it belongs to.
  product_family:
    semantic_type: text.summary
    token_mapping: tokenMap(billing.plan.product_family)
  # structural/Ownerable's owner reference, named by owner_name.
  owner_id:
    semantic_type: ownership.owner.id
    token_mapping: tokenMap(ownership.owner.id)
    ui_hints:
      component: OwnerReference
      ownerTypeField: owner_type
      displayLabelField: owner_name
  status:
    semantic_type: billing.plan.status
    token_mapping: tokenMap(billing.plan.status)
  feature_matrix:
    semantic_type: billing.plan.feature_matrix
    token_mapping: tokenMap(billing.plan.feature_matrix)
  add_on_ids:
    semantic_type: billing.plan.add_on_ids
    token_mapping: tokenMap(billing.plan.add_on_ids)
  upgrade_targets:
    semantic_type: billing.plan.upgrade_targets
    token_mapping: tokenMap(billing.plan.upgrade_targets)
  downgrade_targets:
    semantic_type: billing.plan.downgrade_targets
    token_mapping: tokenMap(billing.plan.downgrade_targets)
  notes:
    semantic_type: billing.plan.notes
    token_mapping: tokenMap(billing.plan.notes)

tokens:
  billing.plan.id: "var(--cmp-text-strong)"
  billing.plan.status: "var(--cmp-badge-text-info)"
  billing.plan.product_family: "var(--cmp-text-subtle)"

metadata:
  owners:
    - product@oods.systems
    - pricing@oods.systems
  maturity: beta
  references:
    - R13.5 Canonical Model: Subscription and Invoice

# Authored type associations; no record join or referential-integrity claim.
relationships:
  - target: Plan
    via: upgrade_targets
    cardinality: many-to-many
    label: Upgrade destinations
  - target: Plan
    via: downgrade_targets
    cardinality: many-to-many
    label: Downgrade destinations

# Eight authored sample plans: the price book the sample subscriptions are on (their plan_code), plus a deprecated, a
# legacy and a private-beta plan. Prices are list prices in US dollars; the period is the price book the price belongs
# to, and each plan is owned by the team that prices it.
samples:
  - plan_id: plan_starter_monthly
    plan_code: starter-monthly
    plan_name: Starter
    product_family: Workspace plans
    status: active
    billing_interval: monthly
    interval_count: 1
    amount_minor: 1900
    currency: USD
    trial_period_days: 0
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Seats
    included_quantity: 3
    overage_rate_minor: 500
    period_start: '2026-01-01'
    period_end: '2026-12-31'
    upgrade_targets: [team-monthly]
    downgrade_targets: []
    add_on_ids: []
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: Entry plan for single-location shops.
  - plan_id: plan_team_monthly
    plan_code: team-monthly
    plan_name: Team
    product_family: Workspace plans
    status: active
    billing_interval: monthly
    interval_count: 1
    amount_minor: 4900
    currency: USD
    trial_period_days: 14
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Seats
    included_quantity: 10
    overage_rate_minor: 500
    period_start: '2026-01-01'
    period_end: '2026-12-31'
    upgrade_targets: [business-monthly]
    downgrade_targets: [starter-monthly]
    add_on_ids: [analytics-addon-monthly]
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: Most trials start here.
  - plan_id: plan_business_monthly
    plan_code: business-monthly
    plan_name: Business
    product_family: Workspace plans
    status: active
    billing_interval: monthly
    interval_count: 1
    amount_minor: 14900
    currency: USD
    trial_period_days: 14
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Seats
    included_quantity: 25
    overage_rate_minor: 400
    period_start: '2026-01-01'
    period_end: '2026-12-31'
    upgrade_targets: [enterprise-annual]
    downgrade_targets: [team-monthly]
    add_on_ids: [analytics-addon-monthly]
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: Upgrades from Team are prorated and charged at once.
  - plan_id: plan_team_annual
    plan_code: team-annual
    plan_name: Team (annual)
    product_family: Workspace plans
    status: deprecated
    billing_interval: annual
    interval_count: 1
    amount_minor: 49000
    currency: USD
    trial_period_days: 14
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Seats
    included_quantity: 10
    overage_rate_minor: 500
    period_start: '2025-01-01'
    period_end: '2025-12-31'
    upgrade_targets: [business-monthly]
    downgrade_targets: [team-monthly]
    add_on_ids: []
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: No longer sold; annual Team customers renew monthly from January 2026.
  - plan_id: plan_enterprise_annual
    plan_code: enterprise-annual
    plan_name: Enterprise
    product_family: Workspace plans
    status: active
    billing_interval: annual
    interval_count: 1
    amount_minor: 1200000
    currency: USD
    trial_period_days: 30
    collection_method: send_invoice
    pricing_model: flat
    meter_name: Seats
    included_quantity: 250
    overage_rate_minor: 300
    period_start: '2026-01-01'
    period_end: '2026-12-31'
    upgrade_targets: []
    downgrade_targets: [business-monthly]
    add_on_ids: [analytics-addon-monthly]
    owner_id: team_enterprise_sales
    owner_type: team
    owner_name: Enterprise sales
    notes: Invoiced yearly on net 30 terms; includes premium support.
  - plan_id: plan_analytics_addon_monthly
    plan_code: analytics-addon-monthly
    plan_name: Analytics add-on
    product_family: Add-ons
    status: active
    billing_interval: monthly
    interval_count: 1
    amount_minor: 3900
    currency: USD
    trial_period_days: 0
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Dashboards
    included_quantity: 20
    overage_rate_minor: 200
    period_start: '2026-01-01'
    period_end: '2026-12-31'
    upgrade_targets: []
    downgrade_targets: []
    add_on_ids: []
    owner_id: team_analytics
    owner_type: team
    owner_name: Analytics product
    notes: Sold with Team, Business and Enterprise.
  - plan_id: plan_pro_monthly_2025
    plan_code: pro-monthly
    plan_name: Pro
    product_family: Workspace plans
    status: legacy
    billing_interval: monthly
    interval_count: 1
    amount_minor: 9900
    currency: USD
    trial_period_days: 0
    collection_method: charge_automatically
    pricing_model: flat
    meter_name: Seats
    included_quantity: 15
    overage_rate_minor: 500
    period_start: '2025-01-01'
    period_end: '2025-12-31'
    upgrade_targets: [business-monthly]
    downgrade_targets: [team-monthly]
    add_on_ids: []
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: Closed to new customers in October 2025; every Pro subscription moved to Business by April 2026.
  - plan_id: plan_business_plus_monthly
    plan_code: business-plus-monthly
    plan_name: Business Plus
    product_family: Workspace plans
    status: private_beta
    billing_interval: monthly
    interval_count: 1
    amount_minor: 24900
    currency: USD
    trial_period_days: 14
    collection_method: charge_automatically
    pricing_model: per_unit
    meter_name: Seats
    included_quantity: 50
    overage_rate_minor: 350
    period_start: '2026-09-01'
    period_end: '2026-12-31'
    upgrade_targets: [enterprise-annual]
    downgrade_targets: [business-monthly]
    add_on_ids: [analytics-addon-monthly]
    owner_id: team_pricing
    owner_type: team
    owner_name: Pricing and packaging
    notes: Invite-only beta for multi-location retailers.