Troubleshooting Access
Use this page when the app looks close to working, but users still cannot reach the protected product.
Symptom: sign-in works, but the workspace gate never clears
Check these in order:
- confirm you are signed in with the same account that started checkout
- confirm the user actually has product access
- confirm Clerk + Convex auth is working with the
convextemplate - confirm the webhook already granted access
If you skip any of those, you can chase the wrong problem for an hour.
The access-required page now shows the currently signed-in email for signed-in recovery states. Read that first. It is the fastest way to catch the common “wrong Clerk account” failure before you start debugging Stripe or Convex.
Symptom: /checkout/success keeps waiting
This usually means one of two things:
- the webhook never granted product access
- the app cannot read the right viewer state after payment
Go straight to Troubleshooting Stripe and Convex if payment already completed.
Symptom: a granted user sees Unauthorized during page load
That usually means the server-side access check succeeded, but a client-side Convex query fired before Clerk auth finished syncing in the browser.
Start with these checks:
- confirm the user really has a
grantedproduct-access row - confirm the failing stack says
Called by client, not the server-side layout guard - confirm the page is using the server-fetched initial access or mission data path before live Convex queries take over
If the access row exists and the error only appears during hydration, treat it as a Clerk/Convex client-auth timing issue, not a revoked purchase.
Symptom: the wrong-account state appears
That state is usually telling the truth.
Fix it by:
- signing out
- signing back in with the email shown in checkout or the access-granted QA account
- reopening the validated success URL or retrying the access check from
/access-required
Do not assume this is a Stripe bug first.
Symptom: a user with granted access still cannot reach /start
Check these in order:
- run
bun run clerk:test-user:prepare:entitled - confirm the user really has an active product-access row
- confirm the Clerk
convextemplate still matches the current app - confirm you are not signed into the wrong Clerk app or stale browser session
Local product-access sanity check
For the local granted-access QA user:
bun run clerk:test-user:prepare:entitledIf the granted-access test user still cannot reach /start, stop guessing and confirm the signed-in email shown on /access-required, then confirm the access row plus auth template path.
What success looks like
Access is healthy when:
- users without access reach
/startand see inline recovery - users with granted access reach
/start - a newly paid user leaves
/checkout/successand reaches the protected workspace without manual intervention