Clerk
Clerk users, waitlist entries and logins become contacts and events, verified with Svix signatures.
With the Clerk integration, every user becomes a contact, and so does the waitlist, while sign-up, update, deletion and (if you want) each login become events.
#Create the connection
In the dashboard, open Integrations › Your app and click Connect on the Clerk card. The connection has its own URL, which you paste into the provider, and it shows the step-by-step instructions on the same screen.
https://api.postal.so/integrations/crm/01a1c2d3-e4f5-7a6b-8c9d-0e1f2a3b4c5d/webhook
In Clerk, open Configure › Webhooks, click Add Endpoint, paste the URL and subscribe to the events in the table. On the endpoint page, reveal the Signing Secret (whsec_…) and paste it into the connection.
How Postal verifies requests
Clerk signs with Standard Webhooks (Svix): the svix-id, svix-timestamp and svix-signature headers, at most 5 minutes old.
App integrations count toward your plan limit (app_integrations). If they are not in your plan, the cards appear locked with an Upgrade button.
#Events
| Clerk event | Postal event | Contact |
|---|---|---|
user.created | clerk.user.created | Created with the primary email, first and last name; the Clerk ID becomes external_id. |
user.updated | clerk.user.updated | Updated by the Clerk ID (including an email change). |
user.deleted | clerk.user.deleted (a deletion) | By the Clerk ID; never creates a contact. |
waitlistEntry.created, waitlistEntry.updated | clerk.waitlistEntry.created, …updated | Email only. When the person becomes a user, the ID is added to the same contact. |
session.created (off by default) | clerk.session.created | A login: only updates contacts that already exist. |
For deletions, the connection says what to do with the contact: only record the event (the default), unsubscribe the contact (it stays in the audience, but receives no marketing) or delete the contact (no event, since the contact is gone). A deletion never creates a contact that Postal did not have.
#Connection settings
- Events: only the checked ones become a contact and an event; the others are ignored (the response is still
202). - Sync the name: updates the contact's first and last name with what the provider sends.
- Add to segment and Subscribe to topic: a static segment and a topic for every contact that arrives.
- When the user is deleted in the app: only record the event, unsubscribe the contact or delete it.
Everything the connection changes on a contact carries the source crm:<connection id> (last_change_source), and each delivery appears in the connection's log, with the result for each person. A delivery that the provider repeats (same ID) is not processed twice.
#Trigger automations
Each event is stored on the contact under the name clerk.user.created, with the properties from the table above. On the connection screen, the Create automation button next to each event opens a new automation with the Event received trigger already filled in. Through the automations endpoints, the trigger is {"type": "event", "event": "clerk.user.created"}.
Example: a welcome email at sign-up and, for the waitlist, a “you are on the list” email, with the “Waitlist” segment chosen on the connection. In the emails, the event properties are available as {{event.amount}} in the steps or as template variables ({{{amount}}}).
#Test it
On the Clerk endpoint, the Testing tab sends a sample user.created. Postal's response appears under Message Attempts, and the contact appears in the audience.