Prerequisites
- A React 18 or 19 application.
- A publishable key for your tenant (
pk_live_…orpk_test_…). Create one in Portals → Developer keys (see Portals overview). - A published Portal in your tenant — its
portal_idscopes the SDK session. - Your customers sign in to your app through your tenant’s identity provider (Clerk), so you can obtain a signed JWT for the current user.
1. Install
2. Mint a session token
Before the SDK can talk to Statisfy, your app exchanges the signed-in user’s identity for a Statisfy session token. Do this againstPOST /sdk/auth, sending the user’s JWT as the bearer, your publishable key as a header, and the target portal_id in the body:
The returned token is short-lived (default 1 hour, see
expires_in). Cache it and re-mint before it expires — getToken (next step) is the natural place to do that.customer_id. If the email isn’t a customer, /sdk/auth returns 403 not_a_customer.
3. Wrap your app in StatisfyProvider
StatisfyProvider supplies the gateway URL and authentication to every SDK component via React context. Set it up once, high in your tree:
4. Render your first component
Now any SDK component works anywhere beneath the provider — no connection props needed.5. Theming (optional)
The SDK’s styles are self-contained and prefixed (dw:) so they won’t collide with your app’s CSS. Override the look with --dw-* CSS variables on any ancestor of the SDK components:
Troubleshooting
401 user_token_invalid
401 user_token_invalid
The bearer token’s signature didn’t verify. Make sure
getToken returns the session token from /sdk/auth (not the raw Clerk JWT), that it hasn’t expired, and that you minted it against the same tenant/environment your gateway points at.403 not_a_customer
403 not_a_customer
The signed-in user’s email isn’t a person on any account in your tenant. Add them as a contact, or sign in as a known customer.
Components throw 'must be rendered inside <StatisfyProvider>'
Components throw 'must be rendered inside <StatisfyProvider>'
An SDK component is mounted outside the provider. Move it beneath
<StatisfyProvider>.