Doctor Checklist, Pro
The results of your app's setup checks, grouped by area, with what each one found and how to fix it. Run the checks again once you've fixed something.
Checks that tell you whether the app is set up correctly after a deploy, each failed one with how to fix it.
Production Setup
The database, auth, billing, AI, email and scheduled jobs checked, with a second run after the migrations were applied.
Production setup
Database
- Passed
Connection
Postgres 17.2 at db.acme-internal.example.com:5432
- Failed
Migrations
2 migrations pending: 0007_saved_views, 0008_api_keys
Apply the pending migrations before the app serves requests.
Terminalnpm run db:migrate
Auth
- Passed
Auth secret
BETTER_AUTH_SECRET is set and isn’t the placeholder
- Passed
App URL
BETTER_AUTH_URL is https://app.acme.example.com
Billing
- Failed
Stripe webhook secret
BILLING_PROVIDER is stripe, but STRIPE_WEBHOOK_SECRET isn’t set
Copy the signing secret from your webhook endpoint in the Stripe Dashboard into STRIPE_WEBHOOK_SECRET, then redeploy.
Read Stripe’s guide - Skipped
Plan prices
Skipped until the Stripe webhook secret is set
AI
- Passed
Model
anthropic/claude-sonnet-4.5 through AI Gateway
- Warning
AI Gateway key
AI_GATEWAY_API_KEY isn’t set, so calls rely on Vercel’s OIDC token, which only exists on Vercel
Create a key in your Vercel team’s AI Gateway settings and set AI_GATEWAY_API_KEY if you host anywhere else.
- Warning
Email provider
Emails are written to the server log, not sent
Connect an email provider so invites and sign-in links reach people.
Jobs
- Warning
Purge job
CRON_SECRET isn’t set, so deleted records are never removed
Set CRON_SECRET to a random value; your scheduler sends it with each purge request.
Terminalopenssl rand -base64 32
MCP
- Passed
MCP endpoint
Serving https://app.acme.example.com/api/mcp
Tracking Health
Analytics tracking checked one check after another, with the SDK update passing on the second run.
Tracking health
0of 6 passed
Events arriving
Passed540 msPage views
Passed430 msPeople identified
Warning720 msAfter sign-inhindsight.identify(user.id, { email: user.email, plan: user.plan,})Your own events
Passed360 msAd blockers
Warning610 msSend events through your own domain, so blockers let them through.
Set up a proxySDK version
Warning380 msUpdate the package, then deploy.
Terminalnpm install @hindsight/next@latest