# Marketo Engage (API d’e-mail transactionnel)

Utilisez cette option lorsque votre organisation utilise **Marketo Engage** et souhaite que les envois transactionnels soient suivis dans les journaux d'activité de Marketo.

Avant d'aller plus loin, assurez-vous de comprendre comment le fournisseur de script fonctionne dans The Wallet Crew. Commencez par [Adobe Marketing Cloud](https://app.gitbook.com/s/WLc8AHXW4tdrAXUBfrYF/connect/email-provider/adobe-marketing-cloud) et le préalable [Extensibilité EmailSender](https://app.gitbook.com/s/WLc8AHXW4tdrAXUBfrYF/connect/custom-connector/emailsender-extensibility).

### Quand l'utiliser

Ceci est souvent le modèle REST le plus simple, mais il suppose que vous gérez et approuvez le modèle d'e-mail dans Marketo.

### Configuration requise dans Marketo

Créez l'élément e-mail que vous souhaitez envoyer et faites-le approuver. Les règles d'approbation varient selon la configuration Marketo.

Décidez ensuite comment vous mappez la sortie de The Wallet Crew :

* Utilisez des jetons ou variables Marketo pour injecter `Objet` et `Corps`.
* Ou conservez l'objet et le corps dans Marketo et ne transmettez que les données contextuelles.

### Remarques d'implémentation (jeton + envoi)

Les instances Marketo sont spécifiques à une région. Votre script demande généralement un jeton d'accès Marketo, puis appelle le point de terminaison d'envoi transactionnel pour l'élément e-mail choisi.

Stockez ces valeurs en tant que secrets avant de tester :

* `marketo-baseUrl` (exemple : `https://123-ABC-456.mktorest.com`)
* `marketo-clientId`
* `marketo-clientSecret`
* `marketo-emailId` (l'identifiant de l'élément e-mail Marketo que vous envoyez)

{% hint style="info" %}
Les points de terminaison de jeton OAuth de Marketo peuvent différer légèrement selon l'instance et la configuration. Si votre point de terminaison de jeton Marketo requiert des paramètres de requête ou une méthode HTTP spécifique, adaptez les paramètres d'authentification en conséquence.
{% endhint %}

{% code title="Exemple Marketo Engage (implémentation SendEmail)" %}

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

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

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}/pass?id.customerId=${encodeURIComponent(customerId)}`;
  const rendered = await buildEmail(emailTemplate);

  const baseUrl = await getSecret("marketo-baseUrl");
  const clientId = await getSecret("marketo-clientId");
  const clientSecret = await getSecret("marketo-clientSecret");
  const marketoEmailId = await getSecret("marketo-emailId");

  const sendUrl = `${baseUrl}/rest/v1/email/${encodeURIComponent(marketoEmailId)}/send.json`;

  // Votre `fetch` d'exécution gère les identifiants OAuth client et attache le jeton.
  const result = await fetch(sendUrl, {
    Method: "POST",
    Authentication: {
      mode: "OAuth2.0",
      grantType: "clientCredentials",
      sendCredentialsAsFormParams: true,
      accessTokenUrl: `${baseUrl}/identity/oauth/token`,
      clientId,
      clientSecret,
    },
    Headers: {
      "Content-Type": "application/json",
    },
    Body: JSON.stringify({
      input: [
        {
          email,
          variables: [
            { name: "url", value: url },
            { name: "language", value: language },
            { name: "subject", value: rendered.Subject },
            { name: "body", value: rendered.Body },
            { name: "customerId", value: customerId },
            { name: "template", value: emailTemplate },
          ],
        },
      ],
    }),
    ThrowOnError: false,
  });

  if (result.StatusCode < 200 || result.StatusCode >= 300) {
    throw new Error(`Marketo send call failed (${result.StatusCode}): ${result.ResponseText}`);
  }
}

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

{% endcode %}

{% hint style="info" %}
Marketo exige que l'élément e-mail existe (et souvent qu'il soit approuvé) avant de pouvoir être utilisé pour des envois.
{% endhint %}

### Ce qu'il faut valider

Déclenchez un véritable e-mail transactionnel, puis validez ces points :

* L'élément e-mail existe et est approuvé.
* Marketo accepte l'appel d'envoi.
* Les variables correspondent à ce que votre modèle Marketo attend.

### FAQ

<details>

<summary><strong>Faut-il créer le modèle d'e-mail dans Marketo ?</strong></summary>

Oui. Marketo requiert un élément e-mail existant pour les envois transactionnels, et de nombreuses configurations exigent que l'élément soit approuvé. Votre script peut toujours passer des variables, mais Marketo a besoin de l'élément conteneur.

</details>

<details>

<summary><strong>The Wallet Crew peut-il toujours rendre le HTML ?</strong></summary>

Oui. Vous pouvez appeler `buildEmail()` et passer `subject` et `body` en tant que variables. Votre e-mail Marketo doit être conçu pour injecter ces variables aux bons endroits.

</details>

<details>

<summary><strong>Quelle est la manière la plus rapide de dépanner ?</strong></summary>

Vérifiez d'abord que l'élément est approuvé, puis consultez le corps de la réponse de l'API Marketo pour un code d'erreur spécifique. Si l'appel API réussit mais que l'e-mail s'affiche mal, vérifiez que votre modèle Marketo attend les mêmes noms de variables que ceux que vous envoyez.

</details>

<details>

<summary><strong>Pouvons‑nous utiliser différentes instances Marketo par environnement ?</strong></summary>

Oui. Configurez des secrets et des points de terminaison différents par client (staging vs production). Gardez la même nomenclature des variables entre les environnements pour éviter la dérive des modèles.

</details>
