---
title: "Linkbreakers + Brevo: sync QR code contacts to your Brevo lists"
description: "Connect Brevo with an API key and every person who scans your QR codes and gives their email or phone is created or updated as a Brevo contact, added to the list you choose, with their name and form answers in contact attributes. Setup, what is synced, how consent and the blocklist work, and the Assistant and MCP tools."
canonical: "https://linkbreakers.com/help/article/linkbreakers-brevo-integration-qr-triggered-email-and-crm"
last-updated: 2026-11-09
---

# Linkbreakers + Brevo: sync QR code contacts to your Brevo lists

> Connect Brevo with an API key and every person who scans your QR codes and gives their email or phone is created or updated as a Brevo contact, added to the list you choose, with their name and form answers in contact attributes. Setup, what is synced, how consent and the blocklist work, and the Assistant and MCP tools.

:::try-ai-prompt {"prompt":"Connect Brevo with my API key xkeysib-..., add synced contacts to my Brevo list for the spring campaign, and add only people who gave marketing consent to that list","description":"Connect Brevo with the Assistant.","target":"assistant"}:::

## Short answer

Linkbreakers connects to Brevo directly. In the dashboard, open **Integrations**, pick **Brevo**, paste a Brevo API key (`xkeysib-...`) and select **Connect**. From then on, every person who goes through one of your links or QR codes and whose email or phone Linkbreakers knows, for example after a form, is created or updated as a Brevo contact. Their first and last name go to `FIRSTNAME` and `LASTNAME`, their form answers go to the Brevo contact attributes with the same names, and they are added to the Brevo list you choose.

No Zapier, Make or webhook is needed. The integration is available on every plan.

## Quick summary

- Connect once per workspace with a Brevo API key from **SMTP & API > API keys**
- Contacts are created or updated, matched on email (or, with no email, on the SMS number)
- Optionally added to one Brevo list, ready for your campaigns
- First name, last name and phone (in international format) are filled in
- Form answers go to the Brevo contact attributes of the same name (text, number, date or boolean), or to the attribute you map them to
- Marketing consent: a new contact who did not consent is created blocklisted for email and SMS, and you can add only the people who consented to the list
- Only people's visits: bots, link previews and AI agents never become contacts
- Also set up from the Assistant, the MCP server or the REST API

## How it works

A contact is synced when a visitor goes through a step of a link's workflow and Linkbreakers knows their email or phone. That is usually right after a [form](/help/article/how-to-create-a-form), but it can also come from the chat bot or any step that saves visitor data. Linkbreakers sends the contact to Brevo from its servers, once per step, at the moments the connection covers (all of them by default).

Brevo matches the contact on its email. If the visitor gave no email, the phone is used as the `SMS` attribute and the contact is matched on it. A contact that already exists is updated, never duplicated, and keeps the lists it is already in.

## Connect Brevo

1. In Brevo, open **SMTP & API > API keys** and select **Generate a new API key**. An SMTP key (`xsmtpsib-...`) does not work: Linkbreakers needs an API key, which starts with `xkeysib-`. If you restrict API access to authorized IPs in Brevo, allow Linkbreakers or turn the restriction off.
2. In Linkbreakers, open **Integrations** in the dashboard and pick **Brevo**.
3. Paste the key in **Brevo API key** and select **Connect**. Linkbreakers checks the key against Brevo before storing it.
4. Under **Add contacts to a list**, choose the Brevo list contacts join, or **No list: contacts only**.
5. Set the options and the delivery setting below, then save.

The key is encrypted when it is stored and never shown again. The page shows the Brevo company name or account email instead, so you can tell which account is connected.

## What gets synced

| Linkbreakers | Brevo |
|---|---|
| Email | Contact email |
| Phone, in international format (`+33...`) | `SMS` attribute |
| First name | `FIRSTNAME` |
| Last name | `LASTNAME` |
| Form answers and other visitor data | Contact attributes with the same name, or the one you map them to |
| The list you chose | The contact's lists (added, never removed) |

Answers only reach Brevo when the attribute exists there with a matching type. Create the attributes in Brevo under **Contacts > Settings > Contact attributes** (text, number, date or boolean), with the same names as your form fields. **Test connection** on the Brevo page lists the attribute names Linkbreakers can write to. Category, multiple-choice and calculated attributes, and the identifiers (`EMAIL`, `SMS`, `WHATSAPP`, `EXT_ID`), are never written from an answer.

## Options

**Which answer goes to which field.** An answer whose key is already a Brevo attribute goes there by itself. For the others, map the Linkbreakers answer to a Brevo attribute.

**Marketing consent.** Choose the answer where people agree to hear from you: the **Linkbreakers consent** (a Consent field on your form, or the marketing consent goal of the [chat bot](/help/article/how-to-add-an-ai-chat-bot-to-a-qr-code)), or any other answer, such as a checkbox of your own. Then tick **Add to the list only those who consented**.

Brevo has no tags and no double opt-in that Linkbreakers can start, so those options are not shown for Brevo.

## Marketing consent in Brevo

Brevo has no "subscribed" flag per contact other than the blocklist, and a contact Brevo creates without it can receive email and SMS campaigns. So Linkbreakers sets the blocklist in one case only:

- **A new contact who did not say yes** to your consent answer (or anyone, when no consent answer is chosen) is created blocklisted for email and SMS, so no campaign reaches them
- **A new contact who said yes** is created without the blocklist, ready for your campaigns
- **An existing contact keeps their status**: Linkbreakers never sends them a blocklist, and never lifts one, so a contact who unsubscribed stays unsubscribed, even if they are added to a list again

Brevo cannot tell that blocklist from an unsubscribe, so if a visitor first synced without consent agrees later, Linkbreakers does not lift it: unblock them in Brevo if you want to reach them.

In Brevo, campaigns go to lists, so the list is the other place consent matters. With a consent answer chosen and **Add to the list only those who consented** ticked, everyone is synced as a contact, but only people who said yes join the list. Without it, everyone with an email or phone joins the list.

The Linkbreakers consent field is never pre-ticked, and each answer is kept on the visitor's profile with the wording they agreed to and when, so you can show where a contact's consent came from.

## Which visitors and which links

The Brevo page has the same three settings as the other Linkbreakers integrations:

- **Where**: every link, or only some links, directories and tags
- **When**: the moments of a visit (Entry, Interaction, Routing, Exit), or specific steps
- **What is sent**: all visitor data, only some, or just the visit. Email and phone are always sent, since they are what makes a contact

Only visits by people are synced. Crawlers, link previews, AI agents and automated browsers never become contacts (see [how Linkbreakers detects AI agents and automated browsers](/help/article/how-linkbreakers-detects-ai-agents-and-automated-browsers)). Visits past your plan's tracked visits allowance are not synced.

## What is not synced

- Visitors with neither an email nor a phone
- A phone Brevo cannot read: only international numbers (`+` and the country code) go to `SMS`. A visitor known only by a national number is skipped. If Brevo refuses the phone because another contact already has it, the contact is synced with its email and without the phone
- Answers with no matching Brevo attribute
- Unsubscribes or edits made in Brevo: nothing comes back to Linkbreakers

## Check that it works

The **Activity** section shows how many contacts Brevo accepted and when the last one was synced. If Brevo refuses a contact, its reason shows there as the last error until the next contact goes through. A failed contact is not retried: fix the cause (a revoked key, a deleted list) and the next visit syncs again.

## Set it up from the Assistant, MCP or the API

**Assistant**: in the dashboard, ask "Connect Brevo with my API key and add contacts to my Newsletter list".

**MCP server**: an agent connected to the [Linkbreakers MCP server](/help/article/mcp-server-setup) has `contact_integration_connect`, `contact_integration_lists`, `contact_integration_update`, `contact_integration_fields`, `contact_integration_test`, `contact_integration_get`, `contact_integrations_list` and `contact_integration_disconnect`, with the tool `CONTACT_TOOL_BREVO`.

**REST API**, with a token that has the `integrations:write` scope:

```bash
curl -X POST https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_BREVO/connect \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"apiKey": "xkeysib-..."}'

curl https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_BREVO/lists \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN"

curl -X PATCH https://api.linkbreakers.com/v1/integrations/contacts/CONTACT_TOOL_BREVO \
  -H "Authorization: Bearer $LINKBREAKERS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contactListId": "12", "options": {"consentAttributeKey": "$marketingConsent", "listRequiresConsent": true}}'
```

See [set up every Linkbreakers integration with an AI agent](/help/article/set-up-linkbreakers-integrations-with-an-ai-agent-mcp) for the other integrations an agent can configure.

## When to use webhooks instead

The native connection creates contacts and adds them to a list. To send a transactional email the moment someone scans, or to update objects other than contacts, use a Brevo automation that starts when a contact joins the list, or send [Linkbreakers webhooks](/help/article/how-do-webhooks-work-in-linkbreakers) to Zapier, Make or n8n and call Brevo from there.

## Limits and caveats

- **One Brevo account and one list per workspace.** Use a workspace per client to send each client's contacts to their own Brevo account
- **Attributes must exist in Brevo** with a matching type, or the answer is left out
- **No tags or double opt-in** from Linkbreakers, since Brevo has neither for this kind of sync
- **No retries.** A contact Brevo refuses is reported on the page, not sent again
- **One way.** Linkbreakers writes to Brevo; it reads nothing back but your lists and attributes

## Frequently asked questions

### Do I still need Zapier or Make to connect Brevo?

No. Linkbreakers syncs contacts to Brevo directly with your API key. Webhooks and automation platforms are only needed for things the native connection does not do, such as sending a message on scan.

### Will someone who unsubscribed in Brevo be subscribed again?

No. Linkbreakers never lifts a Brevo blocklist and never changes an existing contact's status, and adding a blocklisted contact to a list does not lift the blocklist.

### Can I add only people who gave consent to my list?

Yes. Choose the consent answer under **Marketing consent** and tick **Add to the list only those who consented**. Everyone else is still created as a contact, outside the list, and blocklisted if they are new to Brevo.

### Why are some form answers missing in Brevo?

The answer's key has no Brevo attribute with a matching type. Create the attribute in Brevo, or map the answer to an existing one under **Which answer goes to which field**. **Test connection** lists the attributes Linkbreakers can write to.

### What happens when I disconnect Brevo?

Visitors stop being synced and the stored key is deleted. Contacts already in Brevo stay there.

## Sources

- Linkbreakers Brevo integration page, API and MCP tools, checked in the product on 2026-11-09.
- Brevo API reference: https://developers.brevo.com/

## Last reviewed

2026-11-09 by Laurent Schaffner.
