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

# Integrations

> Connect the tools where your customers already show up. Each notice becomes a Contact, its Company and, if you want, an Opportunity.

An **Integration** is a tool outside Brein connected to your workspace. The tool tells Brein when something happens: someone books a meeting, pays, fills out a form or signs up. Brein receives the notice, recognizes the person and creates their **Contact** and their **Company**. If you want, it also opens an **Opportunity** in the Pipeline and stage you choose.

There is no code. You copy an address, paste it into the tool and you are done. If your tool is not on the list, connect it as [Other tool](/integrations/other-tool).

Integrations live in **Settings → Integrations**. Only the workspace owner or an admin can connect them and confirm how their notices are read.

## Tools with a template

A template already knows how to verify the tool's notices and which fields to read.

| Tool | Which notice Brein uses | Guide |
| - | - | - |
| Cal.com | A new booking | [Cal.com](/integrations/calcom) |
| Calendly | A new invitee | [Calendly](/integrations/calendly) |
| Stripe | A completed payment or a paid invoice | [Stripe](/integrations/stripe) |
| Tally | A form response | [Tally](/integrations/tally) |
| Typeform | A form response | [Typeform](/integrations/typeform) |
| Jotform | A form response | [Jotform](/integrations/jotform) |
| Webflow | A form submitted on your site | [Webflow](/integrations/webflow) |
| Shopify | A new customer | [Shopify](/integrations/shopify) |
| Hotmart | An approved purchase | [Hotmart](/integrations/hotmart) |
| Clerk | A new user | [Clerk](/integrations/clerk) |
| PostHog | An event from an identified person | [PostHog](/integrations/posthog) |

## Other tool

Any tool that can send a webhook can connect. Brein gives you a secret address, you wait for the first real notice, Brein suggests what each field is and you confirm. The step-by-step guide is in [Other tool](/integrations/other-tool).

## What happens to each notice

Each notice that comes in is an **Arrival**. It is stored exactly as it came and ends in one of these results. You see them on the Integration's page.

| Result | What it means | What to do |
| - | - | - |
| **Accepted** | It reached the CRM: Contact, its Company and, if you asked, an Opportunity. | Nothing. |
| **Duplicate** | Brein already had this same notice, by its id or by its content. No new Arrival is created and nothing changes. | Nothing. This is normal: tools retry. |
| **No person** | The notice has no email, phone or LinkedIn, or the email is one that does not count (see below). There is nobody to create. | Check whether the field exists in the notice. If you send it in another field, fix the mapping and reprocess. |
| **Not understood** | The notice does not look like what the mapping expects, or the Integration has no mapping yet. | Confirm or fix the mapping and reprocess. |
| **Pending decision** | The email belongs to one Contact and the phone to another. Brein does not guess. | A person chooses which one it goes to. |
| **Failed** | Brein tried to apply it five times and could not. | Reprocess it. If it fails again, tell us. |

A signature that does not match is rejected and logged, and nothing is created. A kind of notice the Integration does not use, such as a cancelled booking, is received and ignored, with no error and no Arrival.

## How Brein recognizes a person

1. First by **email**. If a Contact with that email already exists, Brein fills in what is missing and does not duplicate it.
2. With no email, by **phone**.
3. LinkedIn is saved on the Contact, but it cannot recognize anyone yet.

Some values do not count, because they do not identify a person:

* Test or shared-mailbox emails: `test@`, `info@`, `contacto@`, `hola@`, `ventas@`, `admin@`, `soporte@`, `noreply@` and similar, plus `example.com` and `test.com`. A `test+1@` counts as `test@`.
* Emails from free domains (`gmail.com`, `hotmail.com`, `outlook.com`, `yahoo.com` and similar) do create the Contact, but **do not create a Company**, because the domain belongs to the provider and not to the person's company.

## What Brein keeps

* **What you ignore is not stored.** Each field of the notice goes to a Contact field, a Company field, **history only** or **ignore**. What you send to ignore never reaches the Contact. A field that shows up later and that nobody decided stays as a **new field, undecided**, and is not stored either until you decide it.
* **The raw notice is deleted after 30 days.** The same goes for the example from the first time. The Arrival, its result, the Contact and its trail stay. Without the raw notice there is nothing left to reprocess. Arrivals that are still waiting (queued or pending decision) keep theirs until they are resolved.

## Reprocess

If an Arrival ended up **no person** or **not understood**, fix the mapping on the Integration's page and use **Reprocess**. You can reprocess one or all of that Integration's Arrivals. Brein reads them again with today's mapping:

* Those that now carry a person go back to the queue and are applied.
* Those that still have no person change result or stay as they were.
* Those older than 30 days cannot be reprocessed, because their raw notice is already gone.

A **failed** Arrival is also reprocessed from the Integration. From your agent, `arrival_read` shows them and `arrival_propose_reprocess` prepares the reprocess of a failed one, which is applied only with your yes.

## For developers

The door has its own contract. See [Send events to Brein](/api/door) for the route, the signature and the response codes.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.