Skip to content
Migrate

From Clerk.
Same DX. Open OIDC.

Clerk and Synq look almost identical from the React side — same provider shape, same hooks, same `<SignedIn />` / `<SignedOut />` toggle pattern. Synq trades Clerk's proprietary Org-as-Customer model and `Powered by Clerk` for an open OIDC issuer and a Brand surface you own.

Concept map

Clerk → Synq

ClerkSynq
ClerkProviderSynqProvider
<SignIn /> (Clerk)<SignIn /> (@synqid/react/ui)
<SignUp />Same <SignIn /> (Synq merges sign-up + sign-in)
<UserButton /><UserButton /> (@synqid/react)
<SignedIn /> / <SignedOut />Same names (@synqid/react)
useUser() / useAuth()useUser() / useSynq() / useAccessToken()
clerkClient (server)@synqid/nextjs/server (auth, requireAccess, etc.)
Clerk WebhooksSynq Webhooks (HMAC-SHA256, same event catalog shape)
Clerk OrganizationsSynq Orgs (different scope: Synq Orgs are YOUR account, not your customers’)
Clerk RolesBrand-scoped custom OIDC scopes + your own RBAC
Three phases

Direct one-to-one swap

1. Swap the imports

Replace `@clerk/nextjs` with `@synqid/nextjs` (or `@synqid/react` if you are not on Next). The component and hook names match — most of your call sites will work without changing.

2. Move provider config from CLERK_* to SYNQ_*

CLERK_PUBLISHABLE_KEY → SYNQ_CLIENT_ID, CLERK_SECRET_KEY → SYNQ_CLIENT_SECRET, plus SYNQ_ISSUER and SYNQ_REDIRECT_URI. Synq env vars are server-side only — no NEXT_PUBLIC_*.

3. Replace Clerk Webhooks with Synq Webhooks

Clerk’s `user.created`, `user.updated`, `session.created` events all have direct Synq equivalents. Receiver code is structurally identical — the signature header is `x-synq-signature` instead of `svix-id` / `svix-signature`.

4. Decide on Org semantics

Clerk Organizations are Clerk’s name for "your customers’ teams". Synq Orgs are YOUR account. If you were using Clerk Organizations for multi-tenant SaaS, you have two paths: keep tenant data in your own DB (most common), or model each customer as a Brand under your Synq Org (if you offer customer-branded sign-in surfaces).

Read more

Common questions

Drop the badge. Keep the DX..

Same imports, similar hooks, no proprietary surface. Move off Clerk in a sprint without touching most of your component code.