| name | user-state-debugging |
| description | Expert knowledge on debugging user account issues, diagnostic scripts (inspect-user-state.js), fix scripts (fix-user-billing-state.js, reset-user-onboarding.js), onboarding problems, billing sync issues, and Clerk vs database mismatches. Use this skill when user asks about "user stuck", "onboarding broken", "billing out of sync", "debug user", "reset user", or "user state". |
| allowed-tools | Read, Bash, Grep |
User State Debugging Expert
You are an expert in debugging user account issues and using diagnostic scripts. This skill provides knowledge about common user state problems, diagnostic tools, and fix scripts.
When To Use This Skill
This skill activates when users:
- Debug stuck onboarding flows
- Investigate billing sync issues
- Fix user account problems
- Troubleshoot trial activation failures
- Diagnose plan limit issues
- Resolve Clerk vs database mismatches
- Clean up test user data
Core Knowledge
Common User State Issues
Issue Categories:
-
Onboarding Stuck
- User can't complete signup
- Stuck at step-1 or step-2
- Never reaches "completed"
-
Billing Out of Sync
- Paid in Stripe but shows free plan
- Plan limits incorrect
billing_sync_status shows error
-
Trial Not Activated
- Completed checkout but trial inactive
trial_status is "pending"
- Trial dates are null
-
Clerk vs Database Mismatch
- User exists in Clerk but not in database
- Email mismatch between systems
- userId doesn't match
-
Plan Limits Wrong
- User has wrong campaign/creator limits
- Upgraded but limits not updated
- Can't create campaigns despite having limit
Primary Diagnostic Script
Script: /scripts/inspect-user-state.js
Usage:
node scripts/inspect-user-state.js --email user@example.com
node scripts/inspect-user-state.js --user-id user_2abc123xyz
What It Shows:
🔎 Inspecting user state
✅ Connected to Postgres
🆔 Resolved userId: user_2abc123xyz
👤 user_profiles:
{
id: 'xxx',
user_id: 'user_2abc123xyz',
email: 'user@example.com',
full_name: 'John Doe',
onboarding_step: 'completed',
trial_status: 'active',
trial_start_date: '2025-01-15T10:00:00Z',
trial_end_date: '2025-01-22T10:00:00Z',
current_plan: 'glow_up',
plan_campaigns_limit: 3,
plan_creators_limit: 1000,
stripe_customer_id: 'cus_xxx',
stripe_subscription_id: 'sub_xxx',
subscription_status: 'trialing',
billing_sync_status: 'webhook_subscription_created',
last_webhook_event: 'customer.subscription.created',
created_at: '2025-01-15T09:55:00Z'
}
🎯 campaigns count: 2
[
{ id: 'xxx', name: 'Campaign 1', status: 'active', created_at: '...' },
{ id: 'yyy', name: 'Campaign 2', status: 'draft', created_at: '...' }
]
🧰 scraping_jobs count: 5
🪵 events (latest 20): 15
⏱️ Done in 245ms
Key Fields to Check:
onboarding_step - Should be "completed" after signup
trial_status - Should be "active" if in trial
current_plan - Should match Stripe subscription
plan_campaigns_limit - Should match plan definition
stripe_subscription_id - Should exist if paid user
billing_sync_status - Shows last webhook result
last_webhook_event - Shows last Stripe webhook type
Fix Scripts
1. Reset User Onboarding
Script: /scripts/reset-user-onboarding.js
Use Case: User stuck in onboarding, need to restart
node scripts/reset-user-onboarding.js user_2abc123xyz
What It Does:
- Sets
onboarding_step to "pending"
- Clears trial dates
- Resets billing sync status
- Preserves Stripe data
2. Fix Billing State
Script: /scripts/fix-user-billing-state.js
Use Case: Billing out of sync, plan limits wrong
node scripts/fix-user-billing-state.js user_2abc123xyz
What It Does:
- Fetches subscription from Stripe
- Updates plan in database
- Sets correct plan limits
- Syncs trial status
3. Complete Onboarding and Activate Plan
Script: /scripts/complete-onboarding-and-activate-plan.js
Use Case: Manually complete onboarding for testing or fixing stuck user
node scripts/complete-onboarding-and-activate-plan.js user_2abc123xyz glow_up
node scripts/complete-onboarding-and-activate-plan.js user_2abc123xyz
What It Does:
- Sets
onboarding_step to "completed"
- Activates trial (if plan has trial)
- Sets plan limits
- Triggers welcome email
4. Delete User Completely
Script: /scripts/delete-user-completely.js
Use Case: Clean up test users, remove corrupted accounts
node scripts/delete-user-completely.js user_2abc123xyz
WARNING: Irreversible! Deletes:
- User profile
- All campaigns
- All scraping jobs
- All results
- All lists
5. Reset User to Fresh State
Script: /scripts/reset-user-to-fresh-state.js
Use Case: Keep user but remove all data
node scripts/reset-user-to-fresh-state.js user_2abc123xyz
What It Does:
- Deletes campaigns, jobs, results
- Resets usage counters
- Keeps user profile and billing
- Resets onboarding to pending
Diagnostic Patterns
Pattern 1: Onboarding Stuck Diagnosis
node scripts/inspect-user-state.js --email user@example.com
grep "STRIPE-WEBHOOK" logs/app.log | grep "user@example.com"
node scripts/complete-onboarding-and-activate-plan.js user_xxx glow_up
Pattern 2: Billing Sync Diagnosis
node scripts/inspect-user-state.js --user-id user_xxx
curl -X POST http://localhost:3000/api/billing/sync-stripe \
-H "x-dev-auth: dev-bypass" \
-H "Content-Type: application/json" \
-d '{"userId":"user_xxx"}'
Pattern 3: Trial Not Activated
node scripts/inspect-user-state.js --user-id user_xxx
curl -X POST http://localhost:3000/api/debug/trial-testing \
-H "x-dev-auth: dev-bypass" \
-H "Content-Type: application/json" \
-d '{"userId":"user_xxx","action":"activate"}'
Common Patterns
Pattern 1: Full User Diagnosis
echo "=== 1. User State ===" &&
node scripts/inspect-user-state.js --email user@example.com &&
echo "" &&
echo "=== 2. Billing Status ===" &&
curl http://localhost:3000/api/billing/status \
-H "x-dev-user-id: user_xxx" \
-s | jq &&
echo "" &&
echo "=== 3. Campaigns ===" &&
curl http://localhost:3000/api/campaigns \
-H "x-dev-user-id: user_xxx" \
-s | jq
Pattern 2: User Cleanup for Testing
node scripts/delete-user-completely.js user_test123 &&
Pattern 3: Bulk User Analysis
node scripts/list-users.js
node scripts/list-users.js | grep "trial_status.*pending"
Troubleshooting Guide
Problem: User Can't Complete Onboarding
Symptoms:
- Stuck at step-1 or step-2
- "Continue" button doesn't work
- No error message
Diagnosis:
node scripts/inspect-user-state.js --email user@example.com
Solution:
node scripts/reset-user-onboarding.js user_xxx
node scripts/complete-onboarding-and-activate-plan.js user_xxx free
Problem: User Paid But Shows Free Plan
Symptoms:
- Stripe shows active subscription
- Database shows
current_plan: 'free'
- User can't access paid features
Diagnosis:
node scripts/inspect-user-state.js --user-id user_xxx
grep "STRIPE-WEBHOOK" logs/app.log | grep "user_xxx"
Solution:
curl -X POST http://localhost:3000/api/billing/sync-stripe \
-H "x-dev-auth: dev-bypass" \
-d '{"userId":"user_xxx"}'
node scripts/fix-user-billing-state.js user_xxx
Problem: Plan Limits Not Enforced
Symptoms:
- User exceeds limits but no error
- Can create unlimited campaigns
plan_campaigns_limit is null or 0
Diagnosis:
node scripts/inspect-user-state.js --user-id user_xxx
curl http://localhost:3000/api/admin/plans \
-H "x-dev-auth: dev-bypass"
grep "PLAN_VALIDATION_BYPASS" .env.local
Solution:
node scripts/fix-user-billing-state.js user_xxx
curl -X POST http://localhost:3000/api/admin/users/set-plan \
-H "x-dev-auth: dev-bypass" \
-H "Content-Type: application/json" \
-d '{"userId":"user_xxx","plan":"glow_up"}'
Problem: User Not in Database But Exists in Clerk
Symptoms:
- User can log in to Clerk
- API returns "User not found"
getUserProfile returns null
Diagnosis:
node scripts/inspect-user-state.js --user-id user_xxx
Solution:
node scripts/test-auto-create-user.js user_xxx
curl http://localhost:3000/api/profile \
-H "Authorization: Bearer $CLERK_TOKEN"
Related Files
/scripts/inspect-user-state.js - Primary diagnostic script
/scripts/fix-user-billing-state.js - Fix billing sync
/scripts/reset-user-onboarding.js - Reset onboarding
/scripts/complete-onboarding-and-activate-plan.js - Force complete
/scripts/delete-user-completely.js - Delete user
/scripts/reset-user-to-fresh-state.js - Clean user data
/scripts/list-users.js - List all users
/scripts/find-user-id.js - Find user by email
/lib/db/queries/user-queries.ts - User query helpers
/app/api/debug/whoami/route.ts - Check current auth state
Quick Reference
Diagnostic Commands:
node scripts/inspect-user-state.js --email user@example.com
node scripts/inspect-user-state.js --user-id user_xxx
node scripts/list-users.js
node scripts/find-user-id.js user@example.com
Fix Commands:
node scripts/reset-user-onboarding.js user_xxx
node scripts/fix-user-billing-state.js user_xxx
node scripts/complete-onboarding-and-activate-plan.js user_xxx glow_up
node scripts/delete-user-completely.js user_xxx
node scripts/reset-user-to-fresh-state.js user_xxx
API Endpoints:
curl http://localhost:3000/api/debug/whoami \
-H "x-dev-auth: dev-bypass"
curl http://localhost:3000/api/billing/status \
-H "x-dev-user-id: user_xxx"
curl -X POST http://localhost:3000/api/billing/sync-stripe \
-H "x-dev-auth: dev-bypass" \
-H "Content-Type: application/json" \
-d '{"userId":"user_xxx"}'
Best Practices
- Always Inspect Before Fixing - Run
inspect-user-state.js first
- Check Stripe Dashboard - Verify subscription state matches
- Review Logs - Look for webhook errors before manual fixes
- Backup First - Export user data before destructive operations
- Test in Dev - Try fixes on test users first
- Document - Note what you fixed and why
- Verify Fix - Re-run inspection after fixing