Strategy → Delivery fork

Bolt-on app vs. first-class platform citizen.

An open strategic fork: bc-subscriptions can ship as a BC marketplace app (current shape) or as a native first-class BC service. They are not points on a continuum — they are different runtime substrates with different teams, languages, and operational shapes. This page surfaces the dimension-by-dimension gap, the artifact-level portability inventory, and the decision criteria — so the conversation with stakeholders happens against an honest scope, not abstractions.

Filed 2026-05-22 · Trigger: Slack thread, jordan.sim ↔ nino.chavez · Source authority:docs/strategy/delivery-fork.md

Path A

Marketplace app

BC marketplace app, App Extensions for control panel, own runtime (Cloudflare today / GCP Phase 2 per ADR-0030), consumes BC public APIs, owns its own data store, OAuth client per merchant, own payment-method vault wrapping BC Payments (ADR-0037), shipped/billed/supported as a marketplace product.

~95%+ of current investment on-rails

Path B

Native first-class

BC domain service owned by a Pod (paralleling Billing Pod's msms), Ruby/Scala/Java backend, gRPC interface in bigcommerce/interfaces, Nomad/Launchbay deploy, BigPay direct (not our vault), RabbitMQ Domain Eventing, Lightstep observability, BC's internal request-context propagation.

~70% of current investment directly portable; ~30% (bolt-on-only + rework) is executable spec

Native-shape gap matrix

20 substantive dimensions where current shape diverges from BigEng standards.

docs/strategy/ · repo

S — small

1

M — medium

7

L — large

6

XL — discardable

6

#DimensionCurrentPath A (marketplace)Path B (native)Rework A→B
1Runtime

infrastructure/deployments/containers.md

Cloudflare Workers (V8 isolates)Cloud Run on GCP (Phase 2)Nomad-scheduled containers in CDE/platform cluster; .container.ymlXL
2Language

services/merchant-subscription-manager-service.md

TypeScript (Hono)TypeScriptRuby (msms, BigPay) / Scala (api-proxy) / Java — never TS backendXL
3Service interface

technical/standards/interfaces/protobuf-style-guide.md

Our REST API (apps/api)REST + GraphQLgRPC; protos in bigcommerce/interfacesXL
4Public API

services/api-gateway.md

Our REST is the public surfaceHardened, versioned, OpenAPINo public API; api-proxy-java composes our gRPC into BC /v3 and GraphQLXL
5Data store

technical/standards/bounded-contexts.md

Cloudflare D1 (we own)Cloud SQL MySQL (we own)Shared store DB, bounded-context partitioned; never JOIN across contextsL
6Auth / context

technical/standards/internal-services/context-propagation.md

OAuth token per merchant installSamex-bc-request-context-bin, x-audit-principal-bin, OT-trace (OpenTelemetry distributed tracing) via gRPC trailing metadataL
7Eventing

technical/standards/domain-eventing.md

D1 outbox → Worker cron → BC webhooksCloud Tasks / Pub-SubRabbitMQ Domain Eventing; events in bigcommerce/interfacesL
8Layering

technical/standards/layering.md

App-shaped: routes → handlers → D1SameStrict Domain / Application / Infrastructure; immutable cross-layer DTOsM
9Bounded context

technical/standards/bounded-contexts.md

We own our context boundarySameCannot read Orders/Customers/Catalog tables; call their public interfacesM
10Payments / vault

services/bigpay.md

Our bc-vault-client wraps BC /v3/payments (ADR-0037)SameDirect gRPC into BigPay; no separate vault façadeXL
11Transactionality

technical/architecture/transactionality.md

Eventual consistency + producer-outboxSameSagas + 2PC; DB transactions within context; events acrossM
12Observability

services/bigpay.md

Wrangler logs + Analytics Engine+ Sentry, dashboardsLightstep + logstash app_name + Sentry per-habitat + Prometheus + GrafanaL
13Deploy

infrastructure/deployments/strategies.md

wrangler deploy from GHAGHA → Cloud RunLaunchbay → Nomad → habitats (int/stg/prd); canary + rollbackXL
14Secrets

infrastructure/deployments/secrets.md

Wrangler secrets + Cloudflare KVGCP Secret ManagerHashiCorp VaultS
15Service mesh

infrastructure/deployments/containers.md

n/a (Workers routing)Cloud Run nativeConsul Connect + Envoy sidecarsM
16Cluster placement

infrastructure/deployments/containers.md

n/an/aadmin / payments (CDE) / platform — likely payments for PCI scopeM
17Storefront surfaceStencil widget + Catalyst SDK + Web Component (ADR-0013)SameNative storefront UI in BC storefront-kit / Catalyst directlyL
18Admin surfaceApp Extensions + iframe + our admin app (ADR-0012)SameNative control-panel routes in BC App with BigDesignL
19Merchant audit log

sdlc-frameworks/bigcommerce-bigeng.md (Gate 3)

Our D1 audit_log tableSameBC's merchant-facing audit log surface (BigEng DoD Gate 3)M
20Performance SLO

sdlc-frameworks/bigcommerce-bigeng.md (Gate 4)

≤ 800ms p95 admin; ≤ 1.5s writesSame< 100ms p95 (BC API DoD); < 200ms TTFBM

Aggregate read: 6 XL, 6 L, 7 M, 1 S across 20 dimensions. Calling Path B "refactoring" understates it — it's a re-implementation with the current codebase serving as executable spec.

Portability inventory

How each existing artifact travels across the fork. Curated highlights — full inventory (81 ADRs + specs + prototype + substrate + tooling) in docs/strategy/ (in repo).

docs/strategy/ · repo

🟢 Survives both

27

🟡 Bolt-on only

5

🔴 Requires rework

8

🟣 First-class only

0

ADR (19)
0010Webhook / event egressPath B = RabbitMQ Domain Eventing🔴 requires rework
0011Charge idempotency + retry semanticsUniversal behavior🟢 survives both
0012Merchant admin stack (Vite + React + BigDesign)Native admin lives in BC App🔴 requires rework
0013Storefront-components shapeNative ships in storefront-kit directly🔴 requires rework
0014Subscriber-surface auth (magic-link + JWT)Native uses BC session model🔴 requires rework
0015Observability stackPath B = Lightstep + Sentry + Prometheus🔴 requires rework
0016Tax engine — defer to BC🟢 survives both
0023B2B Edition checkout-ownership patternArchitectural pattern, fork-agnostic🟢 survives both
0024DeliveryInstance as first-class entityDomain entity🟢 survives both
0027Outbox marker + catch-up cronEventing mechanism changes🔴 requires rework
0028Eligibility-engine chokepoint patternDomain pattern🟢 survives both
0029Marketplace-first, native-readyEncodes the fork posture itself🟢 survives both
0030BigEng pattern alignmentExplicitly bridges to native standards🟢 survives both
0037Stored instruments as canonical charge railEntire vault façade vestigial in Path B🔴 requires rework
0038Capture timingBigPay must respect this too🟢 survives both
0054Cloud SQL enginePath A Phase 2 specific🟡 bolt-on only
0060PCI scope SAQ-A boundaryCompliance posture🟢 survives both
0061STRIDE payment flow threat model🟢 survives both
0063Email pipeline event patternEventing mechanism changes🔴 requires rework
Spec (6)
BRDUser stories + ACBehavioral; what, not how🟢 survives both
PRDProduct surface area🟢 survives both
PRD-COMPANIONWorked examples🟢 survives both
ARCHCurrent architecture documentDocuments the bolt-on shape; needs native companion on Path B🟡 bolt-on only
ADMIN-SPECOperator surfaceBehavioral; mechanism changes🟢 survives both
PERSONAS5-actor persona modelIdentity invariant🟢 survives both
Prototype (7)
PDPSubscription PDP widget interactionsDesign oracle for native storefront-kit🟢 survives both
CartCart/checkout subscription affordances🟢 survives both
PortalAccount portal flows (manage / pause / skip / cancel)🟢 survives both
Admin-UXAdmin dashboard (plans, instances, dunning)Operator UX portable🟢 survives both
EmailEmail previews + templates🟢 survives both
Connect-flowConnect-your-store flowPath B has no "connect" step🟡 bolt-on only
OnboardingMarketplace install onboarding🟡 bolt-on only
Substrate (4)
HiveProposal / synthesis / decision workflowProcess is portable🟢 survives both
hive-metahive-meta metadata block🟢 survives both
ADR-0055Substrate-derived-from-GH automation🟢 survives both
MethodologyTwo-track methodology + 10-gate DoD🟢 survives both
Tooling (4)
state-derivetools/state-derive/Derives state from our codebase shape🟡 bolt-on only
hive-board-derivetools/hive-board-derive/Process automation🟢 survives both
code-review-botCode-review bot v1.3Quality discipline🟢 survives both
sandbox-CISandbox-scenario CIRebinds to native test infra🟢 survives both

Aggregate read: ~70% of catalogued artifacts survive both paths (process, behavior, domain rules, methodology). ~20% are bolt-on-only (substrate mechanics, marketplace economics, our API surface). ~10% require implementation rework on Path B (where BC's standards mandate specific mechanisms — eventing, observability, vault, admin/storefront surfaces). The substrate mechanics are the smallest fraction by artifact count but the bulk of the rebuild cost on Path B.

Decision criteria

Not "which path is better?" — "what would have to be true for path X?" Each row is a condition that must hold for the corresponding path to be correct.

DimensionFor Path A (marketplace) to be correct…For Path B (native) to be correct…
Product positioningDurable marketplace offering with rev-share / platform-fee economicsBC platform treats subscription billing as native capability, not partner-app concern
Team ownershipContinues as current team (you + handoff partners)A Pod (Billing / Payments / new Subscriptions) owns it; staff engineer shepherds gRPC contract
Bounded context boundaryWe own our context; integrate via public APIsBoundary against Orders / Payments / Customers / BigPay is identifiable and accepted by those domain owners
Release cadenceMarketplace-product cadence (we control)BC's platform cadence, SLO obligations, on-call rotation
Existing investment~95%+ of current code/ADRs/specs continue forward~70% survives as-is; ~30% (bolt-on-only + implementation rework) serves as executable spec for re-implementation
Native graduationOption, not commitment (ADR-0029)The commitment

What's true today: neither column is fully checked. Path A has the most existing investment. Path B has the strongest architectural-correctness argument per Jordan's framing, but requires organizational decisions outside the project's scope.

Recommendation

Continue prototype-track work (Jordan explicitly endorsed this as the engineering handoff artifact). Freeze new platform-substrate ADRs until the fork is called — anything about D1 schema, Worker bindings, Cloudflare deploy, or our public API surface. Continue ADRs that lock in behaviors: capture timing, dunning rules, persona flows, eligibility rules, idempotency semantics. Surface the question through a [Decision] Hive proposal so it can be synthesized rather than living in Slack.

References

  • docs/strategy/delivery-fork.md — narrative wrapper + decision criteria + trigger excerpt
  • docs/strategy/native-shape-gap.md — full 20-dimension gap matrix with BigEng source citations
  • docs/strategy/portability-inventory.md — exhaustive artifact-level portability tagging
  • bigcommerce/merchant-subscription-manager — structural precedent (BC GitHub, internal access)
  • BigPay overview — canonical payments platform a native subscription service integrates with
  • BigEng — Bounded Contexts — the governing principle for native service design
  • ADR-0029: Marketplace-first, native-ready — current posture (a graduation option, not commitment)
  • ADR-0030: BigEng pattern alignment