π΅ POST - Clerk Webhook
Clerk Webhook
Handle Clerk webhook events to automatically sync organization member data
POST
This endpoint receives webhook events from Clerk and automatically updates the cached organization member data in the database. This keeps member information up-to-date in real-time without needing to constantly query the Clerk API.
Triggered when a new organization is created.
Actions:
Triggered when organization details are updated (e.g., name change).
Actions:
Triggered when a member joins an organization.
Actions:
Triggered when a member leaves or is removed from an organization.
Actions:
Triggered when a memberβs role or details change.
Actions:
Triggered when an organization is deleted.
Actions:
Query cache status in database:
No authentication required - This is a public webhook endpoint. This
endpoint is called by Clerk, not by your application directly. You must
configure this URL in your Clerk Dashboard under Webhooks.
Headers
Svix message ID for webhook verification
Svix timestamp for webhook verification
Svix signature for verifying the request authenticity
Request Body
The request body is a raw Clerk webhook event payload. The endpoint handles the following event types:organization.created
Triggered when a new organization is created.
Actions:
- Creates organization record in database
- Fetches and stores all organization members
- Sets initial
members_synced_attimestamp
organization.updated
Triggered when organization details are updated (e.g., name change).
Actions:
- Updates organization name in database
- Refreshes member list to ensure accuracy
organizationMembership.created
Triggered when a member joins an organization.
Actions:
- Fetches fresh member list from Clerk API
- Updates cached member data in database
- Ensures new member appears immediately in member queries
organizationMembership.deleted
Triggered when a member leaves or is removed from an organization.
Actions:
- Fetches fresh member list from Clerk API
- Updates cached member data in database
- Removed member no longer appears in queries
organizationMembership.updated
Triggered when a memberβs role or details change.
Actions:
- Fetches fresh member list from Clerk API
- Updates cached member data with new role/details
organization.deleted
Triggered when an organization is deleted.
Actions:
- Clears member list (sets to empty array)
- Keeps organization record for historical/audit purposes
Response
"success" when the webhook was processed successfullyThe type of event that was processed
Errors
| Status | Description |
|---|---|
| 400 | Missing webhook signature headers or invalid JSON |
| 401 | Invalid webhook signature |
Benefits
This webhook integration provides:- Real-time Updates: Member changes reflected immediately
- Reduced API Calls: Cached member data reduces Clerk API usage by ~90%
- Better Performance: Member queries respond in ~10ms vs ~200ms
- Automatic Sync: No manual refresh needed
Clerk Dashboard Configuration
To configure this webhook in Clerk:- Go to Clerk Dashboard β Webhooks
- Click βAdd Endpointβ
- Enter the endpoint URL:
https://searchcompany-main.up.railway.app/webhooks/clerk - Select events to listen for:
organization.createdorganization.updatedorganization.deletedorganizationMembership.createdorganizationMembership.deletedorganizationMembership.updated
- Copy the signing secret and set it as
CLERK_WEBHOOK_SECRETenvironment variable
Environment Variables
| Variable | Description |
|---|---|
CLERK_SECRET_KEY | Clerk secret key for fetching member data |
CLERK_WEBHOOK_SECRET | Webhook signing secret from Clerk Dashboard |
SUPABASE_DATA_URL | Supabase database URL for storing member cache |
SUPABASE_API_KEY | Supabase API key |
How Member Caching Works
When a member-related event is received:- Webhook signature is verified for security
- Organization members are fetched from Clerk API
- Member data is stored in
clerk_organization_details.members(JSONB column) members_synced_attimestamp is updated- Subsequent calls to
GET /organization/{org_id}/membersserve cached data - Cache is valid for 5 minutes, but webhooks keep it fresh