Publish an Offering Version, then create/publish a Paywall with its Product subset, ordering and default. Prepare the current Customer and purchase integration.
Paywall configuration & integration
Pin an Offering, author Product presentation and connect independent purchases.
SDK examples target the current API. Check matching SDK versions and HTTP alternatives
Before you start
Configure and publish a Paywall
A Paywall owns presentation and pins a published Offering Version. It chooses its displayed Product subset, display groups, Product/group order and default independently within that Offering's leaves.
- Choose a template or blank design under Paywalls, bind a published Offering Version, then configure displayed Products, groups, periods and the default.
- Re-selecting the same Offering Version preserves authored settings. New Offering publications never update a Paywall automatically. An explicit Version switch preserves surviving choices and their relative order; authors select additional Products.
- Complete locales, buttons and Product selection, preview and publish. An unbound draft can save but cannot publish. Integrate it independently or reference its fixed Version from a Funnel.
Display a standalone Paywall
executeMerchantCheckout is your backend integration point: accept an operationId belonging to the authenticated Customer and read its original server-side execution instructions. Do not trust browser-supplied amounts or Stripe parameters. autumn mode redirects through onCheckoutUrl; record_only mode creates Checkout on your backend.
Standalone Paywall creates no Funnel and needs no Funnel run credential. Session refresh pins its original Paywall/Offering Version. Purchase completion and access approval are separate; when using an access check, continue protected work only after an allowed recheck. Actual consumption remains an atomic backend operation.
Related:Offering·Stripe checkout·resolvePaywall API·SDK compatibility
import { createPaywallSession, showPaywall } from "@tinkerlandai/indiana-sdk"; const result = await showPaywall(container, { start: () => createPaywallSession({ baseUrl, scope }, { paywallId: configuredPaywallId, customerToken, // Issued by your authenticated backend. locale: "en", commerce: { provider: "stripe", currency: "USD" }, }), onCheckoutUrl: (url) => window.location.assign(url), // Required for record_only mode: execute on your authenticated backend. onPurchase: ({ operation, signal }) => executeMerchantCheckout(operation.operationId, signal), onComplete: () => refreshCustomerHoldings(), onError: reportError,});// On navigation/sign-out: result.host?.destroy();HTTP operations
Use these operations with your HTTP integration. Each reference includes complete request/response fields and credential requirements; SDK snippets are an alternative when a matching SDK is available.
| Operation | HTTP | Permission |
|---|---|---|
| resolvePaywall | POST /api/v1/paywalls/resolve | entitlements:read |
| previewAttach | POST /api/v1/subscriptions/preview-attach | billing:read |
| attach | POST /api/v1/subscriptions/attach | billing:write |
| readSubscriptionOperation | POST /api/v1/subscriptions/operations/read | billing:read |
Operation and permission
resolvePaywall
- HTTP
- POST /api/v1/paywalls/resolve
- Permission
- entitlements:read
previewAttach
- HTTP
- POST /api/v1/subscriptions/preview-attach
- Permission
- billing:read
attach
- HTTP
- POST /api/v1/subscriptions/attach
- Permission
- billing:write
readSubscriptionOperation
- HTTP
- POST /api/v1/subscriptions/operations/read
- Permission
- billing:read
Related:resolvePaywall·previewAttach·attach·readSubscriptionOperation
Check your result
Expected outcome
Open the pinned Paywall independently, preview and confirm purchase, recover the same operation and re-check access after success. No hidden Funnel is required.