# Salesforce Marketing Cloud

Utilisez ce connecteur lorsque vous souhaitez que The Wallet Crew envoie **des e-mails transactionnels** via **Salesforce Marketing Cloud**, tandis que Salesforce Marketing Cloud reste l’endroit où votre marque gère les actifs e-mail, le suivi et les rapports.

Cette intégration utilise le **fournisseur d’e-mails de script**. The Wallet Crew déclenche l’envoi. Votre script transmet ensuite l’événement à Salesforce Marketing Cloud.

## Fonctionnement

The Wallet Crew appelle votre implémentation de `runtime.scriptable.emailEngine.SendEmail`. Votre script appelle ensuite l’API REST de Salesforce Marketing Cloud pour déclencher un événement (en utilisant un `EventDefinitionKey`). Salesforce Marketing Cloud utilise cette charge utile d’événement pour générer et envoyer l’e-mail.

Ce modèle évite de dupliquer les modèles. Salesforce Marketing Cloud possède le modèle. The Wallet Crew n’envoie que les variables dont Salesforce Marketing Cloud a besoin, comme l’URL de téléchargement de la Carte et le libellé CTA localisé.

Si vous n’avez pas encore configuré le fournisseur de script, commencez par [Extensibilité EmailSender](/connectors/fr/custom-connector/emailsender-extensibility.md).

## Avant de commencer

Vous avez besoin de trois choses :

* Un **Installed Package** Salesforce Marketing Cloud
* pouvant appeler des API REST (client id + client secret). **déclenché par API**, exposant un `EventDefinitionKey`.
* Un identifiant stable dans votre charge utile d’e-mail Wallet Crew (exemple : `id.customerId`) pour générer l’URL de la Carte.

## Configuration requise dans Salesforce Marketing Cloud

Dans Salesforce Marketing Cloud, créez un point d’entrée déclenché par API et le contenu d’e-mail associé.

1. Créez un **Installed Package** et conservez le **Client Id** et **Client Secret**.
2. Créez l’asset d’envoi que vous souhaitez déclencher (généralement un événement d’entrée de parcours ou un événement API), puis copiez son `EventDefinitionKey`.
3. Assurez-vous que votre modèle d’e-mail Salesforce Marketing Cloud attend les mêmes noms de variables que ceux que vous enverrez dans `Données`.

{% hint style="info" %}
La configuration de Salesforce Marketing Cloud varie selon la configuration du compte et l’ensemble de fonctionnalités. Conservez un contrat de charge utile stable : les noms de champs dans `Données` doivent correspondre à ce que votre asset Salesforce Marketing Cloud attend.
{% endhint %}

## Activez Salesforce Marketing Cloud dans The Wallet Crew

Définissez le fournisseur sur `script` afin que The Wallet Crew appelle votre `SendEmail` implémentation.

{% code title="/server/emails.yml" %}

```yaml
provider :
  type: script
resources :
  - /locales/emails/
```

{% endcode %}

### Exemple de script (déclencher un événement Salesforce Marketing Cloud)

Cet exemple déclenche un événement Salesforce Marketing Cloud à l’aide du point de terminaison REST `interaction/v1/events`. Il envoie un titre localisé, un libellé CTA localisé et une URL de Carte Wallet Crew construite à partir d’un identifiant client.

{% hint style="warning" %}
Cette implémentation délègue le rendu à Salesforce Marketing Cloud. Le Wallet Crew `buildEmail()` le callback n’est intentionnellement pas utilisé.
{% endhint %}

{% code title="Exemple Salesforce Marketing Cloud (implémentation SendEmail)" %}

```javascript
const CUSTOM_DOMAIN = "wallet.brand.com";
const TENANTID = "brand";
const SMFC_DOMAIN = "xxx";

/**
 * @typedef {Object} EmailData
 * @property {string} Subject - Ligne d’objet rendue.
 * @property {string} Body - Contenu du corps rendu.
 */

/**
 * Envoyer un e-mail en utilisant le nom de modèle et les données fournis.
 * L’appelant fournit les cultures prises en charge et un rappel
 * pour générer le contenu de l’e-mail rendu.
 *
 * @param {string} recipient - Adresse e-mail cible.
 * @param {string} emailTemplate - Nom du modèle à rendre.
 * @param {Object.<string, any>} data - Données du modèle transmises au script.
 * @param {string[]} cultures - Noms de cultures disponibles fournis par le fournisseur de cultures.
 * @param {(templateName: string) => Promise<EmailData>} buildEmail
 * Fonction de rappel qui renvoie le contenu final de l’e-mail rendu.
 *
 * @returns {Promise<void>}
 */
async function sendEmail(recipient, emailTemplate, data, cultures, buildEmail){

  const customerId = data["id.customerId"];
  const url = `https://${CUSTOM_DOMAIN}/${TENANTID}/Carte?id.customerId=${customerId}`;  

  const locales = {
    "en": {
      title: "🎉 Votre compte est prêt – Ajoutez votre Carte au Wallet !",
      label: "Ajouter au Wallet"
    },
    "fr": {
      title: "🎉 Votre compte est prêt – Ajoutez votre Carte au Wallet !",
      label: "Ajouter au Wallet"
    }
  };

  const locale = locales[cultures[0]];

  const response = await fetch(`https://${SMFC_DOMAIN}.rest.marketingcloudapis.com/interaction/v1/events`,  {
    Méthode : "POST", 
    Authentification : {
        mode : 'OAuth2.0', 
        grantType : 'clientCredentials',
        accessTokenUrl : `https://${SMFC_DOMAIN}.auth.marketingcloudapis.com/v2/token`, 
        sendCredentialsAsFormParams: true,
        clientId: await getSecret('SFMC-CLIENTID'), 
        clientSecret : await getSecret('SFMC-CLIENTSECRET')
    }, 
    En-têtes : {
      "Content-Type": "application/json",
    },
    Corps : {
      "ContactKey": recipient,
      "EventDefinitionKey": "confirmationCompteNeostore",
      "Données": {
          "SubscriberKey": recipient,
          "EmailAddress": recipient,
          "Titre": locale.title,
          "URL": url,
          "LabelCTA": locale.label,
      }
    }
  });
  const responseData = JSON.parse(response.ResponseText); 
  if(!responseData?.eventInstanceId){
    throw new Error(`erreur lors de l'envoi du statut de l'e-mail personnalisé : ${response.StatusCode} - contenu : ${response.ResponseText}`)
  }
}

export default function(context) {
  context.register('runtime.scriptable.emailEngine', {
    SendEmail: sendEmail 
  })
}
```

{% endcode %}

### Ce qu'il faut valider

Déclenchez un véritable e-mail transactionnel, puis validez de bout en bout :

* The Wallet Crew appelle votre script sans erreur.
* L'appel API de Salesforce Marketing Cloud renvoie un `eventInstanceId`.
* Salesforce Marketing Cloud génère l'e-mail avec `Titre`, `URL`, et `LabelCTA`.
* Le CTA ouvre l'URL de The Wallet Crew et la carte peut être installée.

## Dépannage

Si les envois échouent, isolez le problème dans cet ordre :

* **L'OAuth échoue (401/403)**: le client id/secret est incorrect, révoqué ou le package installé n'a pas accès à l'API.
* **Aucun `eventInstanceId`**: le `EventDefinitionKey` est invalide, non publié, ou le schéma de la charge utile est rejeté.
* **Variables vides dans l'e-mail**: le modèle Salesforce Marketing Cloud attend des noms de champs différents de ceux que vous envoyez dans `Données`.
* **Langue incorrecte**: `cultures[0]` ne correspond pas à votre mappage de paramètres régionaux. Ajoutez un repli (exemple : par défaut à `en`).

## FAQ

<details>

<summary><strong>Qui possède le HTML de l'e-mail, Salesforce Marketing Cloud ou The Wallet Crew ?</strong></summary>

Salesforce Marketing Cloud possède le HTML dans ce modèle. The Wallet Crew envoie uniquement des variables (titre, libellé du CTA, URL) afin que votre équipe marketing puisse faire évoluer le modèle sans déployer de modifications Wallet Crew.

</details>

<details>

<summary><strong>Pouvons-nous toujours utiliser les modèles Wallet Crew et <code>buildEmail()</code>?</strong></summary>

Oui, mais cela devient une stratégie différente. Dans ce modèle, The Wallet Crew génère `Objet` et `Corps`, et Salesforce Marketing Cloud n'est utilisé que comme passerelle de livraison. Si vous le souhaitez, alignez l'asset Salesforce Marketing Cloud pour accepter le HTML rendu et éviter le double templating.

</details>

<details>

<summary><strong>Où stockons-nous les identifiants SFMC ?</strong></summary>

Stockez-les comme secrets du locataire et chargez-les à l'exécution (comme dans l'exemple avec `getSecret('SFMC-CLIENTID')` et `getSecret('SFMC-CLIENTSECRET')`). N'intégrez pas en dur les identifiants dans les scripts.

</details>

<details>

<summary><strong>Que devons-nous utiliser comme <code>Clé de contact</code>?</strong></summary>

Utilisez un identifiant de contact Salesforce Marketing Cloud stable. De nombreuses marques utilisent l’adresse e-mail, mais vous pouvez également utiliser un identifiant CRM si c’est la stratégie de clé de contact de votre Salesforce Marketing Cloud. Veillez à la garder cohérente avec la manière dont votre parcours/ressource résout les destinataires.

</details>


---

# Agent Instructions: 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:

```
GET https://docs.thewalletcrew.io/connectors/fr/email-provider/salesforce-marketing-cloud.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
