Build a pricing table
Billing
The pricing table that is displayed in a particular flow depends on the default plan groups and pricing table order.
A pricing table is shown when:
A pricing table is shown when:
is_create_org=true parameter) and the user creating the organization is automatically assigned a role with the org:write:billing system permission (via the role’s Assign to the creator setting)org:write:billing system permission signs in and the organization is already a billing customer, but is not on a plan yetFor is_create_org=true sign-ups, Kinde only creates a billing customer and displays the organization pricing table if the user who creates the organization has the org:write:billing system permission. If you have not created a role with Assign to the creator enabled and the org:write:billing system permission selected, Kinde skips the billing steps and redirects the user directly to your callback URL without creating a subscription. See Step 1: Add billing role (B2B).
Plans that have a trial period enabled display a “Free trial for N day(s)” badge on the plan card in the pricing table. This badge is shown automatically — no additional configuration is needed. It helps customers identify which plans offer a risk-free trial before committing to a paid subscription.
You can override which plan or pricing table is shown using URL parameters. See: Update code and URLs for billing.
| Model | Plan group | Pricing table is shown when | Required role / permission |
|---|---|---|---|
| B2C | User plan group | New user registers, or an existing billing customer signs in without an active plan | Granted automatically to the signing-up user |
| B2B | Org plan group | New org registers (is_create_org=true), or an org member signs in when the org is a billing customer without an active plan | User must have a role with org:write:billing (for is_create_org=true, enable Assign to the creator on that role) |
| B2B2C | Both | Depends on flow context (is_create_org=true uses Org plan group; standard sign-up uses User plan group) | B2B flows require org:write:billing on the creator role |
If a user completes sign-up (for example, after setting their password) and is redirected straight to your callback URL without seeing the pricing table, check the following:
org:write:billing permission (most common for is_create_org=true):
When is_create_org=true is passed in the auth URL, the user creating the organization must have the org:write:billing system permission in that new organization. Go to Settings > Roles, ensure you have a role (for example, Owner or Billing Admin) with Assign to the creator enabled, and enable both org:write:billing and org:read:billing under System permissions. See Add billing role (B2B).is_create_org=true flows, ensure organization creation on sign-up is enabled in your environment settings.Organizations group for is_create_org=true, or Users group for B2C), and contains at least one Published plan whose prices are synced with Stripe.pricing_table_key does not match or plan_interest was passed:
pricing_table_key in the auth URL, verify it exactly matches the key of a Live pricing table in that environment.plan_interest in the auth URL, Kinde pre-selects that plan and intentionally skips the plan selection screen.