Skip to main content
AgentRuntime’s billing kernel (Wheelhouse) can host multiple commercial products on one database. Each product has its own plan catalog, trial policies, and workspace lineage — keyed by product_code. The Console you use today is scoped to agentruntime. You do not pick a product in the UI; your deployment’s BFF filters plans and onboarding to that code automatically.

Concepts

TermMeaning
product_codeStable slug for a commercial product line (agentruntime, or a future SaaS on the same platform)
plan_codeTier within that product (free, pro, plus, max, enterprise)
Catalog key(product_code, plan_code) — the same tier name can exist on different products without collision
WorkspaceEach workspace (tenant) is stamped with one product_code at creation

What you see in the Console

For console.agentruntime.io:
  • Settings → Plans lists only AgentRuntime plans (product_code = agentruntime)
  • Settings → Billing Overview and Usage & History reflect your workspace subscription and credit buckets — unchanged from single-product behavior
  • Plan cards show tier names (pro, plus, …) — not the internal product_code
The public BFF filters the catalog using deployment config (PRODUCT_CODE = agentruntime). You will not see another product’s plans in this Console even though they may share the same Wheelhouse database.

Workspace creation

When you create a workspace on the AgentRuntime Console:
  1. The workspace is stored with product_code = agentruntime
  2. Onboarding auto-trial and default plan selection consider only agentruntime catalog rows
  3. Your tenant list in the workspace switcher shows only workspaces for this product’s BFF deploy
A global user account (email / Google) can belong to workspaces on different products in the future — each workspace is independent; credits and subscriptions do not cross product boundaries.

Plans and Stripe

Plans sync from Stripe into Wheelhouse. Each Stripe Price or Product carries metadata:
Metadata keyRequiredExample
product_codeYes (multi-product)agentruntime
plan_codeYespro
included_microcredits_per_cycleRecommended5000000
Sync upserts plans and plan_policies on (product_code, plan_code). Trial length, PAYG rules, and credit gates live in plan_policies per pair. Self-serve tiers for AgentRuntime today:
plan_codeTypical role
freePAYG-only
proDefault onboarding; 14-day trial available
plus / maxPaid subscription tiers
enterpriseSales-provisioned
Annual variants (pro_annual, etc.) are separate catalog rows with the same product_code. See Billing and credits for buckets, metering, and top-ups.

Credits and subscriptions

Multi-product does not split credits inside one workspace:
ScopeBehavior
Per workspaceOne active plan, trial state, and credit ledger (trial → included → PAYG)
Per productSeparate plan catalog and policies; workspaces only consume plans from their product_code
PAYG balanceStill persists across plan changes within the same workspace
Usage metering (workflow.step.execute, memory jobs, etc.) debits the workspace ledger the same way regardless of product_code.

API behavior

Customer integrations call https://api.agentruntime.io — the BFF attaches product scope to Wheelhouse internally:
  • GET /v1/billing/plans — Returns plans for the deployment’s product_code only
  • POST /v1/billing/subscription, trial, and top-up endpoints — Resolve catalog against the workspace’s product
  • Onboarding and workspace create — Stamp product_code from BFF config
The Console-facing plan JSON emphasizes plan_code, amount, and trial fields. product_code is implicit for this deployment (agentruntime). Sysadmin / operator APIs can list all products’ plans when called with appropriate scope — not exposed in the standard Console.

Example catalog response shape

GET /v1/billing/plans (scoped to AgentRuntime):
{
  "plans": [
    {
      "plan_code": "pro",
      "stripe_price_id": "price_…",
      "amount": 4900,
      "currency": "usd",
      "interval": "month",
      "interval_count": 1,
      "product_name": "AgentRuntime Pro",
      "trial_enabled": true,
      "trial_days": 14,
      "trial_credits_granted": 5000000,
      "trial_requires_card": false,
      "onboarding_default": true
    }
  ]
}
Values like trial_credits_granted are in microcredits. See API examples.

Migration (existing workspaces)

Production migrated existing data with product_code = 'agentruntime' on:
  • All workspaces (tenant.product_code)
  • All plans / plan_policies rows
  • Pending signup rows
No action required for current customers. Plan codes (pro, plus, …) and credit balances are unchanged.

Future second product on the platform

When another product launches on the shared Wheelhouse kernel:
AreaExpected behavior
Console URLSeparate BFF deploy with its own PRODUCT_CODE and DNS (for example console.otherproduct.io)
PlansThat Console shows only its product’s catalog
UsersSame email can create a workspace on each product; memberships are per workspace
StripeTypically one Stripe account per Wheelhouse environment; prices distinguished by product_code metadata
ReferralsProgram rules may gain per-product configuration later
Hostname → product_code routing on a single shared BFF is explicitly out of scope for v1 — product is determined by deployment config, not by request Host header.

What stays shared

One Wheelhouse environment still shares:
  • Stripe webhook endpoint and account (unless you adopt Connect per product)
  • Global User identity in the auth realm
  • Instance-level kill switches (for example TRIALS_ENABLED in Wheelhouse config)
Tenant-scoped tables (projects, workflows, usage events, PATs) inherit product through tenant.product_code — they do not duplicate the column.

Troubleshooting

QuestionAnswer
Why don’t I see product_code in the Console?It’s a platform partition key, not a user setting. This Console is AgentRuntime only.
Can I move a workspace to another product?Not self-serve. Products are fixed at workspace creation.
Do plan codes collide across products?No — catalog uniqueness is (product_code, plan_code).
Which source of truth for my plan?Settings → Plans and GET /v1/billing/plans on your Console’s API host.