> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.brevo.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.brevo.com/_mcp/server.

#### Legacy Tracker Documentation

For the legacy tracker doc, check our guide [here](https://tracker-doc.brevo.com/docs/getting-started-1).

### Identify a user through the identify() function

Use the `Brevo.identify()` method to identify users who visited your website. It works as follows:

* Once installed, the Brevo tracker adds a cookie for each of your visitors.
* When `Brevo.identify()` is called, Brevo associates this cookie with an email.
* If `Brevo.identify()` is called for a contact that already exists, Brevo updates its contact attributes based on the payload of the call.

To identify your visitor, call the `Brevo.identify` function like this:

```javascript
Brevo.push(function () {
    Brevo.identify({
        identifiers: {
            email_id: "email"   /*required*/
        },
        attributes: {            /*optional*/
            FIRSTNAME: "Jane",
            LASTNAME: "Doe",
            AGE: 32,
            GENDER: "FEMALE"
        },
    });
});

```

The parameters are defined below:

| Attribute    | Datatype    | Description                                                            | Value                                                        |
| :----------- | :---------- | :--------------------------------------------------------------------- | :----------------------------------------------------------- |
| `email_id`   | String      | Email address of the website visitor. Required.                        | [visitor@email.com](mailto:visitor@email.com)                |
| `attributes` | JSON object | JSON object holding your visitor’s contact attribute values. Optional. | Any of your visitor’s contact attributes. See example below. |

When sending `attributes`:

* If the contact does not exist yet, Brevo creates it with the attributes you send.
* If the contact already exists, Brevo updates it.
* If an attribute in the call does not exist in your contact database, Brevo ignores it.

#### Properties and contact attributes

Contact attributes and the data you pass in the `properties` object overlap.

If the contact exists in Brevo, attributes matching **Properties** are updated each time `Brevo.identify()` is called.

`properties` that do not correspond to existing contact attributes can only be used in your automation workflows, unless you add them as attributes from your Contacts section or via the Brevo API.

**Example**

```javascript
var email = "John.Doe@email.com"; /*required*/

var properties = {	/*optional*/
  FIRSTNAME : "John",
  LASTNAME : "Doe",
  id : "10001",
  plan : "diamond",
};
Brevo.push([
  "identify", {
    identifiers : {
      email_id : email
    },
    attributes : properties
  }
]);

```

### Passing an external identifier (EXT\_ID)

If you already track your users by a stable external identifier — for example a CRM ID — you can pass it to `Brevo.identify()` as an attribute using the reserved key `EXT_ID`. Brevo stores it on the contact and uses it in its contact resolution logic alongside `email_id`.

```javascript
Brevo.push(function () {
    Brevo.identify({
        identifiers: {
            email_id: "jane@example.com"
        },
        attributes: {
            EXT_ID: "user_12345",
            FIRSTNAME: "Jane",
            LASTNAME: "Doe"
        }
    });
});
```

* `email_id` in `identifiers` is required by `Brevo.identify()`.
* `EXT_ID` is unique per Brevo account: two contacts in the same account cannot share the same `EXT_ID`.
* The same pattern applies to `SMS`, `WHATSAPP`, and `LANDLINE_NUMBER` — pass them under `attributes`.