RealtyOS billing

Billing Control Plane

Create the product, map Stripe prices to feature access, then attach each client copy as a tenant.

Stripe unknown Webhook unknown

What to do next

This checklist reflects the records and Stripe config this server can see.

How the pieces fit

Read left to right. This is the mental model for every app you bolt onto this billing service.

Project

The product, like RealtyOS or ReelTours.

Plan

A Stripe price plus the features and limits that price unlocks.

Tenant

One client, company, or copied app instance.

Client app

Calls this server before paid actions and records usage after.

Rule of thumb Base44 or a copied app should ask this server, "Can this tenant do this?" The copied app should not decide billing rules by itself.

1. Project

Create one project per app.

Use `realtyos` for the first product.

2. Plan

Connect a Stripe price to features and limits.

3. Tenant

Create one tenant per client or copied app.

Projects

Rotate the token when a client copy should lose API access.

ProjectOriginTokenAction

Tenants

A tenant is the billing identity for one client app copy.

TenantPlanSubscription

Plans

Plans are where Stripe price IDs become RealtyOS permissions.

PlanPriceStripeFeaturesStatus

API call builder

Use these snippets when wiring a Base44 copy or another app.

Project token Paste the one-time token into the copied app's server-side secret store. These snippets show `PROJECT_TOKEN` as a placeholder on purpose.

Generated snippets

These are the calls your app makes to this billing server.

Check entitlement before an action


          

Record metered usage after an action


          

Start Stripe Checkout


          

Stripe webhook

This is what turns completed payments into active tenant subscriptions.

Webhook unknown

After adding `STRIPE_WEBHOOK_SECRET`, restart the billing container.

checkout.session.completed
customer.subscription.created
customer.subscription.updated
customer.subscription.deleted
invoice.created, invoice.finalized, invoice.paid, invoice.payment_failed