> 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-journey-optimizer.md).

# Adobe Journey Optimizer

Utilisez cette option lorsque vous avez **Adobe Journey Optimizer (AJO)** et que vous souhaitez **des envois déclenchés par API** qui s’intègrent à une orchestration de parcours moderne.

Avant d’aller plus loin, assurez-vous de comprendre le fonctionnement du fournisseur de scripts 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 cette option

Vous choisissez généralement AJO lorsque vous souhaitez des envois quasi en temps réel et que votre équipe marketing gère déjà des parcours dans AJO.

### Configuration requise dans Adobe

Créez un parcours ou une campagne déclenchés par API pouvant accepter un appel d’exécution. Configurez ensuite l’action e-mail.

Au minimum, convenez de ce que votre script envoie à AJO.

* **HTML entièrement rendu** de l’équipe Wallet Crew (`Objet`, `Body`).
* Ou **uniquement les variables de contexte**, avec le modèle géré dans AJO.

{% hint style="warning" %}
Choisissez une seule stratégie de rendu. Évitez de dupliquer le templating à la fois dans The Wallet Crew et dans Adobe.
{% endhint %}

### Notes d’implémentation (OAuth + déclencheur)

AJO utilise Adobe IMS pour OAuth2 (identifiants client). Votre script demande généralement un jeton d’accès, puis appelle le point de terminaison d’exécution AJO pour votre campagne ou votre parcours.

{% hint style="info" %}
Les points de terminaison Adobe et la forme des charges utiles dépendent de la configuration de votre organisation, de la région et de la fonctionnalité AJO que vous utilisez (parcours ou campagne). Considérez l’extrait ci-dessous comme une structure de base et adaptez-le à la documentation officielle d’Adobe pour votre version du produit.
{% endhint %}

Enregistrez ces valeurs en tant que secrets avant de tester :

* `adobe-clientId`
* `adobe-clientSecret`
* `adobe-orgId`
* `adobe-sandboxName`
* `adobe-ajo-triggerUrl` (URL complète de déclenchement AJO)
* `adobe-scope` (facultatif, selon votre configuration Adobe)

{% code title="Exemple Adobe Journey Optimizer (implémentation de SendEmail)" %}

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

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

// Adobe IMS (identifiants client OAuth2)
// Votre environnement d'exécution fournit un `fetch` personnalisé qui peut effectuer des flux d'identifiants client OAuth.
const IMS_TOKEN_URL = "https://ims-na1.adobelogin.com/ims/token/v3";

/**
 * @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 construire le contenu de l'e-mail rendu.
 *
 * @param {string} recipient - Adresse e-mail cible.
 * @param {string} emailTemplate - Nom du modèle à générer.
 * @param {Object.<string, any>} data - Données du modèle transmises au script.
 * @param {string[]} cultures - Noms de culture disponibles provenant du 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 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('Champ "id.customerId" manquant dans les données de l'e-mail.');
  }

  // URL sur laquelle le client doit cliquer pour télécharger sa Carte.
  // Vous pouvez modifier le chemin pour l'adapter à votre structure de distribution.
  const url = `https://${CUSTOM_DOMAIN}/${TENANTID}/Carte?id.customerId=${encodeURIComponent(customerId)}`;

  // Facultatif : conserver le rendu de The Wallet Crew disponible.
  // Si votre modèle AJO est entièrement géré dans Adobe, vous pouvez supprimer ceci.
  const rendered = await buildEmail(emailTemplate);

  // La configuration AJO doit être fournie sous forme de secrets.
  // Utilisez une URL complète pour éviter de coder en dur des chemins spécifiques au produit dans ce script.
  // Exemple (selon la configuration) : "https://platform.adobe.io/journey/execute/<CAMPAIGN_OR_JOURNEY_ID>"
  const ajoTriggerUrl = await getSecret("adobe-ajo-triggerUrl");
  const orgId = await getSecret("adobe-orgId");
  const sandboxName = await getSecret("adobe-sandboxName");
  const clientId = await getSecret("adobe-clientId");
  const clientSecret = await getSecret("adobe-clientSecret");

  // Gardez le scope configurable. Différentes configurations Adobe nécessitent des scopes différents.
  // Exemples de valeurs observées dans la nature : "openid,AdobeID"
  let scope = "openid,AdobeID";
  try {
    scope = (await getSecret("adobe-scope")) || scope;
  } catch (e) {
    // Secret facultatif. Conservez le scope par défaut.
  }

  // Votre `fetch` d'exécution gère les identifiants client OAuth et joint le jeton.
  // Cela évite d'appeler IMS manuellement puis de transmettre le jeton Bearer.
  const result = await fetch(ajoTriggerUrl, {
    Method: "POST",
    Authentication: {
      mode: "OAuth2.0",
      grantType: "clientCredentials",
      sendCredentialsAsFormParams: true,
      accessTokenUrl: IMS_TOKEN_URL,
      clientId,
      clientSecret,
      scope,
    },
    Headers: {
      "x-api-key": clientId,
      "x-gw-ims-org-id": orgId,
      "x-sandbox-name": sandboxName,
      "Content-Type": "application/json",
    },
    Body: JSON.stringify({
      // La structure exacte du payload doit correspondre à votre configuration de campagne/parcours déclenché par l'API AJO.
      // Gardez ce contrat stable entre votre script et votre ressource AJO.
      recipient: {
        email,
        language,
      },
      context: {
        // Variable minimale pour un modèle géré par Adobe :
        url,

        // Variables facultatives si vous souhaitez réutiliser le rendu de l'équipe Wallet dans Adobe :
        subject: rendered.Subject,
        body: rendered.Body,

        // Métadonnées utiles pour le routage / le débogage :
        template: emailTemplate,
        customerId,
      },
    }),
    ThrowOnError: false,
  });

  if (result.StatusCode < 200 || result.StatusCode >= 300) {
    throw new Error(`AJO trigger call failed (${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 :

* AJO reçoit l'appel d'exécution et l'accepte.
* L'action e-mail AJO a accès aux champs de contexte que vous envoyez.
* Si vous transmettez du HTML, l'e-mail final s'affiche correctement dans les clients courants.

### FAQ

<details>

<summary><strong>Avons-nous besoin d'un « parcours déclenché par API » dans AJO ?</strong></summary>

Oui. Votre script a besoin d'un élément AJO publié pouvant être déclenché par un appel API. Le type exact d'élément (parcours ou campagne) dépend de ce qu'utilise votre organisation Adobe.

</details>

<details>

<summary><strong>AJO peut-il envoyer un e-mail créé par l'équipe Wallet ?</strong></summary>

Oui. Une pratique courante consiste à appeler `buildEmail()` dans votre script, puis Carte `objet` et `corps` comme contexte à AJO. Votre action e-mail AJO doit être configurée pour utiliser ces champs.

</details>

<details>

<summary><strong>Comment testons-nous sans envoyer d’e-mails à de vrais clients ?</strong></summary>

Utilisez un sandbox AJO si vous en avez un. Sinon, limitez les tests aux adresses internes et créez un parcours/campagne « test » dédié. Conservez le contrat de charge utile identique à la production pour éviter les ruptures de schéma de dernière minute.

</details>

<details>

<summary><strong>Pourquoi avons-nous besoin d’autant d’en-têtes Adobe ?</strong></summary>

Les passerelles AJO nécessitent généralement des en-têtes d’organisation, de sandbox et de clé API pour le routage et l’autorisation. L’ensemble exact peut varier selon la configuration et la région Adobe, alors considérez la documentation officielle d’Adobe comme source de référence pour votre environnement.

</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-journey-optimizer.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.
