Schematic provides a customizable Customer Portal and checkout flow that allows your customers to easily complete common billing tasks like:
This component integrates fully with Stripe and is intended to replace Stripe’s native checkout flow. Schematic components will sync any changes to the subscription to Stripe.
Additionally, Schematic provides a component builder so the content and styling of the Customer Portal can be customized to match your use case and brand. Below is the portal from one of our demo environments.

Schematic’s checkout flow is a multi-step experience that handles the full subscription lifecycle, including subscription and plan changes. Depending on context, a customer may be:
The checkout flow itself walks customers through up to four steps:
Stripe Checkout and Payment Links are great for one-time purchases and simple new subscriptions, but they weren’t built to manage an ongoing subscription lifecycle inside a product. Schematic checkout is:
Full lifecycle, not just first purchase. Stripe Checkout is primarily designed for new subscriptions. Schematic checkout handles upgrades, downgrades, add on changes, and cancellations all from the same component, with no additional code.
Entitlements provisioned automatically. When a customer completes a Schematic checkout, their feature flags and usage limits are updated immediately. There’s no need to write webhook handlers to map Stripe events back to access control in your app.
Catalog-driven, not code-driven. Your pricing table reflects your live plans in Schematic. When you update pricing or restructure your plans, the checkout UI updates without a deploy.
Customizable to your brand. The Component Builder lets you control layout, colors, fonts, and which elements appear without touching code. Schematic checkout looks like part of your product, not a third-party overlay.
Trials, proration, and billing intervals included. Switching from monthly to annual, handling trial-to-paid conversion, and calculating proration are all managed out of the box.
Schematic checkout is built on top of Stripe. When a customer completes a checkout flow:
Payment UI is rendered via Stripe Elements. Card data is collected directly by Stripe’s secure frontend library and never passes through Schematic or your servers. This means you do not need to maintain a Cardholder Data Environment (CDE) — Stripe’s PCI DSS compliance covers the full payment collection flow.
Stripe remains the source of truth for billing. Schematic is the source of truth for entitlements. The two stay in sync automatically.
For more details on the Stripe integration, see the Stripe Integration page.
Schematic checkout is configurable at several levels:
Component Builder (no-code). In the Schematic UI, you can choose which elements appear in your Customer Portal (Current Plan, Invoices, Payment Method, Usage Meters, and more), and fully control colors, fonts, and card styling. Changes take effect immediately without a code deploy.
Live plans. Within Schematic, you control which plans are available for customers to upgrade or downgrade to in Catalog > Configuration. Only plans mapped to Stripe products can be added as live plans.
Programmatic control. Using the initializeWithPlan API, you can launch checkout from anywhere in your app (e.g., a paywall), pre-select a plan and add ons, and skip stages the customer doesn’t need to see. See Advanced Usage for details.
Tax collection. Schematic supports Stripe Tax to collect billing address information and calculate taxes at checkout. This is configured under Plans > Configuration. See Advanced Usage for details.
After a customer completes a checkout flow (whether that’s a new customer, upgrade, or downgrade), we post an event to the window that you can listen for. This event will include some key information, such as the id of the new plan.
While not strictly necessary, we recommend performing a hard refresh of the page to ensure all flag checks and usage quotas are updated.
Additionally, if you want to act on the plan change, the event has a detail property that includes information about the new plan. Specifically, it will include
A few values below are numbers that represent dates (specifically, seconds since the Unix epoch). You can convert these to a Date object using by new Date(value * 1000):
plan-changed event is a client-side browser event, separate from the server-side company.plan_changed webhook. Use the browser event to react in your front end (for example, refreshing the page or redirecting the user), and use the webhook to trigger backend or internal workflows.The same plan-changed event also fires when a customer unsubscribes. In that case the detail property is a delete response of the shape { deleted?: boolean } rather than the subscription object above, so you can branch on it to handle cancellations differently.
A common use case is to show a cancellation survey or feedback form after a user unsubscribes. Listen for the event, check for the delete response shape, and handle accordingly: