Skip to content

What Owns What

RevTurbine sits between your app and Stripe, and the single biggest question a technical evaluator has is “where does each piece of truth actually live?” Here’s the map.

ConcernRevTurbineYour appStripe
Plan catalog — which plans/tiers existAuthoritative (the Playbook)mirrors as products
Pricesmirror (UI helper)Authoritative
Subscription status — active / plan / canceledreads it from user contextrelays Stripe → RevTurbineAuthoritative
Feature-access policy — what each plan entitlesAuthoritative (entitlement rules)
Usage countsevaluates them against limitsreports usage (rt.update)
Checkout & paymentstarts it (a CTA opens checkout)hosts the flowProcesses payment
When to show a placement / upsellDecides (decision engine)renders the <Slot>
Billing-critical enforcement — actually granting a paid actionadvises (policy)Enforces (server-side)
  • RevTurbine owns policy, not money. The plan catalog, what each plan entitles, and when a placement shows are all RevTurbine’s — a PM edits them in the studio and republishes, with no code deploy. RevTurbine never charges anyone.
  • Stripe owns money and subscription state. Prices, who is subscribed, and payment processing are Stripe’s. RevTurbine mirrors prices into the Playbook as a UI helper for rendering — but Stripe is the price authority. Your app tells RevTurbine the user’s current plan (from Stripe) via rt.identify(userId, { plan }).
  • Your app owns enforcement and usage. You report usage, you host checkout, and — critically — you enforce billing-critical actions on your server. See Client vs Server Enforcement.

Because your app only ever knows slots and entitlements — never plan names or prices hard-coded in code — cascading monetization changes stay out of your codebase. Launch a new plan, run a discount, restructure tiers: the catalog and policy change in RevTurbine, the numbers change in Stripe, and your app keeps rendering the same slots and checking the same entitlements. The first monetization strategy is never the last — and this split is what keeps your code from having to change every time it moves.