> For the complete documentation index, see [llms.txt](https://docs.thewalletcrew.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.thewalletcrew.io/connectors/fr/marketing-automation/bloomreach/extensibility.md).

# Extensibilité

L’extensibilité personnalise la façon dont le connecteur résout les contacts, mappe les champs et formate les événements. Elle est principalement utilisée par les équipes techniques lorsque le comportement par défaut ne correspond pas au modèle de données.

## Configuration

L’extensibilité est configurée dans la console d’administration de The Wallet Crew. Chaque point d’entrée est un script JavaScript stocké dans le connecteur Bloomreach **Paramètres avancés**.

La préproduction est le point de départ recommandé. Cela réduit le risque de perturber la segmentation de production et les déclencheurs de scénario.

{% stepper %}
{% step %}

#### Ouvrez les paramètres avancés du connecteur Bloomreach

<p align="center"><a href="https://admin.thewalletcrew.io/tenant/~/integrations/bloomreach/advanced" class="button secondary" data-icon="chevrons-right">Ouvrez la page des paramètres avancés</a></p>

Chaque point d’entrée a son propre emplacement de script :

* Contact Finder
* Event Interceptor
* Customer Mapper
  {% endstep %}

{% step %}

#### Commencez par le changement le plus petit possible

Contact Finder est généralement implémenté en premier lorsque l’e-mail n’est pas l’identifiant principal. Event Interceptor est généralement implémenté en premier lorsque la nomenclature des événements ou la gouvernance est requise.

Limiter les changements facilite l’isolation des problèmes d’attribution et d’ingestion.
{% endstep %}

{% step %}

#### Validez le comportement de bout en bout

La validation couvre généralement les deux sens du connecteur :

* Une activité fonctionne toujours (Mettre à jour la Carte / Notifier / Appliquer le privilège).
* Un événement est toujours attribué au contact Bloomreach attendu.

Lorsque Event Interceptor est utilisé, la validation doit confirmer le nom final de l’événement et les propriétés visibles dans Bloomreach.
{% endstep %}

{% step %}

#### Déployez en production et surveillez

Une fois que le comportement en préproduction correspond aux attentes, les mêmes scripts peuvent être appliqués à la production. Lorsque les événements sont utilisés comme déclencheurs de scénario, un déploiement pendant une fenêtre de changement est recommandé.
{% endstep %}
{% endstepper %}

## Points d’entrée de l’extensibilité

Les scripts du connecteur sont configurés dans les paramètres avancés du connecteur Bloomreach dans la console d’administration de The Wallet Crew.

{% hint style="warning" %}
Les changements peuvent avoir un impact sur le suivi des événements et l’exécution des scénarios. Un environnement de préproduction est recommandé pour les tests.
{% endhint %}

### Contact Finder

Une Carte est liée à des identifiants externes (e-mail, téléphone, ID membre, ...). Lorsqu’un événement se produit sur une Carte, le connecteur doit l’associer à un contact Bloomreach.

Contact Finder personnalise la façon dont ces identifiants sont convertis en identifiants de contact Bloomreach.

```js
/**
 * Récupérer l’identifiant de contact à partir des identifiants de la Carte afin de déterminer le contact Bloomreach d’une Carte.
 * L’implémentation par défaut utilise l’e-mail comme identifiant enregistré
 *
 * Cette méthode est asynchrone, ce qui permet d’appeler des services web externes si nécessaire.
 *
 * @param {Record<string, any>} identifiers - Paires clé-valeur des identifiants de la Carte
 * @returns {Promise<Record<string, string>>} Objet avec la clé 'registered' contenant l’identifiant de contact côté Bloomreach
 */
async function getContactIdentifiers(identifiers) {
  // Exemple : utiliser l’e-mail comme identifiant de contact
  // il s’agit de l’implémentation par défaut
  return { "registered": identifiers["email"] };
}

export default function (context) {
  context.register('extensions.bloomreach.contactFinder', {
    GetContactIdentifiers: getContactIdentifiers
  });
}
```

### Event Interceptor

Event Interceptor peut transformer `eventName` et `properties` avant d’envoyer l’événement à Bloomreach. C’est utile pour les conventions de nommage, le filtrage et l’enrichissement.

En renvoyant `null` supprime l’événement.

```js
/**
 * Intercepter les événements avant leur envoi à Bloomreach.
 * Utiliser ceci pour transformer dynamiquement les noms d’événements ou les propriétés.
 * Exemple : ajouter des champs calculés, renommer des propriétés, filtrer des données
 *
 * @param {Object} eventData - Objet de données d’événement
 * @param {string} eventData.Name - Nom de l’événement suivi
 * @param {Record<string, string>} eventData.Properties - Attributs/métadonnées de l’événement
 * @returns {Promise<Object>} Objet de données d’événement modifié - peut être null pour omettre cet événement
 */
async function interceptEvent({ Name, Properties }) {
  // Exemple : renvoyer l’événement tel quel (aucune transformation)
  // Modifier selon les besoins de votre cas d’utilisation
  return { Name, Properties };
}

export default function (context) {
  context.register('extensions.bloomreach.event.interceptor', {
    Intercept: interceptEvent
  });
}
```

### Customer Mapper

Customer Mapper personnalise le mappage entre les champs du formulaire d’inscription de The Wallet Crew et les champs Bloomreach. Cela est utilisé lorsque des données sont envoyées vers Bloomreach ou récupérées depuis Bloomreach avec des composants comme PassDataProvider et CustomerFlowElement.

```js
/**
 * Mappe les données du compte Wallet Crew en propriétés Bloomreach.
 *
 * @param {Object} account - Objet compte de The Wallet Crew avec des champs comme firstName, email, etc.
 * @param {Object} properties - Objet de propriétés Bloomreach à renseigner (modifié sur place)
 */
function mapToBloomreach(account, properties) {
  // Exemples de mappage - à adapter selon vos noms de champs
  if (account?.firstName) {
    properties["first_name"] = account.firstName;
  }
  if (account?.lastName) {
    properties["last_name"] = account.lastName;
  }
  if (account?.email) {
    properties["email"] = account.email;
  }
}

/**
 * Mappe les données client Bloomreach vers les champs du compte Wallet Crew.
 *
 * @param {Object} customer - Objet client Bloomreach avec Properties et Identifiers
 * @param {Object} account - L'objet de compte Wallet Crew à renseigner (modifié sur place)
 */
function mapFromBloomreach(customer, account) {
  // Exemples de mappage - à adapter selon vos noms de champs
  if (customer && customer.Properties) {
    if (customer.Properties["first_name"]) {
      account["firstName"] = customer.Properties["first_name"];
    }
    if (customer.Properties["last_name"]) {
      account["lastName"] = customer.Properties["last_name"];
    }
    if (customer.Properties["email"]) {
      account["email"] = customer.Properties["email"];
    }
  }
}

export default function (context) {
  context.register('extensions.bloomreach.mapper', {
    MapToBloomreach: mapToBloomreach,
    MapFromBloomreach: mapFromBloomreach
  });
}
```

## FAQ

<details>

<summary><strong>Contact Finder peut-il appeler des services externes ?</strong></summary>

Oui. Contact Finder est asynchrone et peut appeler des services externes si nécessaire.

C’est généralement utilisé lorsque l’identifiant de contact Bloomreach n’est pas stocké directement sur la Carte. Les schémas courants incluent la résolution d’un `memberId` en un e-mail, ou le mappage de plusieurs identifiants vers un seul identifiant Bloomreach « registered ».

</details>

<details>

<summary><strong>Un événement peut-il être supprimé avant d’atteindre Bloomreach ?</strong></summary>

Oui. Event Interceptor peut renvoyer `null` pour omettre un événement.

C’est utile pour la gouvernance et la réduction du bruit. Les exemples incluent le filtrage des événements de scan des Cartes de test, la suppression des propriétés sensibles ou l’ignorance des événements à fort volume qui ne sont pas exploitables dans Bloomreach.

</details>

<details>

<summary><strong>Quand Customer Mapper est-il utilisé ?</strong></summary>

Customer Mapper est utilisé lorsque les données Bloomreach sont lues ou écrites via des composants du connecteur. Les points d’entrée typiques sont PassDataProvider (lecture) et CustomerFlowElement (écriture).

Il n’est pas utilisé par chaque activité. Par exemple, l’envoi d’un message Notify ne nécessite pas Customer Mapper, sauf si les propriétés Bloomreach sont aussi utilisées comme source de données pour le rendu de la Carte.

Customer Mapper est l’endroit approprié pour harmoniser les conventions de nommage, les formats de données et les champs facultatifs. Il aide aussi à garder les modèles de Carte stables lorsque les noms des champs Bloomreach changent.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.thewalletcrew.io/connectors/fr/marketing-automation/bloomreach/extensibility.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
