Skip to content
Skillv1.0.0

clerk-prod-checklist

Production readiness checklist for Clerk deployment. Use when preparing to deploy, reviewing production configuration, or auditing Clerk implementation before launch. Trigger with phrases like "clerk

by jeremylongshore(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from jeremylongshore/tons-of-skills-marketplace (skills/.curated/clerk-prod-checklist/SKILL.md). Install upstream with npx skills add jeremylongshore/tons-of-skills-marketplace --skill clerk-prod-checklist. Copyright stays with the author (MIT).

Clerk Production Checklist

Overview

Complete checklist to ensure your Clerk integration is production-ready. Covers environment config, security hardening, monitoring, error handling, and compliance.

Prerequisites

  • Clerk integration working in development
  • Production environment and domain configured
  • CI/CD pipeline ready

Instructions

Step 1: Environment Configuration Checklist

Check Status Action
Using pk_live_ keys [ ] Switch from test to live keys
CLERK_SECRET_KEY is sk_live_ [ ] Never use test keys in production
.env.local in .gitignore [ ] Prevent accidental secret commits
CLERK_WEBHOOK_SECRET set [ ] Required for webhook verification
Production domain in Clerk Dashboard [ ] Dashboard > Domains
Sign-in/sign-up URLs configured [ ] Set NEXT_PUBLIC_CLERK_SIGN_IN_URL etc.

Step 2: Validation Script

// scripts/prod-readiness.ts
import { createClerkClient } from '@clerk/backend'

async function validateProduction() {
  const checks: { name: string; pass: boolean; detail: string }[] = []

  // 1. Live keys check
  const pk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY || ''
  const sk = process.env.CLERK_SECRET_KEY || ''
  checks.push({
    name: 'Live publishable key',
    pass: pk.startsWith('pk_live_'),
    detail: pk.startsWith('pk_live_') ? 'Using live key' : `Using ${pk.slice(0, 8)}... (should be pk_live_)`,
  })
  checks.push({
    name: 'Live secret key',
    pass: sk.startsWith('sk_live_'),
    detail: sk.startsWith('sk_live_') ? 'Using live key' : 'Should be sk_live_ for production',
  })

  // 2. API connectivity
  try {
    const clerk = createClerkClient({ secretKey: sk })
    await clerk.users.getUserList({ limit: 1 })
    checks.push({ name: 'API connectivity', pass: true, detail: 'Backend API reachable' })
  } catch (err: any) {
    checks.push({ name: 'API connectivity', pass: false, detail: err.message })
  }

  // 3. Webhook secret
  checks.push({
    name: 'Webhook secret configured',
    pass: !!process.env.CLERK_WEBHOOK_SECRET,
    detail: process.env.CLERK_WEBHOOK_SECRET ? 'Set' : 'CLERK_WEBHOOK_SECRET missing',
  })

  // 4. Middleware exists
  const fs = await import('fs')
  const hasMiddleware = fs.existsSync('middleware.ts') || fs.existsSync('src/middleware.ts')
  checks.push({
    name: 'Middleware present',
    pass: hasMiddleware,
    detail: hasMiddleware ? 'Found' : 'middleware.ts not found at project root',
  })

  // Print results
  console.log('\n=== Clerk Production Readiness ===\n')
  for (const check of checks) {
    const icon = check.pass ? 'PASS' : 'FAIL'
    console.log(`[${icon}] ${check.name}: ${check.detail}`)
  }

  const allPass = checks.every((c) => c.pass)
  console.log(`\nResult: ${allPass ? 'READY for production' : 'NOT READY — fix failing checks'}`)
  process.exit(allPass ? 0 : 1)
}

validateProduction()

Run with:

npx tsx scripts/prod-readiness.ts

Step 3: Security Checklist

Check Status Action
Middleware protects all routes [ ] Verify non-public routes require auth
API routes check userId [ ] Return 401 if userId is null
Webhook signatures verified [ ] Use svix library for verification
CORS configured correctly [ ] Only allow production domain
Rate limiting on sensitive endpoints [ ] Use @upstash/ratelimit or similar
CSP headers set [ ] Add Clerk domains to Content-Security-Policy
No secret keys in client code [ ] CLERK_SECRET_KEY never exposed

Step 4: Monitoring Checklist

Check Status Action
Health check endpoint [ ] /api/health monitoring Clerk API
Error tracking (Sentry) [ ] Clerk user context in error reports
Auth event logging [ ] Log sign-in, sign-out, permission denied
Webhook monitoring [ ] Alert on failed webhook deliveries
Uptime monitoring [ ] External monitor hitting health endpoint

Step 5: Error Handling Checklist

Check Status Action
Custom error pages [ ] /not-found, /error pages handle auth errors
Graceful auth failures [ ] Redirect to sign-in, don't show stack traces
Webhook retry handling [ ] Idempotency keys prevent duplicate processing
Session expiry UX [ ] Show "session expired" prompt, not blank page
// app/error.tsx — global error boundary with auth context
'use client'
import { useAuth } from '@clerk/nextjs'

export default function Error({ error, reset }: { error: Error; reset: () => void }) {
  const { isSignedIn } = useAuth()

  return (
    <div>
      <h2>Something went wrong</h2>
      <p>{error.message}</p>
      <button onClick={reset}>Try again</button>
      {!isSignedIn && <a href="/sign-in">Sign in</a>}
    </div>
  )
}

Step 6: Performance Checklist

Check Status Action
Middleware matcher excludes static files [ ] Don't auth-check images, fonts, CSS
User data cached (React.cache()) [ ] Deduplicate within request
Auth components lazy loaded [ ] dynamic() for UserButton, SignInButton
Edge Runtime for middleware [ ] Faster cold starts on Vercel

Output

  • Environment configuration verified (live keys, webhook secret, domain)
  • Automated validation script (run in CI or before deploy)
  • Security, monitoring, error handling, and performance checklists
  • Global error boundary component with auth context

Error Handling

Error Cause Solution
Validation script fails Test keys in production Switch to pk_live_ / sk_live_ keys
API connectivity check fails Wrong secret key Verify key in Clerk Dashboard > API Keys
Middleware not found File in wrong location Place middleware.ts at project root (not inside app/)
Health check returns 503 Clerk API unreachable Check network, verify key, check status.clerk.com

Examples

CI Production Gate

# .github/workflows/deploy.yml — add as pre-deploy step
- name: Clerk production readiness
  run: npx tsx scripts/prod-readiness.ts
  env:
    NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: ${{ secrets.CLERK_PK_PROD }}
    CLERK_SECRET_KEY: ${{ secrets.CLERK_SK_PROD }}
    CLERK_WEBHOOK_SECRET: ${{ secrets.CLERK_WEBHOOK_SECRET_PROD }}

Resources

Next Steps

Proceed to clerk-upgrade-migration for SDK version upgrades.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/jeremylongshore-tons-of-skills-marketplace-clerk-prod-checklist/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

jeremylongshore-tons-of-skills-marketplace-clerk-prod-checklist.ocm.jsonjson
{
  "ocm": "1",
  "id": "jeremylongshore-tons-of-skills-marketplace-clerk-prod-checklist",
  "kind": "skill",
  "name": "clerk-prod-checklist",
  "description": "Production readiness checklist for Clerk deployment. Use when preparing to deploy, reviewing production configuration, or auditing Clerk implementation before launch. Trigger with phrases like \"clerk production\", \"clerk deploy checklist\", \"clerk go-live\", \"clerk launch ready\".",
  "publisher": "jeremylongshore",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "coding"
    ],
    "tags": [
      "skill-md",
      "saas",
      "clerk",
      "deployment",
      "audit",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Production readiness checklist for Clerk deployment. Use when preparing to deploy, reviewing production configuration, or auditing Clerk implementation before launch. Trigger with phrases like \"clerk production\", \"clerk deploy checklist\", \"clerk go-live\", \"clerk launch ready\"."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/jeremylongshore/tons-of-skills-marketplace",
      "path": "skills/.curated/clerk-prod-checklist/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/jeremylongshore/tons-of-skills-marketplace/blob/HEAD/skills/.curated/clerk-prod-checklist/SKILL.md",
      "key": "jeremylongshore/tons-of-skills-marketplace/skills/.curated/clerk-prod-checklist/SKILL.md"
    },
    "compatibility": "Designed for Claude Code",
    "allowed_tools": [
      "Read,",
      "Write,",
      "Edit,",
      "Grep,",
      "Bash(npm:*)"
    ],
    "license": "MIT"
  },
  "instructions": "# Clerk Production Checklist\n\n## Overview\n\nComplete checklist to ensure your Clerk integration is production-ready. Covers environment config, security hardening, monitoring, error handling, and compliance.\n\n## Prerequisites\n\n- Clerk integration working in development\n- Production environment and domain configured\n- CI/CD pipeline ready\n\n## Instructions\n\n### Step 1: Environment Configuration Checklist\n\n| Check | Status | Action |\n|-------|--------|--------|\n| Using `pk_live_` keys | [ ] | Switch from test to live keys |\n| `CLERK_SECRET_KEY` is `sk_live_` | [ ] | Never use test keys in producti",
  "cost": {
    "context_tokens": 1683
  }
}

Fetch it by URL: GET /api/v1/registry/jeremylongshore-tons-of-skills-marketplace-clerk-prod-checklist/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.