> ## Documentation Index
> Fetch the complete documentation index at: https://loops.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Incoming webhooks

> Send data to Loops from supported platforms using webhooks.

export const SupabaseIcon = () => {
  return <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 109 113">
      <path fill="url(#a)" d="M63.708 110.284c-2.86 3.601-8.658 1.628-8.727-2.97l-1.007-67.251h45.22c8.19 0 12.758 9.46 7.665 15.874l-43.151 54.347Z" />
      <path fill="url(#b)" fillOpacity=".2" d="M63.708 110.284c-2.86 3.601-8.658 1.628-8.727-2.97l-1.007-67.251h45.22c8.19 0 12.758 9.46 7.665 15.874l-43.151 54.347Z" />
      <path fill="#ffbca6" d="M45.317 2.071c2.86-3.601 8.657-1.628 8.726 2.97l.442 67.251H9.83c-8.19 0-12.759-9.46-7.665-15.875L45.317 2.072Z" />
      <defs>
        <linearGradient id="a" x1="53.974" x2="94.163" y1="54.974" y2="71.829" gradientUnits="userSpaceOnUse">
          <stop stopColor="#FF4A00" />
          <stop offset="1" stopColor="#ffbca6" />
        </linearGradient>
        <linearGradient id="b" x1="36.156" x2="54.484" y1="30.578" y2="65.081" gradientUnits="userSpaceOnUse">
          <stop />
          <stop offset="1" stopOpacity="0" />
        </linearGradient>
      </defs>
    </svg>;
};

<Info>
  Incoming webhooks allow you to:

  * Create and update contacts
  * Send events to trigger workflows
</Info>

This feature lets external platforms send webhook events directly to Loops, making it straightforward to create or update contacts in Loops automatically when changes happen in other platforms.

You can also trigger events when webhooks arrive in Loops so you can send automated email after something happens in your other accounts.

## How it works

External platforms send webhook events to Loops and Loops processes them to create and update contacts and trigger workflows.

For some platforms, you will need to manually create a webhook in the external platform, and for some it can be done via a simpler OAuth flow.

Note: we only process specific webhook events listed for each provider (and which contain an email address).

We return helpful messages in responses if there is an issue processing a webhook event. Check the webhook logs in your external platforms for more details.

For each type of webhook event, you can sync customer data like names and assign user groups, as well as trigger workflows via [events](/docs/events).

<img src="https://mintcdn.com/loops/5tmj8Grr_67voqWe/images/webhook-event-configuration.png?fit=max&auto=format&n=5tmj8Grr_67voqWe&q=85&s=4d22c35dba3a06b754d6475bd3f4dfe4" alt="Incoming webhook configuration" width="2280" height="1509" data-path="images/webhook-event-configuration.png" />

### Syncing contacts

The primary use case for incoming webhooks is to create and update contacts in your Loops audience. When data arrives in Loops, we grab the email address to create and update contacts in your Loops audience. To this end, we only support incoming events that contain an email address.

You can choose to update first and last name data from the webhook event as well.

Additionally, you can assign a user group value to each new contact, which helps create segments from webhook-created contacts.

Any new contact created via a webhook will have a source like "Stripe webhook" so you know where it originated from.

For events that reference record deletion, like Stripe's `customer.deleted` event, you can choose to unsubscribe or delete contacts in Loops.

### Subscribing to mailing lists

You can subscribe contacts to [mailing lists](/docs/contacts/mailing-lists) when they are created or updated via a webhook.

### Sending emails

Incoming webhooks can trigger emails if you connect events to [workflow triggers](/docs/workflows/triggers). This can be useful if you want to automatically send emails when something has happened in the external platform, for example a successful payment in Stripe or a new sign up in Clerk.

Just create a workflow using the **Event received** trigger and select the event you want to trigger on.

<img src="https://mintcdn.com/loops/IilSxQ8tuh5QpoyV/images/platform-event-trigger.png?fit=max&auto=format&n=IilSxQ8tuh5QpoyV&q=85&s=45a0c88eb8f7e408a8a9c136528498de" alt="Event received trigger" width="2280" height="1307" data-path="images/platform-event-trigger.png" />

You can also trigger custom events from incoming webhooks if you specify an event in the **Trigger an additional custom event** section in the configuration.

## Set up incoming webhooks

To start sending webhook events to Loops, go to your chosen [integration's settings page](https://app.loops.so/settings) in Loops.

### Stripe

For Stripe, install the Loops app, which lets you skip the creation of webhooks as it's handled for you. Everything is set up for you automatically.

Click the **Connect to Stripe** button to install the Loops app.

### Polar

For Polar, sign in to Polar by clicking the **Sign in to Polar** button. This will create a new webhook endpoint in Polar so there is no manual set up required.

Select the Polar organisation you want to connect to. You will be redirected back to Loops when you are done.

### Clerk and Supabase

A webhook endpoint will be created for you. Copy the endpoint URL and paste it into your external platform.

<img src="https://mintcdn.com/loops/K9TRANbphBauR0pJ/images/create-endpoint.png?fit=max&auto=format&n=K9TRANbphBauR0pJ&q=85&s=be75ea5d3e49aaa75248d6d157d5780b" alt="Endpoint form" width="2280" height="1556" data-path="images/create-endpoint.png" />

You will need to also copy-paste a signing secret between the platform and Loops for extra security. There are detailed instructions for how to do this in the Loops settings page.

## Supported platforms

Learn more about how to configure webhooks for each platform, and see which events we support, below.

<CardGroup>
  <Card
    title="Clerk"
    icon={
  <svg viewBox="0 0 18 18" fill="none" aria-hidden="true"><ellipse cx="8.99999" cy="9" rx="2.81249" ry="2.8125" fill="#FF4A00"></ellipse><path fill="#FF4A00" d="M14.0674 15.6591C14.3067 15.8984 14.2827 16.2945 14.0015 16.4829C12.571 17.4411 10.8504 17.9999 8.9993 17.9999C7.14818 17.9999 5.42758 17.4411 3.99704 16.4829C3.71589 16.2945 3.69186 15.8984 3.93115 15.6591L5.98648 13.6037C6.17225 13.418 6.46042 13.3886 6.69424 13.5084C7.3856 13.8626 8.16911 14.0624 8.9993 14.0624C9.82948 14.0624 10.613 13.8626 11.3044 13.5084C11.5382 13.3886 11.8263 13.418 12.0121 13.6037L14.0674 15.6591Z"></path><path fill="#FF4A00" d="M14.0022 1.51706C14.2834 1.70539 14.3074 2.10155 14.0681 2.34084L12.0128 4.39619C11.827 4.58195 11.5388 4.61129 11.305 4.49151C10.6136 4.13733 9.83014 3.9375 8.99996 3.9375C6.20403 3.9375 3.93748 6.20406 3.93748 9C3.93748 9.83018 4.13731 10.6137 4.49149 11.3051C4.61127 11.5389 4.58193 11.827 4.39617 12.0128L2.34083 14.0682C2.10154 14.3074 1.70538 14.2834 1.51705 14.0023C0.558857 12.5717 0 10.8511 0 9C0 4.02944 4.02942 0 8.99996 0C10.8511 0 12.5717 0.55886 14.0022 1.51706Z" fillOpacity="0.5"></path></svg>
}
    href="/integrations/clerk"
  />

  <Card
    title="Polar"
    icon={<svg
  viewBox="-0.5 -0.5 16 16"
  fill="none"
  xmlns="http://www.w3.org/2000/svg"
  aria-hidden="true"
  height="24"
  width="24"
>
  <path
    d="M7.5 14.337187499999999C3.7239375000000003 14.337187499999999 0.6628125 11.276062499999998 0.6628125 7.5 0.6628125 3.7239375000000003 3.7239375000000003 0.6628125 7.5 0.6628125c3.7760624999999997 0 6.837187500000001 3.061125 6.837187500000001 6.837187500000001 0 3.7760624999999997 -3.061125 6.837187500000001 -6.837187500000001 6.837187500000001Z"
    stroke="#FF4A00"
    stroke-linecap="round"
    stroke-linejoin="round"
    stroke-width="1"
  ></path>
  <path
    d="M7.5 14.337187499999999c-1.5104375 0 -2.7348749999999997 -3.061125 -2.7348749999999997 -6.837187500000001C4.765125 3.7239375000000003 5.9895625 0.6628125 7.5 0.6628125c1.5103749999999998 0 2.7348749999999997 3.061125 2.7348749999999997 6.837187500000001 0 3.7760624999999997 -1.2245 6.837187500000001 -2.7348749999999997 6.837187500000001Z"
    stroke="#FF4A00"
    stroke-linecap="round"
    stroke-linejoin="round"
    stroke-width="1"
  ></path>
  <path
    d="M5.4488125 13.653500000000001c-2.051125 -0.6837500000000001 -2.7348749999999997 -3.6845624999999997 -2.7348749999999997 -5.811625 0 -2.1270625 1.025625 -4.7860625 3.418625 -6.495375"
    stroke="#FF4A00"
    stroke-linecap="round"
    stroke-linejoin="round"
    stroke-width="1"
  ></path>
  <path
    d="M9.551187500000001 1.3464999999999998c2.051125 0.6837500000000001 2.7348749999999997 3.6846250000000005 2.7348749999999997 5.811625 0 2.1270625 -1.025625 4.7860625 -3.418625 6.495375"
    stroke="#FF4A00"
    stroke-linecap="round"
    stroke-linejoin="round"
    stroke-width="1"
  ></path>
</svg>}
    href="/integrations/polar"
  />

  <Card title="Stripe" icon="stripe-s" href="/docs/integrations/stripe" />

  <Card title="Supabase" icon={SupabaseIcon()} href="/docs/integrations/supabase" />
</CardGroup>


## Related topics

- [Polar](/docs/integrations/polar.md)
- [Clerk integration](/docs/integrations/clerk.md)
- [API Introduction](/docs/api-reference/intro.md)
- [Stripe integration](/docs/integrations/stripe.md)
- [Integrations](/docs/integrations.md)
