Brevo Contact Sync
LIKE MAGIC can push your guest profiles into your own Brevo account as contacts. Each contact carries the guest's contact details, their communication preferences and a set of stay and revenue attributes, so you can build segments and campaigns in Brevo on real stay behaviour instead of an exported list.
The sync runs in one direction: LIKE MAGIC writes to Brevo. Changes you make to a contact inside Brevo are never read back into the guest profile, and a later push from LIKE MAGIC overwrites the attributes it sends.
This is a reference article for the person who owns marketing in Brevo. It tells you exactly when a contact is pushed and what each push contains.
1. What the Integration Doesโ
Whenever something meaningful happens to a guest in LIKE MAGIC, the platform builds the guest's current profile and sends it to Brevo as a contact, creating the contact if it does not exist yet and updating it if it does.
The profile that gets sent is always the current, complete picture of that guest, not just the part that changed. A guest who checks out with their fourth stay arrives in Brevo with their recalculated averages, room nights and revenue totals in the same push.
โน๏ธ This is a built-in integration with Brevo specifically. If you want to feed a different CRM, that is a separate build against Webhooks & Events and the Event & Data Hub.
2. Before You Startโ
๐งฉ The integration is enabled per account by LIKE MAGIC. Request activation via a Support Ticket.
What you bring:
- A Brevo account, on a plan that covers the contact volume you expect.
- A Brevo API key, created in your Brevo account and handed over with the activation request. LIKE MAGIC uses it to write contacts into your account, so treat it as a credential and send it the way your Support Ticket tells you to, not in a plain message.
- The custom attributes created in Brevo. Brevo only stores an attribute that already exists on your account, with a matching name and a compatible type. Create the attributes from section 4 before the first push, otherwise the contacts arrive with those values missing.
๐ก Ask for a one-time initial load together with the activation. It walks your existing guest profiles and creates them in Brevo, so you start with your full contact base instead of only the guests who happen to travel next.
3. When a Contact Is Pushedโ
A push happens on these events, and only on these events:
| Event | What it means |
|---|---|
| Profile created | A new guest profile comes into existence. |
| Profile updated | Guest data changes, for example through pre-check-in, the guest account or a staff edit. |
| Reservation checked in | The guest arrives. |
| Reservation checked out | The guest departs. Stay totals and averages are recalculated before the push. |
| Reservation no-show | The reservation is marked as a No-Show. |
| Reservation cancelled | The reservation is cancelled. |
โ ๏ธ A new booking on its own does not push the contact. There is no push when a reservation is created. A first-time guest who books today reaches Brevo when their profile is created or updated, or at the latest when they check in, not at the moment of booking.
4. What Is Pushedโ
Every push sends the attributes below. An attribute the guest profile has no value for is left out of the push rather than sent empty, so a value already held in Brevo stays as it is.
a) Identity and Contact Detailsโ
| Brevo attribute | Content |
|---|---|
EXT_ID | The guest's identifier in LIKE MAGIC. Stable across stays and the reliable key when you match Brevo data back to LIKE MAGIC. |
email | Email address. Also the key Brevo matches on, see section 5. |
FIRSTNAME, VORNAME | First name, written to both attributes. |
LASTNAME, NACHNAME | Last name, written to both attributes. |
GENDER | Gender as held on the profile. |
BIRTHDATE | Date of birth. |
NATIONALITY | Nationality as a country code. |
LANGUAGE | Preferred language as a language code. Use it to pick the language of a campaign. |
ADDRESS_1, ADDRESS_2 | Street address, first and second line. |
POSTAL_CODE, CITY, COUNTRY | Postal code, city and country code. |
SMS, WHATSAPP | Mobile number, written to both attributes. |
โน๏ธ The mobile number is only sent when it belongs to exactly one guest profile. Brevo requires a phone number to be unique across contacts, so a number shared by several profiles (a family booking under one number) is left out and the contact is written without it.
b) Consent and Accountโ
| Brevo attribute | Content |
|---|---|
OPT_IN | Whether the guest opted in to marketing communication. |
DOUBLE_OPT-IN | Yes or No, whether the guest confirmed that opt-in through the confirmation step. |
HAS_ACCOUNT | Whether the guest has a Guest User Account. |
COMMUNICATION_CHANNEL | The channel the guest prefers to be contacted on. |
c) Stay Behaviourโ
| Brevo attribute | Content |
|---|---|
FIRST_RESERVATION_CREATED | Date of the guest's first reservation. |
LAST_RESERVATION_DEPARTURE | Departure date of the most recent stay. |
AMOUNT_RESERVATIONS_CHECKEDOUT | Number of reservations the guest actually completed. |
ROOM_NIGHTS | Total nights stayed across all stays. |
AVERAGE_LENGTH_OF_STAY | Average nights per stay. |
AVERAGE_AMOUNT_OF_GUESTS_PER_STAY | Average number of guests per stay. |
AVERAGE_RESERVATION_LEAD_TIME | Average days between booking and arrival. |
MOST_USED_PROPERTY, LAST_PROPERTY | The property the guest books most often, and the most recent one. |
MOST_USED_CHANNEL, LAST_CHANNEL | The booking channel used most often, and the most recent one. Use it to separate direct bookers from OTA guests. |
MOST_USED_CHECKIN_METHOD, LAST_CHECKIN_METHOD | How the guest usually checks in, and how they did last time. |
MOST_USED_CHECKOUT_METHOD, LAST_CHECKOUT_METHOD | How the guest usually checks out, and how they did last time. |
d) Value and Revenueโ
Every amount covers completed stays and includes all charges on the folio (accommodation, Services and taxes).
| Brevo attribute | Content |
|---|---|
SUM_RESERVATIONS_PRICE | Total revenue from the guest across all completed stays. |
AVERAGE_SPEND_PER_STAY | Average revenue per completed stay. |
AVERAGE_DAILY_RATE | Average price per night, total revenue divided by room nights. |
AVERAGE_CANCELLATION_RATE | Share of the guest's reservations that were cancelled. |
AVERAGE_NOSHOW_RATE | Share of the guest's reservations that ended as a No-Show. |
5. How Contacts Are Matchedโ
Brevo identifies a contact by email address. Each push either creates a contact under that address or updates the existing one, so a returning guest does not produce a second contact.
Two consequences worth planning for:
- A guest profile without an email address has nothing for Brevo to match on and does not become a contact.
- A guest who books under two different email addresses becomes two contacts.
EXT_IDstill tells you they are the same person in LIKE MAGIC, so segment or de-duplicate onEXT_IDwhen that matters.
6. Marketing Consentโ
โ ๏ธ The push itself is not filtered by consent. A guest profile is sent to Brevo whether or not the guest opted in, with the opt-in state carried in the OPT_IN and DOUBLE_OPT-IN attributes. Deciding who may actually receive a marketing message happens on your side, in Brevo.
Before you send a campaign, build your list from a Brevo segment that filters on OPT_IN (and on DOUBLE_OPT-IN where your market requires a confirmed opt-in). Sending to the full contact list reaches guests who never consented.
๐ก Set those segments up once, right after activation, and use them as the basis for every campaign rather than filtering per send.
7. Troubleshootingโ
| What you see | What to check |
|---|---|
| A guest is missing from Brevo entirely | The profile has no email address (section 5), or nothing has happened to that guest yet that triggers a push (section 3). Consent is not the reason, contacts are pushed regardless of opt-in. |
| Guests from before the activation are missing | The initial load was not run. Request it via a Support Ticket. |
| An attribute stays empty on every contact | The custom attribute does not exist in Brevo yet, or its name or type does not match. Create it as described in section 2 and trigger a fresh push by having the guest data change. |
SMS and WHATSAPP are empty although the profile has a number | The number is used on more than one guest profile, so it is left out. |
| The contact did not update after a new booking | Reservation creation does not trigger a push. The contact updates on check-in, checkout, cancellation, no-show or the next profile change. |
| Stay totals look one stay behind | Totals are recalculated at checkout. A stay that has not been checked out yet is not counted. |
| Addresses ending in a particular domain never arrive | Email domains that your account treats as invalid, typically OTA alias addresses, are skipped instead of being pushed. |
8. Conclusionโ
Once Brevo is connected, your contact base keeps itself current: every arrival, departure and profile change refreshes the guest's attributes, and your segments follow along without an export. The two things to get right up front are the custom attributes in Brevo, so the data has somewhere to land, and your consent segments, so campaigns only reach guests who opted in.
Related reading:
- Event & Data Hub: the event backbone this integration runs on.
- Webhooks & Events: subscribe your own system to the same events to feed a different CRM.
- Guest Account & Loyalty: how guests become identifiable across stays, which is what makes the stay attributes meaningful.