> 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/email-provider/adobe-marketing-cloud/adobe-campaign-transactional-messaging.md).

# Adobe Campaign Transactional Messaging

Utilisez cette option lorsque votre organisation exécute **Adobe Campaign** et utilise déjà **la messagerie transactionnelle** pour les envois de production.

Avant d’aller plus loin, assurez-vous de comprendre comment fonctionne le fournisseur de script dans The Wallet Crew. Commencez par [Adobe Marketing Cloud](broken://spaces/rH9XqI2enbyJTGPIB8BO/pages/737aad8a9ea4e25206e969b3a67043e1768501b9) et le prérequis [Extensibilité d’EmailSender](broken://spaces/rH9XqI2enbyJTGPIB8BO/pages/8ea1b38b76adae2347e104627493d1baa1373856).

### Quand utiliser ceci

C’est un bon choix si vous disposez déjà de la gouvernance Adobe Campaign, des rapports et d’événements transactionnels préexistants.

### Configuration requise dans Adobe

Créez et publiez un **Événement de message transactionnel**.

Décidez ensuite si Adobe Campaign utilisera le HTML rendu par The Wallet Crew ou construira l’e-mail final à l’aide des modèles et variables Adobe Campaign.

Vous avez également besoin d’une méthode d’authentification sécurisée côté serveur prise en charge par votre déploiement Adobe Campaign. Elle repose souvent sur Adobe I/O ou IMS.

### Notes d’implémentation (appel d’événement)

Votre script rend généralement l’e-mail (si The Wallet Crew contrôle le HTML), puis appelle le point de terminaison de l’événement transactionnel avec le destinataire et le contexte.

Stockez ces valeurs en tant que secrets avant de tester :

* `adobe-clientId`
* `adobe-clientSecret`
* `adobe-campaign-transactionalUrl` (URL complète de l’Événement de message transactionnel)
* `adobe-orgId` (facultatif, selon votre configuration Campaign)
* `adobe-scope` (facultatif, selon votre configuration Adobe)

{% code title="Exemple Adobe Campaign (implémentation SendEmail)" %}

```javascript
import { getSecret } from "neo/secrets";

const CUSTOM_DOMAIN = "wallet.brand.com";
const TENANTID = "brand";

// Adobe IMS (identifiants client OAuth2)
const IMS_TOKEN_URL = "https://ims-na1.adobelogin.com/ims/token/v3";

async function getOptionalSecret(name, fallback) {
  try {
    return (await getSecret(name)) || fallback;
  } catch (e) {
    return fallback;
  }
}

/**
 * @typedef {Object} EmailData
 * @property {string} Sujet
 * @property {string} Corps
 */

async function sendEmail(recipient, emailTemplate, data, cultures, buildEmail) {
  const email = recipient;
  const countryCode = data["country"] || "fr";
  const language = `${cultures[0]?.toLowerCase()?.substring(0, 2) || "fr"}_${countryCode.toLowerCase()}`;
  const customerId = data["id.customerId"];

  if (!customerId) {
    throw new Error('Missing "id.customerId" in email data.');
  }

  const url = `https://${CUSTOM_DOMAIN}/${TENANTID}/carte?id.customerId=${encodeURIComponent(customerId)}`;

  // Conservez la disponibilité du rendu de The Wallet Crew.
  // Si Adobe Campaign possède le modèle, vous pouvez supprimer ceci et n’envoyer que des variables.
  const rendered = await buildEmail(emailTemplate);

  const transactionalUrl = await getSecret("adobe-campaign-transactionalUrl");

  const clientId = await getSecret("adobe-clientId");
  const clientSecret = await getSecret("adobe-clientSecret");
  const scope = await getOptionalSecret("adobe-scope", "openid,AdobeID");

  // Facultatif. Certaines configurations nécessitent des en-têtes d’ID d’organisation, d’autres non.
  const orgId = await getOptionalSecret("adobe-orgId", null);

  const headers = {
    "x-api-key": clientId,
    "Content-Type": "application/json",
  };
  if (orgId) headers["x-gw-ims-org-id"] = orgId;

  const result = await fetch(transactionalUrl, {
    Method: "POST",
    Authentication: {
      mode: "OAuth2.0",
      grantType: "clientCredentials",
      sendCredentialsAsFormParams: true,
      accessTokenUrl: IMS_TOKEN_URL,
      clientId,
      clientSecret,
      scope,
    },
    Headers: headers,
    Body: JSON.stringify({
      // La charge utile doit correspondre à la définition de votre Événement de message transactionnel.
      email,
      ctx: {
        url,
        language,

        // Facultatif si vous voulez qu’Campaign utilise le rendu de The Wallet Crew :
        subject: rendered.Subject,
        body: rendered.Body,

        // Métadonnées utiles :
        template: emailTemplate,
        customerId,
      },
    }),
    ThrowOnError: false,
  });

  if (result.StatusCode < 200 || result.StatusCode >= 300) {
    throw new Error(`L’appel Adobe Campaign a échoué (${result.StatusCode}) : ${result.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 ces points :

* Votre Événement de message transactionnel est publié et appelable.
* Le schéma de charge utile correspond à la définition de l’événement.
* Adobe Campaign accepte la requête et traite le message.

### FAQ

<details>

<summary><strong>Avons-nous besoin d’un Événement de message transactionnel ?</strong></summary>

Oui. Votre script doit appeler un point de terminaison d’Événement de messagerie transactionnelle publié. Cet événement définit le schéma de charge utile attendu et les variables disponibles dans votre modèle Adobe Campaign.

</details>

<details>

<summary><strong>Adobe Campaign peut-il rendre l’e-mail au lieu de The Wallet Crew ?</strong></summary>

Oui. Dans cette configuration, votre script n’envoie que les variables (par exemple, l’URL de téléchargement de la carte et les métadonnées client). Adobe Campaign possède le HTML, l’objet et les traductions.

</details>

<details>

<summary><strong>Quelle méthode d’authentification devons-nous utiliser ?</strong></summary>

Cela dépend de votre déploiement Adobe Campaign et de la manière dont votre organisation Adobe gère l’accès serveur à serveur. Cette page présente une approche basée sur IMS car elle est courante, mais vous devez aligner la méthode d’authentification finale avec votre équipe d’administration Adobe et la documentation officielle d’Adobe pour votre environnement.

</details>

<details>

<summary><strong>Quelle est la raison la plus courante du rejet d’une requête ?</strong></summary>

Incompatibilité de schéma. La définition de l’événement est stricte. Si les champs de votre charge utile ne correspondent pas à la structure attendue par l’événement, Campaign rejettera ou ignorera des champs, et les modèles afficheront des valeurs vides.

</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/email-provider/adobe-marketing-cloud/adobe-campaign-transactional-messaging.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.
