Sign in Create account
Integrations

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.

Connection URL (example)
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 eventPostal eventContact
user.createdclerk.user.createdCreated with the primary email, first and last name; the Clerk ID becomes external_id.
user.updatedclerk.user.updatedUpdated by the Clerk ID (including an email change).
user.deletedclerk.user.deleted (a deletion)By the Clerk ID; never creates a contact.
waitlistEntry.created, waitlistEntry.updatedclerk.waitlistEntry.created, …updatedEmail only. When the person becomes a user, the ID is added to the same contact.
session.created (off by default)clerk.session.createdA 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.