Blog

Entitlements sync between Stripe and your app

WorkOS is introducing Entitlements powered by Stripe: one-button setup for enabling immediate, subscription-based access to plans, features, and products. Entitlements are available to all AuthKit customers for free.


What are entitlements?

Entitlements are a feature management system that map product features to pricing plans.

If you offer customers multiple pricing plans, it's probable that those plan details are duplicated in your codebase. This coupling can make it impossible to manage pricing plans without involving an engineer.

Entitlements are an effective way to decouple the plan management from the code that allows feature access. If you're familiar with role-based access control (RBAC), think of pricing plans and entitlements like roles and permissions, respectively. Plans are (non-exclusive) collections of entitlements. And once customers select a pricing plan, they are entitled to its included features.

With entitlements, your codebase can check if a customer has access to a feature, regardless of the pricing plan they selected.

WorkOS now offers a one-click integration with Stripe’s Entitlements. Let's explore how they work and when to use them.

What’s hard about entitlements

Stripe does a lot of heavy lifting for you — managing billing, renewing subscriptions, and tracking corresponding entitlements. But it doesn't connect that data to your application.

At a minimum, an effective integration requires several pieces of functionality.

  • Persisting customer entitlements: Applications need to retrieve customer entitlements from Stripe and persist them. While the process may appear straightforward, insufficient error handling can lead to issues, such as missed updates that result in stale or inconsistent data.
  • Loading entitlements in the frontend: App frontends must load entitlements associated with each user. Querying for this data adds complexity, can introduce latency, and any errors need to be handled gracefully to avoid bad user experience.
  • Keeping entitlements synchronized: When a customer completes a purchase they expect immediate access to a new feature so any updates to entitlements must be reflected promptly. Delays in fetching the latest data can lead to poor user experiences.

The additional code complexity and correct handling of synchronization make the process of managing entitlements a challenge.

With WorkOS Entitlements, we’ll handle the synchronization and surface entitlements directly in a user’s access token without the complexity.

WorkOS can handle Stripe Entitlements for you

Getting started with WorkOS Stripe Entitlements integration involves the following:

  • Enable Entitlements in the WorkOS Dashboard and authorize WorkOS to connect to your Stripe account.
  • Set the Stripe customer ID associated with each of your WorkOS organizations.

Entitlements are set at the organization level so the only code that’s required is to set the Stripe customer id on the WorkOS organization. Typically this is done after creating the Stripe customer and before redirecting the user to a Stripe billing page.

// Create the Stripe customer (using the Stripe SDK)
const customer = await stripe.customers.create({
  email: user.email,
  name: organization.name,
  metadata: {
    organizationId: organization.id,
  },
});

// Use the WorkOS SDK to set the Stripe customer ID for the organization
await workos.organizations.updateOrganization({
  organization: organization.id,
  stripeCustomerId: customer.id,
});

// redirect to the Stripe billing portal

Once in place, entitlements will automatically start flowing from Stripe to WorkOS. Each user in an organization will receive access tokens with the entitlements afforded by their organization’s subscription. Here’s what a partially decoded WorkOS access token looks like with the additional entitlements claim.

{
  iss: "https://api.workos.com",
  sub: "user_01JB0CQK1GTG9VDCG3KGQYKF9C",
  sid: "session_01JCHAE975HXQFCS7Y197TKDTP",
  jti: "01JCHAEE8XTFSKS4ZN2BYYWHWP",
  org_id: "org_01JB0CQY3ZHX4BNE4NDATJVEED",
  role: "admin",
  entitlements: ["audit-logs"],
  exp: 1731453504,
  iat: 1731453204
}

Best practices for working with entitlements

There are a couple of things to keep in mind as you take advantage of WorkOS Entitlements in your own application.

Decouple billing from application code

Focus on the features being provided, rather than what plan a user has access to. By decoupling the billing logic from the app logic, it’s easy to add new subscription tiers, or modify existing ones, without having to change any application code.

It can be helpful to think once more about the analogy to RBAC systems. When gating sensitive actions with specific permissions, rather than the role that can perform it, it becomes much easier to add more roles when the need arises. You’ll see a similar separation of concerns with entitlements.

Keep entitlements up to date

Entitlements need to be synced as quickly as possible. If a user upgrades their subscription, they should get access to the new features. The WorkOS integration takes care of this for you, listening to updates from Stripe webhooks and storing it.

Since WorkOS Stripe Entitlements integration works by provisioning access tokens with entitlements, your app can also refresh the session to ensure the user’s access token is up to date. Revisiting the earlier example:

app.get('/api/entitlements', async (req, res) => {
  // load the original session
  const session = workos.userManagement.loadSealedSession({
    cookiePassword: process.env.WORKOS_COOKIE_PASSWORD,
    sessionData: req.cookies['wos-session'],
  });

  const { sealedSession, session: newSession } = await session.refresh();
  const { entitlements } = newSession;

  // set the updated refresh session data in a cookie
  res.cookie('wos-session', sealedSession, {
    httpOnly: true,
    sameSite: 'lax',
    secure: true,
  });

  // return the entitlements to the client
  res.json({
    entitlements,
  });
});

Ship what matters

This integration with Stripe Entitlements is just one more way that we help you ship what matters – high quality customer experiences that users love.

To get started, enable Stripe Entitlements in the WorkOS Dashboard and check out the docs to simplify plan management and feature access.

In this article

This site uses cookies to improve your experience. Please accept the use of cookies on this site. You can review our cookie policy here and our privacy policy here. If you choose to refuse, functionality of this site will be limited.