Stripe Subscriptions Lifecycle And Entitlements
Pack:
stripeSource:stripe/stripe-subscriptions-lifecycle-and-entitlements/SKILL.mdUse this skill when the task is mainly about what a subscription state means and how product access should follow it.
- subscription lifecycle semantics
payment_behaviorchoices for API-created subscriptions- invoices and payment outcomes
- upgrades, downgrades, cancellations, and retries
- entitlements as the default feature-access model for non-trivial plan gating
Routing cues
Section titled “Routing cues”- subscription statuses,
default_incomplete, first invoice behavior,past_due,unpaid,incomplete_expired, trial behavior, proration, upgrade and downgrade flows, cancellation timing, or entitlements -> use this skill - initial checkout setup and pricing-model choices -> use
stripe-checkout-and-pricing-model-defaults - webhook verification and event-processing mechanics -> use
stripe-webhook-first-billing-state - self-serve portal configuration for subscription changes -> use
stripe-customer-portal-defaults
Default path
Section titled “Default path”- Treat the Stripe subscription lifecycle as the billing truth, not a simplified custom status enum invented first.
- When creating subscriptions through the API, default to
payment_behavior=default_incomplete. - Use the first invoice and its outcome to decide whether access should activate.
- Grant access when the subscription is clearly active or trialing, and revoke or restrict based on explicit failed-payment and cancellation states.
- For non-trivial feature gating, use Stripe Entitlements as the default mapping layer between products and app features.
- Keep upgrades, downgrades, and cancellations as modifications of the existing subscription whenever possible.
When to deviate
Section titled “When to deviate”- Use a simpler internal access model only when the product tiers are extremely small and static.
- Avoid entitlements if the app only needs one coarse-grained “paid vs not paid” check and nothing else.
- Use a different
payment_behavioronly when the integration has a deliberate reason and the tradeoff is understood.
Guardrails
Section titled “Guardrails”- Treat
active,trialing,incomplete,past_due,unpaid, andcanceledas materially different states. - Do not assume the success page means the subscription is fully active.
- Use webhooks to observe lifecycle changes.
- Keep access-control logic aligned with invoice and subscription reality.
- Persist entitlement or plan information in a way the app can resolve quickly.
- collapsing all subscription states into a generic boolean too early
- using
error_if_incompleteby habit and making 3DS or retry flows harder - creating a new subscription for every routine upgrade or downgrade
- treating unpaid historical invoices as irrelevant when they still affect lifecycle decisions
- hand-rolling feature-plan mapping when Stripe Entitlements already fits the need
Verification checklist
Section titled “Verification checklist”- lifecycle handling distinguishes the important Stripe subscription states
- API-created subscriptions use
default_incompleteunless a real deviation is justified - access changes are based on invoice and subscription outcomes, not only local assumptions
- upgrades, downgrades, and cancellations follow Stripe lifecycle rules
- entitlements are considered when feature gating is more complex than a single paid flag
Current snapshot
Section titled “Current snapshot”- Checked against official docs on 2026-04-03
- Current npm line verified live on 2026-04-03:
stripe@22.0.0 - Subscription lifecycle and entitlements docs verified live on 2026-04-03
Official references
Section titled “Official references”- https://docs.stripe.com/billing/subscriptions/overview
- https://docs.stripe.com/billing/subscriptions/webhooks
- https://docs.stripe.com/billing/entitlements
- https://docs.stripe.com/products-prices/pricing-models