276 lines
5.5 KiB
Markdown
276 lines
5.5 KiB
Markdown
# Webhook Integration Quick Start
|
|
|
|
**⏱️ Estimated Time:** 15 minutes
|
|
|
|
Quick checklist to get Clerk webhooks running in your development environment.
|
|
|
|
---
|
|
|
|
## Prerequisites Checklist
|
|
|
|
- [ ] Clerk account created at [clerk.com](https://clerk.com)
|
|
- [ ] Admin app can run locally (`npm run dev`)
|
|
- [ ] Database is set up (`packages/database`)
|
|
- [ ] Node.js 18+ installed
|
|
|
|
---
|
|
|
|
## Step 1: Install Dependencies (2 min)
|
|
|
|
```bash
|
|
cd apps/admin
|
|
npm install svix
|
|
```
|
|
|
|
**Verify:**
|
|
```bash
|
|
npm list svix
|
|
# Should show: svix@1.x.x
|
|
```
|
|
|
|
---
|
|
|
|
## Step 2: Update Database Schema (2 min)
|
|
|
|
```bash
|
|
cd ../../packages/database
|
|
npm run db:push
|
|
```
|
|
|
|
**What changed:**
|
|
- Password field is now optional (Clerk handles auth)
|
|
|
|
**Verify:**
|
|
```bash
|
|
npm run db:studio
|
|
# Check users table - password column should allow NULL
|
|
```
|
|
|
|
---
|
|
|
|
## Step 3: Install Clerk CLI (3 min)
|
|
|
|
```bash
|
|
npm install -g @clerk/clerk-cli
|
|
clerk login
|
|
```
|
|
|
|
Follow the browser authentication flow.
|
|
|
|
**Verify:**
|
|
```bash
|
|
clerk --version
|
|
# Should show version number
|
|
```
|
|
|
|
---
|
|
|
|
## Step 4: Start Dev Server (1 min)
|
|
|
|
```bash
|
|
cd ../../apps/admin
|
|
npm run dev
|
|
```
|
|
|
|
Server should be running at: `http://localhost:3000`
|
|
|
|
**Keep this terminal open!**
|
|
|
|
---
|
|
|
|
## Step 5: Start Webhook Forwarding (2 min)
|
|
|
|
**Open a NEW terminal window:**
|
|
|
|
```bash
|
|
clerk listen --forward-url http://localhost:3000/api/webhooks
|
|
```
|
|
|
|
**Expected output:**
|
|
```
|
|
✓ Webhook forwarding is now active!
|
|
✓ Webhook secret: whsec_xxxxxxxxxxxxxx
|
|
|
|
Forwarding webhooks to: http://localhost:3000/api/webhooks
|
|
```
|
|
|
|
**Copy the webhook secret!** You'll need it in the next step.
|
|
|
|
**Keep this terminal open!**
|
|
|
|
---
|
|
|
|
## Step 6: Set Environment Variables (2 min)
|
|
|
|
Edit `apps/admin/.env.local`:
|
|
|
|
```env
|
|
# Clerk Authentication (should already exist)
|
|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxxxx
|
|
CLERK_SECRET_KEY=sk_test_xxxxx
|
|
|
|
# Add this line with the secret from Step 5:
|
|
CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxx
|
|
```
|
|
|
|
**Restart your dev server** (go back to Terminal 1 and restart with Ctrl+C then `npm run dev`)
|
|
|
|
---
|
|
|
|
## Step 7: Test It! (3 min)
|
|
|
|
### Option A: Sign Up a New User
|
|
|
|
1. Go to your mobile app or admin app
|
|
2. Sign up with a new email
|
|
3. Complete email verification
|
|
|
|
### Option B: Test from Clerk Dashboard
|
|
|
|
1. Go to [Clerk Dashboard](https://dashboard.clerk.com)
|
|
2. Navigate to: Users → Create User
|
|
3. Fill in details and save
|
|
|
|
### Watch the Magic ✨
|
|
|
|
**In Terminal 1 (dev server):**
|
|
```
|
|
Received webhook with ID user_abc123 and type user.created
|
|
✅ User user_abc123 created in database
|
|
```
|
|
|
|
**In Terminal 2 (clerk CLI):**
|
|
```
|
|
→ Received event user.created
|
|
→ Forwarding to http://localhost:3000/api/webhooks
|
|
← Response: 200 OK
|
|
```
|
|
|
|
---
|
|
|
|
## Verification Checklist
|
|
|
|
After testing, verify everything works:
|
|
|
|
- [ ] Both terminals are running without errors
|
|
- [ ] You see webhook logs in both terminals
|
|
- [ ] User appears in database (check with `npm run db:studio`)
|
|
- [ ] User data matches Clerk (email, name)
|
|
- [ ] Default role is 'client'
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### "Error: CLERK_WEBHOOK_SECRET not set"
|
|
|
|
**Fix:** Add the secret to `.env.local` and restart dev server.
|
|
|
|
### "Error verifying webhook"
|
|
|
|
**Fix:**
|
|
1. Copy the EXACT secret from `clerk listen` output
|
|
2. Make sure no extra spaces in `.env.local`
|
|
3. Restart dev server
|
|
|
|
### "Webhook not received"
|
|
|
|
**Fix:**
|
|
1. Verify both terminals are running
|
|
2. Check dev server is on port 3000
|
|
3. Try creating a new user again
|
|
|
|
### "User not in database"
|
|
|
|
**Fix:**
|
|
1. Check `npm run db:studio` - is database accessible?
|
|
2. Did schema migration run? (`npm run db:push`)
|
|
3. Check Terminal 1 for SQL errors
|
|
|
|
---
|
|
|
|
## What's Next?
|
|
|
|
✅ **Webhooks Working!** You can now:
|
|
|
|
1. **Set User Roles:**
|
|
- Go to Clerk Dashboard → Users
|
|
- Select a user
|
|
- Public Metadata: `{"role": "admin"}`
|
|
- Save (will sync to database automatically)
|
|
|
|
2. **Test Role API:**
|
|
```bash
|
|
curl -X POST http://localhost:3000/api/admin/set-role \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
-d '{"targetUserId": "user_abc", "role": "trainer"}'
|
|
```
|
|
|
|
3. **Read Full Documentation:**
|
|
- Setup Guide: `CLERK_WEBHOOK_SETUP.md`
|
|
- Testing Guide: `WEBHOOK_TESTING_GUIDE.md`
|
|
- Integration Summary: `CLERK_WEBHOOK_INTEGRATION_COMPLETE.md`
|
|
|
|
4. **Move to Production:**
|
|
- See `CLERK_WEBHOOK_SETUP.md` → Production section
|
|
- Configure endpoint in Clerk Dashboard
|
|
- Deploy with production webhook secret
|
|
|
|
---
|
|
|
|
## Common Commands Reference
|
|
|
|
```bash
|
|
# Start dev server
|
|
cd apps/admin && npm run dev
|
|
|
|
# Start webhook forwarding
|
|
clerk listen --forward-url http://localhost:3000/api/webhooks
|
|
|
|
# View database
|
|
cd packages/database && npm run db:studio
|
|
|
|
# Update database schema
|
|
cd packages/database && npm run db:push
|
|
|
|
# Check logs
|
|
# Just watch Terminal 1 (dev server) and Terminal 2 (clerk CLI)
|
|
```
|
|
|
|
---
|
|
|
|
## Production Deployment Quick Steps
|
|
|
|
When you're ready to deploy:
|
|
|
|
1. **Clerk Dashboard:**
|
|
- Webhooks → Add Endpoint
|
|
- URL: `https://yourdomain.com/api/webhooks`
|
|
- Subscribe to: `user.created`, `user.updated`, `user.deleted`
|
|
- Copy signing secret
|
|
|
|
2. **Production Environment:**
|
|
```env
|
|
CLERK_WEBHOOK_SECRET=whsec_prod_xxxxxx
|
|
```
|
|
|
|
3. **Test:**
|
|
- Send test event from Clerk Dashboard
|
|
- Verify 200 response
|
|
- Check production database
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
- **Detailed Setup:** `CLERK_WEBHOOK_SETUP.md`
|
|
- **Testing Guide:** `WEBHOOK_TESTING_GUIDE.md`
|
|
- **Troubleshooting:** Both guides above + `TROUBLESHOOTING.md`
|
|
- **Clerk Docs:** https://clerk.com/docs/integrations/webhooks
|
|
|
|
---
|
|
|
|
**That's it! You're done.** 🎉
|
|
|
|
Webhooks are now syncing Clerk users to your database automatically. |