12 KiB
ADR-023: Commercial Platform Foundation (Business Bundles, Pricing, Subscriptions)
| Field | Value |
|---|---|
| Status | Accepted |
| Date | 2026-07-28 |
| Deciders | Platform Architecture |
| Supersedes | — |
| Superseded by | — |
| Extends | ADR-020, ADR-021, ADR-003, ADR-008 |
Context
Product Integration Wave 1 introduced a frontend-only commercial bundle catalog (frontend/lib/business-bundles.ts). Payment defines service-local L2 bundles (ADR-021). Experience, Hospitality, and other services similarly use service-owned capability packs.
Without a platform-level commercial abstraction:
- Bundle definitions drift between React, Payment, and verticals.
- Pricing is mixed into marketing copy or service schemas.
- Subscription, license, and entitlement semantics diverge across Identity, Core, Payment, and Accounting.
- Business-type recommendations cannot be governed as contracts.
- Activation of a tenant workspace cannot be sequenced as durable, cross-service events.
The platform needs a Commercial Foundation: architecture and contracts only — no engines, migrations, or product modules in this decision.
Decision
- Introduce Business Bundle Architecture as a platform concept owned by Core Platform commercial layer — not frontend-only, not Payment-only, not Experience-only.
- Canonical aggregates (logical; no schema authorized by this ADR alone):
BusinessBundleDefinitionBusinessBundleVersionBusinessBundleServiceBusinessBundleModuleBusinessBundleFeatureBusinessBundlePricingReference(opaque refs only — pricing does not live inside bundles)BusinessBundleRecommendationRuleBusinessBundleVisibilityBusinessBundleLifecycleBusinessBundleMetadata
- Introduce an independent Pricing Catalog (monthly, yearly, usage, trial, promotional, enterprise quote; future regional/tax/coupon/discount/reseller) as separate contracts.
- Introduce Subscription contracts (
Subscription,SubscriptionPlan,SubscriptionItem,SubscriptionLicense, status/period/renewal/cancellation/grace) owned commercially by Core — Payment may later attach billing shells via existing reserved contracts; Payment does not own platform subscription lifecycle. - Introduce License & Entitlement contracts (service / module / feature entitlement, quota, usage limits, capability flags, tenant visibility) integrating Identity, Payment, Accounting, Experience, CRM, Communication by reference only.
- Introduce a Business Type Catalog and rule-based Recommendation contracts (no AI).
- Document an Activation Flow as event contracts only (Business Created → … → Dashboard Generated).
- Specify Admin Portal screens for commercial management — no frontend implementation in this phase.
- Source of truth for business bundles and commercial catalogs is
docs/reference/*(and optional YAML catalogs). Frontend TypeScript catalogs MUST become generated artifacts; manual React maintenance of commercial truth is forbidden going forward. - Distinguish clearly:
- BusinessBundle* = cross-product commercial packaging (this ADR)
- Payment / Experience / Hospitality L2 bundles = service-owned capability packs (ADR-021, vertical ADRs) — referenced by Business Bundles, never absorbed
- This ADR is architecture + contracts + admin specification only. No backend feature engines, migrations, APIs, databases, customer portals, or future product foundations (QR, Short Links, Booking, Torbat Credit, Payment 14.6+, Experience FE-11.6+, Marketplace) are authorized.
Consequences
Positive
- One commercial vocabulary for every product
- Pricing and packaging remain separable
- Frontend and services consume the same contracts
- Activation is event-sequenced without premature implementation
- Compatible with existing Payment L1/L2/L3 and Published Resource models
Negative
- Future implementation must introduce Core commercial storage carefully
- Existing frontend catalog must be regenerated from docs (transition debt)
Neutral
- Completed Payment 14.0–14.5, Experience FE-11.0–11.5, and Product Integration Wave 1 UX remain unchanged
- Service L2 bundles continue to be owned by their services
Alternatives Considered
- Keep React as catalog source of truth — rejected (duplicates, no admin governance, violates ADR-002 commercial governance).
- Put commercial bundles inside Payment — rejected (Payment owns payment capability packs only; commercial packaging is cross-product).
- Put pricing inside BusinessBundleDefinition — rejected (blocks regional/tax/coupon evolution and plan reuse).
- AI recommendation engine now — rejected (out of scope; rule contracts only).
Related Documents
- Commercial Platform Architecture
- Business Bundle Contracts
- Business Bundles Catalog
- Pricing Catalog
- Subscription Contracts
- License & Entitlement Contracts
- Business Type Catalog
- Recommendation Contracts
- Activation Flow Contracts
- Commercial Admin Portal Spec
- Payment Contracts · ADR-020 · ADR-021 · ADR-022
Amendment — Commercial Foundation v1.1 (2026-07-28)
| Field | Value |
|---|---|
| Status | Accepted (additive amendment) |
| Date | 2026-07-28 |
| Amends | This ADR (decisions 1–11 remain in force) |
Context
The v1 Commercial Foundation packaged businesses via bundles, pricing, subscriptions, and licenses, but did not yet provide a permanently extensible product / capability / automation / extension model. Without it, each future commercial product risks requiring Core architecture edits.
Additional decisions (additive)
- Introduce an open Platform Product Catalog and Dynamic Product Registry (
PlatformProduct*aggregates). Every commercial offering is a PlatformProduct. Product lists are never hardcoded in architecture — unlimited future products via registry entries only. - Introduce Marketplace Compatibility declarations on products (
requires_marketplace,marketplace_optional,marketplace_compatible, publisher/consumer/plugin/extension/integration roles). Marketplace remains an independent product. - Introduce an Automation Catalog (types + packs). Automation is not a PlatformProduct.
- Introduce an Extension Registry (widgets, blocks, actions, embeds, connectors, templates, reports, dashboards, themes, integrations, validators, automation packs, AI skills, … — open kinds). No ownership conflicts: publisher product + runtime owner service.
- Introduce a Capability Registry. Capabilities are independent reusable objects; products consume them; bundles reference them; definitions are never duplicated.
- Business Bundles (v1.1) MUST reference products, capabilities, automation packs, extensions, pricing, and subscription/license plan refs — never embed implementations. Legacy service/module/feature refs remain valid.
- Future Product Rules: adding a future product requires only (1) PlatformProduct registration, (2) capability declaration, (3) documentation, (4) optional bundle mapping — no Core architecture changes.
- Introduce a Commercial Dependency Graph (
requires,optional,conflicts,recommended,deprecated,replacement). - This amendment remains architecture + contracts only. It does not authorize backend/frontend/DB/API implementation or any future product engines.
Related Documents (v1.1)
- Product Catalog
- Product Registry
- Capability Registry
- Automation Catalog
- Extension Registry
- Dependency Graph
- Commercial Compatibility Matrix
- Commercial Foundation v1.1 Report
Amendment — Commercial Foundation v1.2 (2026-07-28)
| Field | Value |
|---|---|
| Status | Accepted (additive amendment) |
| Date | 2026-07-28 |
| Amends | This ADR (decisions 1–20 remain in force) |
Context
v1.1 made products, capabilities, automation, and extensions permanently extensible. The foundation still needed reusable assets, open metadata, and independent policy contracts, plus universal versioning and references, to close the commercial architecture layer without implementing engines.
Additional decisions (additive)
- Introduce a Universal Asset Registry. Assets are reusable commercial resources (templates, themes, libraries, packs, …). Assets are not products, bundles, or capabilities. Asset types are open-ended.
- Document Asset Lifecycle states: draft, review, published, deprecated, archived, deleted, versioned, cloned, installed, shared, marketplace_ready (plus install/share records).
- Introduce a Metadata Registry: every registry object may carry an open attribute bag (
slug,tags,labels, industry/locale/country/language/currency/timezone/brand/owner/support_level/release_channel/icon/color/seo/marketing/visibility/documentation/beta/deprecated/custom_attributes, …). Unlimited future keys; no schema change required. - Introduce Policy Engine contracts (independent policies: eligibility, licensing, commercial, regional, pricing, tax, promotion, discount, activation, feature visibility, capability access, quota, marketplace rules, compliance, security, support, trial, renewal, expiration, …). No evaluation engine in this amendment.
- Policies may target open kinds: product, bundle, capability, subscription, license, tenant, workspace, business type, country, region, industry, automation, asset, metadata, and future object types.
- Document Asset Marketplace distribution modes (installed, shared, cloned, purchased, free, enterprise only, private, organization only, marketplace ready) without implementing Marketplace.
- All registries support versions via shared versioning contracts.
- Every registry object receives a stable universal
registry_object_id— commercial cross-refs must not use service-specific identifiers as SoT. - With decisions 1–28 documented, the Commercial Platform Foundation is declared ARCHITECTURE COMPLETE. Implementation requires future registered phases and is not authorized by this ADR alone.