# Agir selon le résultat d'une demande dans n8n

Démarrez un workflow quand une demande est terminée, expire ou est annulée, ou mettez en pause le workflow qui l'a envoyée jusqu'à la réponse du destinataire, et bifurquez selon le verdict.

## Agir selon le résultat d'une demande dans n8n

n8n peut apprendre le résultat d'une demande de deux façons : un formbase Trigger qui s'exécute pour chaque demande d'un formulaire, ou un nœud Wait qui met en pause le workflow qui a créé la demande. Les deux se terminent par un Switch sur approve, decline ou changes.

<p>
  Il vous faut un <a href="/fr/guides/n8n/connect">credential formbase dans n8n</a>, et votre n8n doit être joignable depuis internet en
  HTTPS ; voir <a href="/fr/guides/n8n/install-the-node">Installer le nœud formbase dans n8n</a>. Pour bifurquer selon un verdict, le
  formulaire a besoin d'une <a href="/fr/requests/decisions-and-approvals">question de décision</a>. Ce guide utilise un formulaire
  d'approbation qui en a une.
</p>

<h2 id="trigger">Démarrer un workflow depuis le déclencheur</h2>

<h3 id="pick-the-event">1. Choisissez l'événement</h3>

<p>
  Ajoutez un <strong>formbase Trigger</strong>, choisissez le credential et le formulaire, et choisissez l'un des événements de demande sous{' '}
  <strong>Event</strong> :
</p>

<h3 id="test-the-trigger">2. Testez-le avec une vraie demande</h3>

<p>
  Une demande de test ne démarre jamais un déclencheur de demande, alors envoyez-en une vraie avec Delivery réglé sur None, comme dans{' '}
  <a href="/fr/guides/n8n/send-a-request">Envoyer une demande depuis un workflow n8n</a>, et ouvrez son lien vous-même. Puis cliquez sur{' '}
  <strong>Execute step</strong> et soumettez le formulaire dans les deux minutes.
</p>

<p>
  L'événement porte un objet <strong>data.request</strong> à côté des réponses. Son <code>outcome</code> vaut <code>approve</code>,{' '}
  <code>decline</code> ou <code>changes</code>, et son <code>externalId</code> est l'ID que vous avez réglé, pour retrouver l'enregistrement
  concerné par la demande. Chaque champ est dans le <a href="/fr/requests/callbacks#payload">payload du callback</a>.
</p>

<p>
  Les événements d'expiration et d'annulation sont difficiles à capter avec <strong>Execute step</strong>. Publiez plutôt le workflow et
  consultez <strong>Executions</strong>.
</p>

<h3 id="branch-on-the-outcome">3. Bifurquez selon le résultat</h3>

<p>
  Ajoutez un nœud <strong>Switch</strong> avec une règle de routage par verdict. Chaque règle compare{' '}
  <code>{'{{ $json.data.request.outcome }}'}</code> à une valeur ; activez <strong>Rename Output</strong> pour nommer la branche d'après
  elle :
</p>

<p>
  Bifurquez sur <code>data.request.outcome</code> plutôt que sur <code>data.answers.decision</code> : il est absent, pas juste une autre
  valeur, quand la demande a expiré ou a été annulée. Comparez les valeurs, jamais les libellés dans <code>data.display</code> : un libellé
  change quand vous renommez l'option ou que le destinataire répond dans une autre langue.
</p>

<p>
  Connectez un nœud à chaque branche, puis <strong>Publish</strong> le workflow. À partir de là, chaque demande terminée pour le formulaire
  l'exécute.
</p>

<h2 id="wait-for-the-outcome">Attendre le résultat dans le même workflow</h2>

<p>
  Ici, le workflow qui envoie la demande se met en pause jusqu'à la réponse du destinataire, puis continue. Cela prend trois changements au
  workflow de <a href="/fr/guides/n8n/send-a-request">Envoyer une demande depuis un workflow n8n</a>.
</p>

<h3 id="turn-on-wait">1. Activez Wait for the Outcome</h3>

<p>
  Dans le nœud <strong>Create request</strong>, activez <strong>Wait for the Outcome</strong>. Le nœud envoie à formbase l'URL de reprise de
  cette exécution comme callback de la demande. Laissez <strong>Callback URL</strong> vide ; le nœud refuse les deux à la fois.
</p>

<p>
  Chaque exécution a sa propre URL de reprise, donc un External ID réutilisé d'une exécution précédente échoue. Incluez{' '}
  <code>{'{{ $execution.id }}'}</code> dedans, ou laissez-le vide.
</p>

<h3 id="add-a-wait-node">2. Ajoutez un nœud Wait</h3>

<p>
  Ajoutez un nœud <strong>Wait</strong> juste après, avec <strong>Resume</strong> réglé sur <strong>On Webhook Call</strong> et la méthode
  HTTP laissée sur <code>POST</code>.
</p>

<h3 id="branch-on-the-event">3. Bifurquez selon l'événement</h3>

<p>
  Ajoutez un <strong>Switch</strong> après le nœud Wait. Le nœud Wait place l'événement sous <code>body</code>, donc comparez{' '}
  <code>{'{{ $json.body.data.request.outcome }}'}</code>. Pour distinguer une demande terminée d'une demande expirée ou annulée, comparez{' '}
  <code>{'{{ $json.body.type }}'}</code> à <code>request.completed</code>, <code>request.expired</code> ou <code>request.canceled</code>.
</p>

<p>
  Exécutez le workflow. L'exécution s'arrête au nœud Wait jusqu'à ce que le destinataire soumette, puis reprend sur la branche
  correspondante :
</p>

<ul>
  <li>
    Une exécution depuis l'éditeur attend aussi une vraie réponse. Test Mode fonctionne ici : le callback d'une demande de test reprend
    quand même le workflow.
  </li>
  <li>
    Une demande expire après 30 jours sauf si vous réglez <strong>Expires At</strong>, et l'expiration reprend l'exécution avec{' '}
    <code>request.expired</code>. Réglez <strong>Expires At</strong> pour terminer l'attente plus tôt.
  </li>
  <li>
    Le nœud Wait ne vérifie pas l'en-tête <code>X-formbase-Signature</code> ; il compte sur le fait que l'URL de reprise est difficile à
    deviner. Si cela ne suffit pas, utilisez le formbase Trigger, qui vérifie chaque événement.
  </li>
</ul>

<h2 id="troubleshooting">Si rien ne se déclenche</h2>

<ul>
  <li>
    <strong>C'était une demande de test.</strong> Une demande créée avec Test Mode activé, ou avec <strong>Essayez par vous-même</strong>,
    ne démarre jamais un déclencheur de demande. Seul son <a href="/fr/requests/callbacks">callback</a> se déclenche.
  </li>
  <li>
    <strong>La demande concernait un autre formulaire.</strong> Le déclencheur écoute le formulaire que vous avez choisi dedans.
  </li>
  <li>
    <strong>Le workflow n'est pas publié, ou son credential atteint un autre espace de travail.</strong> Voir les vérifications dans{' '}
    <a href="/fr/guides/n8n/public-link-submissions#troubleshooting">le guide du lien public</a>.
  </li>
  <li>
    <strong>
      Create request échoue avec <em>callbackUrl is not allowed</em>.
    </strong>{' '}
    Votre n8n distribue une URL de reprise en <code>http://</code> ou une URL privée. Voir{' '}
    <a href="/fr/guides/n8n/install-the-node#public-address">Indiquez à n8n son adresse publique</a>.
  </li>
  <li>
    <strong>Le nœud Wait ne reprend jamais.</strong> formbase ne peut pas joindre l'URL de reprise, par exemple parce que le tunnel est en
    panne ou que le proxy bloque <code>/webhook-waiting/</code>.
  </li>
</ul>

<h2 id="next">Suite</h2>

<div class="not-prose grid gap-3 sm:grid-cols-2 mb-8">
  - [Trouver, relancer et annuler des demandes dans n8n](/fr/guides/n8n/manage-requests) — Trouvez une demande par External ID, relancez le destinataire, ou retirez-la.
  - [Décisions et approbations](/fr/requests/decisions-and-approvals) — La question de décision et ses trois valeurs.
</div>
