{
  "played_at": "2026-10-31T19:59:15.323Z",
  "n8n": "2.43.8",
  "cases": [
    {
      "id": "lead-propre",
      "title": "Lead propre (Tally)",
      "expect": "Contact créé, qualifié chaud par le modèle simulé, trois créneaux proposés, un email, une alerte #ventes.",
      "pass": true,
      "responses": [
        {
          "payload": "tally-velo-leman",
          "http": 200,
          "ms": 296,
          "body": {
            "status": "ok",
            "submission_id": "sub_V8kQ2m",
            "crm_action": "created",
            "contact": "C-1001",
            "route": "creneaux",
            "qualification": {
              "score": 90,
              "category": "chaud",
              "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
              "status": "auto"
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "POST /llm/qualify : 200",
        "PUT /crm/contacts : 200",
        "POST /calendar/slots : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [],
        "outbox": 0,
        "slack": 0,
        "calendar": 0,
        "incidents": 0,
        "calls": 0
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 1,
        "calendar": 1,
        "incidents": 0,
        "calls": 6
      },
      "outbox": [
        {
          "to": "claire.fontaine@velo-leman.example",
          "subject": "Votre demande : trois créneaux pour en parler",
          "template": "rdv",
          "at": "2026-10-31T19:58:26.262Z",
          "key": "sub_V8kQ2m:mail"
        }
      ],
      "slack": [
        {
          "channel": "#ventes",
          "text": "Lead chaud (90/100) : Claire Fontaine (Atelier Vélo Léman Sàrl), contact C-1001. Budget annoncé de 8000 CHF, délai court, demande explicite. Trois créneaux proposés par email.",
          "at": "2026-10-31T19:58:26.277Z",
          "key": "sub_V8kQ2m:slack"
        }
      ],
      "incidents": [],
      "calendar": [
        {
          "key": "sub_V8kQ2m:slots",
          "email": "claire.fontaine@velo-leman.example",
          "timezone": "Europe/Zurich",
          "slots": [
            "2026-11-03T09:30:00+01:00",
            "2026-11-03T14:00:00+01:00",
            "2026-11-04T10:30:00+01:00"
          ],
          "created_at": "2026-10-31T19:58:26.248Z"
        }
      ],
      "executions": [
        {
          "id": 1,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:26.040000+00:00",
          "ms": 246,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 23,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 9,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 14,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 23,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 18,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 10,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 25,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 38,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Agenda : proposer 3 créneaux (simulé)",
              "status": "success",
              "ms": 19,
              "error": null
            },
            {
              "node": "Email : proposition de rendez-vous (simulé)",
              "status": "success",
              "ms": 15,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 13,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 8,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "doublon",
      "title": "Doublon : la même personne renvoie le formulaire (Typeform, email en majuscules et espaces)",
      "expect": "Contact existant mis à jour (pas de second contact), qualification d'origine conservée sans nouvel appel au modèle, aucun second email au prospect, alerte « doublon » dans #ventes.",
      "pass": true,
      "responses": [
        {
          "payload": "typeform-velo-leman-relance",
          "http": 200,
          "ms": 93,
          "body": {
            "status": "ok",
            "submission_id": "tf_9q8w7e6r5t",
            "crm_action": "updated",
            "contact": "C-1001",
            "route": "doublon",
            "qualification": {
              "score": 90,
              "category": "chaud",
              "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
              "status": "auto",
              "reused": true
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "PUT /crm/contacts : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 1,
        "calendar": 1,
        "incidents": 0,
        "calls": 6
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 2,
        "calendar": 1,
        "incidents": 0,
        "calls": 9
      },
      "outbox": [],
      "slack": [
        {
          "channel": "#ventes",
          "text": "Doublon : Claire Fontaine (Atelier Vélo Léman Sàrl) a renvoyé le formulaire. Contact C-1001 mis à jour, pas de second email au prospect. Nouveau message : « Je relance : avez-vous bien reçu ma demande ? »",
          "at": "2026-10-31T19:58:28.508Z",
          "key": "tf_9q8w7e6r5t:slack"
        }
      ],
      "incidents": [],
      "calendar": [],
      "executions": [
        {
          "id": 2,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:28.457000+00:00",
          "ms": 54,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 8,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Reprendre la qualification",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 2,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "livraison-repetee",
      "title": "Livraison répétée : le même webhook arrive une seconde fois",
      "expect": "Aucun effet de plus : pas d'appel au modèle, CRM inchangé, email, créneaux et alerte ignorés par leur clé d'idempotence.",
      "pass": true,
      "responses": [
        {
          "payload": "tally-velo-leman",
          "http": 200,
          "ms": 69,
          "body": {
            "status": "ok",
            "submission_id": "sub_V8kQ2m",
            "crm_action": "unchanged",
            "contact": "C-1001",
            "route": "creneaux",
            "qualification": {
              "score": 90,
              "category": "chaud",
              "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
              "status": "auto",
              "reused": true
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "PUT /crm/contacts : 200",
        "POST /calendar/slots : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 2,
        "calendar": 1,
        "incidents": 0,
        "calls": 9
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 2,
        "calendar": 1,
        "incidents": 0,
        "calls": 14
      },
      "outbox": [],
      "slack": [],
      "incidents": [],
      "calendar": [],
      "executions": [
        {
          "id": 3,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:31.445000+00:00",
          "ms": 54,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Reprendre la qualification",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Agenda : proposer 3 créneaux (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Email : proposition de rendez-vous (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 2,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 1,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "formulaire-malforme",
      "title": "Formulaire malformé (email invalide, téléphone faux, consentement absent) puis charge utile inconnue",
      "expect": "Réponse 422 avec la liste des erreurs, rien dans le CRM, une note dans #ops-alertes pour chaque rejet.",
      "pass": true,
      "responses": [
        {
          "payload": "typeform-malforme",
          "http": 422,
          "ms": 65,
          "body": {
            "status": "rejected",
            "errors": [
              "email invalide : marc.dubois@",
              "téléphone invalide : 12",
              "consentement au recontact absent"
            ]
          }
        },
        {
          "payload": "inconnu",
          "http": 422,
          "ms": 2435,
          "body": {
            "status": "rejected",
            "errors": [
              "format de formulaire inconnu (ni Typeform ni Tally)"
            ]
          }
        }
      ],
      "calls": [
        "POST /slack/post : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 2,
        "calendar": 1,
        "incidents": 0,
        "calls": 14
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 4,
        "calendar": 1,
        "incidents": 0,
        "calls": 16
      },
      "outbox": [],
      "slack": [
        {
          "channel": "#ops-alertes",
          "text": "Formulaire rejeté (typeform, soumission tf_m4lf0rm3) : email invalide : marc.dubois@ ; téléphone invalide : 12 ; consentement au recontact absent. Rien n'a été écrit dans le CRM.",
          "at": "2026-10-31T19:58:34.506Z",
          "key": "reject:tf_m4lf0rm3"
        },
        {
          "channel": "#ops-alertes",
          "text": "Formulaire rejeté (source inconnue, soumission sans identifiant) : format de formulaire inconnu (ni Typeform ni Tally). Rien n'a été écrit dans le CRM.",
          "at": "2026-10-31T19:58:37.545Z",
          "key": "reject:1793476717541"
        }
      ],
      "incidents": [],
      "calendar": [],
      "executions": [
        {
          "id": 4,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:34.468000+00:00",
          "ms": 43,
          "last_node": "Répondre 422",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 2,
              "error": null
            },
            {
              "node": "Préparer le rejet",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Slack : formulaire rejeté (simulé)",
              "status": "success",
              "ms": 10,
              "error": null
            },
            {
              "node": "Répondre 422",
              "status": "success",
              "ms": 4,
              "error": null
            }
          ]
        },
        {
          "id": 5,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:37.484000+00:00",
          "ms": 63,
          "last_node": "Répondre 422",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 8,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 22,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 8,
              "error": null
            },
            {
              "node": "Préparer le rejet",
              "status": "success",
              "ms": 11,
              "error": null
            },
            {
              "node": "Slack : formulaire rejeté (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Répondre 422",
              "status": "success",
              "ms": 1,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "crm-instable",
      "title": "CRM instable : deux erreurs 503 puis retour",
      "expect": "La troisième tentative passe toute seule (reprise du nœud CRM, 2 s entre deux essais) : contact créé une seule fois, puis la suite normale du flux.",
      "pass": true,
      "responses": [
        {
          "payload": "tally-physio-keller",
          "http": 200,
          "ms": 4188,
          "body": {
            "status": "ok",
            "submission_id": "sub_K3ll3r",
            "crm_action": "created",
            "contact": "C-1002",
            "route": "creneaux",
            "qualification": {
              "score": 60,
              "category": "chaud",
              "reason": "budget moyen, demande explicite",
              "status": "auto"
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "POST /llm/qualify : 200",
        "PUT /crm/contacts : 503",
        "PUT /crm/contacts : 503",
        "PUT /crm/contacts : 200",
        "POST /calendar/slots : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 1,
        "slack": 4,
        "calendar": 1,
        "incidents": 0,
        "calls": 16
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          }
        ],
        "outbox": 2,
        "slack": 5,
        "calendar": 2,
        "incidents": 0,
        "calls": 24
      },
      "outbox": [
        {
          "to": "sophie@physio-keller.example",
          "subject": "Votre demande : trois créneaux pour en parler",
          "template": "rdv",
          "at": "2026-10-31T19:58:43.856Z",
          "key": "sub_K3ll3r:mail"
        }
      ],
      "slack": [
        {
          "channel": "#ventes",
          "text": "Lead chaud (60/100) : Sophie Keller (Cabinet Physio Keller), contact C-1002. Budget moyen, demande explicite. Trois créneaux proposés par email.",
          "at": "2026-10-31T19:58:43.860Z",
          "key": "sub_K3ll3r:slack"
        }
      ],
      "incidents": [],
      "calendar": [
        {
          "key": "sub_K3ll3r:slots",
          "email": "sophie@physio-keller.example",
          "timezone": "Europe/Zurich",
          "slots": [
            "2026-11-03T09:30:00+01:00",
            "2026-11-03T14:00:00+01:00",
            "2026-11-04T10:30:00+01:00"
          ],
          "created_at": "2026-10-31T19:58:43.850Z"
        }
      ],
      "executions": [
        {
          "id": 6,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:39.701000+00:00",
          "ms": 4161,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 4078,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 15,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 2,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Agenda : proposer 3 créneaux (simulé)",
              "status": "success",
              "ms": 10,
              "error": null
            },
            {
              "node": "Email : proposition de rendez-vous (simulé)",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 1,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "crm-en-panne",
      "title": "CRM en panne plus longtemps que les reprises, puis rétabli",
      "expect": "Trois échecs, exécution en erreur, le workflow d'erreur écrit l'incident et alerte #ops-alertes, le formulaire reçoit une erreur. Après retour du CRM, le rejeu de la même soumission crée le contact une seule fois.",
      "pass": true,
      "responses": [
        {
          "payload": "typeform-garage-bernasconi",
          "http": 500,
          "ms": 4141,
          "body": {
            "message": "Error in workflow"
          }
        },
        {
          "payload": "typeform-garage-bernasconi",
          "http": 200,
          "ms": 83,
          "body": {
            "status": "ok",
            "submission_id": "tf_b3rn4sc0n1",
            "crm_action": "created",
            "contact": "C-1003",
            "route": "creneaux",
            "qualification": {
              "score": 90,
              "category": "chaud",
              "reason": "budget annoncé de 6000 CHF, délai court, demande explicite",
              "status": "auto"
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "POST /llm/qualify : 200",
        "PUT /crm/contacts : 503",
        "PUT /crm/contacts : 503",
        "PUT /crm/contacts : 503",
        "POST /ops/incident : 200",
        "POST /slack/post : 200",
        "GET /crm/contacts : 200",
        "POST /llm/qualify : 200",
        "PUT /crm/contacts : 200",
        "POST /calendar/slots : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          }
        ],
        "outbox": 2,
        "slack": 5,
        "calendar": 2,
        "incidents": 0,
        "calls": 24
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          },
          {
            "id": "C-1003",
            "email": "luca@garage-bernasconi.example",
            "name": "Luca Bernasconi",
            "phone": "+41915550234",
            "company": "Garage Bernasconi SA",
            "submissions": 1,
            "tags": "typeform, qualifie-auto, chaud",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 3,
        "slack": 7,
        "calendar": 3,
        "incidents": 1,
        "calls": 37
      },
      "outbox": [
        {
          "to": "luca@garage-bernasconi.example",
          "subject": "Votre demande : trois créneaux pour en parler",
          "template": "rdv",
          "at": "2026-10-31T19:58:54.830Z",
          "key": "tf_b3rn4sc0n1:mail"
        }
      ],
      "slack": [
        {
          "channel": "#ops-alertes",
          "text": "Échec du flux « Flux leads PME (démo Memo Labs) » à l'étape « CRM : créer ou mettre à jour (simulé) » (exécution 7) : Service unavailable - try again later or consider setting this node to retry automatically (in the node settings). Rien n'est perdu : le formulaire a reçu une erreur et la même soumission peut être rejouée sans doublon.",
          "at": "2026-10-31T19:58:50.169Z",
          "key": "alert:7"
        },
        {
          "channel": "#ventes",
          "text": "Lead chaud (90/100) : Luca Bernasconi (Garage Bernasconi SA), contact C-1003. Budget annoncé de 6000 CHF, délai court, demande explicite. Trois créneaux proposés par email.",
          "at": "2026-10-31T19:58:54.832Z",
          "key": "tf_b3rn4sc0n1:slack"
        }
      ],
      "incidents": [
        {
          "workflow": "Flux leads PME (démo Memo Labs)",
          "execution_id": "7",
          "failed_node": "CRM : créer ou mettre à jour (simulé)",
          "error": "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)",
          "mode": "webhook",
          "url": "http://localhost:5678/workflow/leadIntakeDemo01/executions/7",
          "text": "Échec du flux « Flux leads PME (démo Memo Labs) » à l'étape « CRM : créer ou mettre à jour (simulé) » (exécution 7) : Service unavailable - try again later or consider setting this node to retry automatically (in the node settings). Rien n'est perdu : le formulaire a reçu une erreur et la même soumission peut être rejouée sans doublon.",
          "received_at": "2026-10-31T19:58:50.159Z"
        }
      ],
      "calendar": [
        {
          "key": "tf_b3rn4sc0n1:slots",
          "email": "luca@garage-bernasconi.example",
          "timezone": "Europe/Zurich",
          "slots": [
            "2026-11-03T09:30:00+01:00",
            "2026-11-03T14:00:00+01:00",
            "2026-11-04T10:30:00+01:00"
          ],
          "created_at": "2026-10-31T19:58:54.827Z"
        }
      ],
      "executions": [
        {
          "id": 7,
          "workflow": "leadIntakeDemo01",
          "status": "error",
          "mode": "webhook",
          "started": "2026-10-31T19:58:46.017000+00:00",
          "ms": 4097,
          "last_node": "CRM : créer ou mettre à jour (simulé)",
          "error": "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)",
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 8,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "error",
              "ms": 4053,
              "error": "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)"
            }
          ]
        },
        {
          "id": 8,
          "workflow": "errorAlertDemo01",
          "status": "success",
          "mode": "error",
          "started": "2026-10-31T19:58:50.139000+00:00",
          "ms": 31,
          "last_node": "Slack : alerte #ops-alertes (simulé)",
          "error": null,
          "nodes": [
            {
              "node": "Exécution en échec",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Mettre en forme l'incident",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "Journal des incidents (simulé)",
              "status": "success",
              "ms": 10,
              "error": null
            },
            {
              "node": "Slack : alerte #ops-alertes (simulé)",
              "status": "success",
              "ms": 11,
              "error": null
            }
          ]
        },
        {
          "id": 9,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:54.776000+00:00",
          "ms": 58,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Agenda : proposer 3 créneaux (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Email : proposition de rendez-vous (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 2,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 1,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "llm-timeout",
      "title": "Modèle trop lent (6 s pour un délai de 4 s)",
      "expect": "Deux tentatives, puis repli : le lead est enregistré en « à qualifier », accusé de réception, l'équipe est prévenue. Aucun lead perdu.",
      "pass": true,
      "responses": [
        {
          "payload": "tally-traiteur-rossi",
          "http": 200,
          "ms": 8670,
          "body": {
            "status": "ok",
            "submission_id": "sub_R0ss1",
            "crm_action": "created",
            "contact": "C-1004",
            "route": "accuse",
            "qualification": {
              "score": null,
              "category": "à qualifier",
              "reason": "modèle trop lent (délai de 4 s dépassé)",
              "status": "manuelle"
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "POST /llm/qualify : abandonné par le client",
        "POST /llm/qualify : abandonné par le client",
        "PUT /crm/contacts : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          },
          {
            "id": "C-1003",
            "email": "luca@garage-bernasconi.example",
            "name": "Luca Bernasconi",
            "phone": "+41915550234",
            "company": "Garage Bernasconi SA",
            "submissions": 1,
            "tags": "typeform, qualifie-auto, chaud",
            "qualification": "chaud 90"
          }
        ],
        "outbox": 3,
        "slack": 7,
        "calendar": 3,
        "incidents": 1,
        "calls": 37
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          },
          {
            "id": "C-1003",
            "email": "luca@garage-bernasconi.example",
            "name": "Luca Bernasconi",
            "phone": "+41915550234",
            "company": "Garage Bernasconi SA",
            "submissions": 1,
            "tags": "typeform, qualifie-auto, chaud",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1004",
            "email": "nadia@traiteur-rossi.example",
            "name": "Nadia Rossi",
            "company": "Traiteur Rossi",
            "submissions": 1,
            "tags": "tally, qualification-manuelle, à qualifier",
            "qualification": "à qualifier"
          }
        ],
        "outbox": 4,
        "slack": 8,
        "calendar": 3,
        "incidents": 1,
        "calls": 43
      },
      "outbox": [
        {
          "to": "nadia@traiteur-rossi.example",
          "subject": "Nous avons bien reçu votre demande",
          "template": "accuse",
          "at": "2026-10-31T19:59:06.419Z",
          "key": "sub_R0ss1:mail"
        }
      ],
      "slack": [
        {
          "channel": "#ventes",
          "text": "Nouveau lead à qualifier à la main : Nadia Rossi (Traiteur Rossi), contact C-1004. Motif : modèle trop lent (délai de 4 s dépassé). Accusé de réception envoyé.",
          "at": "2026-10-31T19:59:06.428Z",
          "key": "sub_R0ss1:slack"
        }
      ],
      "incidents": [],
      "calendar": [],
      "executions": [
        {
          "id": 10,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:58:57.785000+00:00",
          "ms": 8647,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 2,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 8522,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 20,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 17,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 13,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Email : accusé de réception (simulé)",
              "status": "success",
              "ms": 26,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 6,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 2,
              "error": null
            }
          ]
        }
      ]
    },
    {
      "id": "llm-hors-contrat",
      "title": "Réponse du modèle hors contrat (score 140, catégorie inventée)",
      "expect": "Le contrôle en code refuse la réponse, le lead part en qualification manuelle au lieu d'être classé faux.",
      "pass": true,
      "responses": [
        {
          "payload": "typeform-menuiserie-meier",
          "http": 200,
          "ms": 98,
          "body": {
            "status": "ok",
            "submission_id": "tf_m31er",
            "crm_action": "created",
            "contact": "C-1005",
            "route": "accuse",
            "qualification": {
              "score": null,
              "category": "à qualifier",
              "reason": "réponse du modèle hors contrat : score hors bornes (140), catégorie inconnue (prioritaire absolu)",
              "status": "manuelle"
            }
          }
        }
      ],
      "calls": [
        "GET /crm/contacts : 200",
        "POST /llm/qualify : 200",
        "PUT /crm/contacts : 200",
        "POST /mail/send : 200",
        "POST /slack/post : 200"
      ],
      "before": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          },
          {
            "id": "C-1003",
            "email": "luca@garage-bernasconi.example",
            "name": "Luca Bernasconi",
            "phone": "+41915550234",
            "company": "Garage Bernasconi SA",
            "submissions": 1,
            "tags": "typeform, qualifie-auto, chaud",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1004",
            "email": "nadia@traiteur-rossi.example",
            "name": "Nadia Rossi",
            "company": "Traiteur Rossi",
            "submissions": 1,
            "tags": "tally, qualification-manuelle, à qualifier",
            "qualification": "à qualifier"
          }
        ],
        "outbox": 4,
        "slack": 8,
        "calendar": 3,
        "incidents": 1,
        "calls": 43
      },
      "after": {
        "crm": [
          {
            "id": "C-1001",
            "email": "claire.fontaine@velo-leman.example",
            "name": "Claire Fontaine",
            "phone": "+41795550123",
            "company": "Atelier Vélo Léman Sàrl",
            "submissions": 2,
            "tags": "tally, qualifie-auto, chaud, typeform, resoumission",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1002",
            "email": "sophie@physio-keller.example",
            "name": "Sophie Keller",
            "company": "Cabinet Physio Keller",
            "submissions": 1,
            "tags": "tally, qualifie-auto, chaud",
            "qualification": "chaud 60"
          },
          {
            "id": "C-1003",
            "email": "luca@garage-bernasconi.example",
            "name": "Luca Bernasconi",
            "phone": "+41915550234",
            "company": "Garage Bernasconi SA",
            "submissions": 1,
            "tags": "typeform, qualifie-auto, chaud",
            "qualification": "chaud 90"
          },
          {
            "id": "C-1004",
            "email": "nadia@traiteur-rossi.example",
            "name": "Nadia Rossi",
            "company": "Traiteur Rossi",
            "submissions": 1,
            "tags": "tally, qualification-manuelle, à qualifier",
            "qualification": "à qualifier"
          },
          {
            "id": "C-1005",
            "email": "thomas@menuiserie-meier.example",
            "name": "Thomas Meier",
            "company": "Menuiserie Meier",
            "submissions": 1,
            "tags": "typeform, qualification-manuelle, à qualifier",
            "qualification": "à qualifier"
          }
        ],
        "outbox": 5,
        "slack": 9,
        "calendar": 3,
        "incidents": 1,
        "calls": 48
      },
      "outbox": [
        {
          "to": "thomas@menuiserie-meier.example",
          "subject": "Nous avons bien reçu votre demande",
          "template": "accuse",
          "at": "2026-10-31T19:59:09.550Z",
          "key": "tf_m31er:mail"
        }
      ],
      "slack": [
        {
          "channel": "#ventes",
          "text": "Nouveau lead à qualifier à la main : Thomas Meier (Menuiserie Meier), contact C-1005. Motif : réponse du modèle hors contrat : score hors bornes (140), catégorie inconnue (prioritaire absolu). Accusé de réception envoyé.",
          "at": "2026-10-31T19:59:09.553Z",
          "key": "tf_m31er:slack"
        }
      ],
      "incidents": [],
      "calendar": [],
      "executions": [
        {
          "id": 11,
          "workflow": "leadIntakeDemo01",
          "status": "success",
          "mode": "webhook",
          "started": "2026-10-31T19:59:09.495000+00:00",
          "ms": 59,
          "last_node": "Répondre 200",
          "error": null,
          "nodes": [
            {
              "node": "Formulaire (Typeform ou Tally)",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "Réglages du client",
              "status": "success",
              "ms": 7,
              "error": null
            },
            {
              "node": "Normaliser et valider",
              "status": "success",
              "ms": 8,
              "error": null
            },
            {
              "node": "Formulaire valide ?",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "CRM : chercher le contact (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Doublon ?",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Qualification déjà enregistrée ?",
              "status": "success",
              "ms": 0,
              "error": null
            },
            {
              "node": "IA : qualifier le lead (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Contrôler la qualification",
              "status": "success",
              "ms": 5,
              "error": null
            },
            {
              "node": "CRM : créer ou mettre à jour (simulé)",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Décider de la suite",
              "status": "success",
              "ms": 4,
              "error": null
            },
            {
              "node": "Nouveau contact ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Lead chaud ?",
              "status": "success",
              "ms": 1,
              "error": null
            },
            {
              "node": "Email : accusé de réception (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Slack : alerter l'équipe (simulé)",
              "status": "success",
              "ms": 3,
              "error": null
            },
            {
              "node": "Répondre 200",
              "status": "success",
              "ms": 1,
              "error": null
            }
          ]
        }
      ]
    }
  ],
  "crm_final": [
    {
      "id": "C-1001",
      "email": "claire.fontaine@velo-leman.example",
      "name": "Claire Fontaine",
      "phone": "+41795550123",
      "company": "Atelier Vélo Léman Sàrl",
      "source": "tally",
      "last_message": "Je relance : avez-vous bien reçu ma demande ?",
      "qualification": {
        "score": 90,
        "category": "chaud",
        "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
        "status": "auto",
        "reused": true
      },
      "qualifications": {
        "sub_V8kQ2m": {
          "score": 90,
          "category": "chaud",
          "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
          "status": "auto"
        },
        "tf_9q8w7e6r5t": {
          "score": 90,
          "category": "chaud",
          "reason": "budget annoncé de 8000 CHF, délai court, demande explicite",
          "status": "auto",
          "reused": true
        }
      },
      "tags": [
        "tally",
        "qualifie-auto",
        "chaud",
        "typeform",
        "resoumission"
      ],
      "submissions": [
        "sub_V8kQ2m",
        "tf_9q8w7e6r5t"
      ],
      "created_at": "2026-10-31T19:58:26.181Z",
      "updated_at": "2026-10-31T19:58:28.499Z"
    },
    {
      "id": "C-1002",
      "email": "sophie@physio-keller.example",
      "name": "Sophie Keller",
      "company": "Cabinet Physio Keller",
      "source": "tally",
      "last_message": "Pouvez-vous m'envoyer de la documentation sur la prise de rendez-vous en ligne ?",
      "qualification": {
        "score": 60,
        "category": "chaud",
        "reason": "budget moyen, demande explicite",
        "status": "auto"
      },
      "qualifications": {
        "sub_K3ll3r": {
          "score": 60,
          "category": "chaud",
          "reason": "budget moyen, demande explicite",
          "status": "auto"
        }
      },
      "tags": [
        "tally",
        "qualifie-auto",
        "chaud"
      ],
      "submissions": [
        "sub_K3ll3r"
      ],
      "created_at": "2026-10-31T19:58:43.818Z",
      "updated_at": "2026-10-31T19:58:43.818Z"
    },
    {
      "id": "C-1003",
      "email": "luca@garage-bernasconi.example",
      "name": "Luca Bernasconi",
      "phone": "+41915550234",
      "company": "Garage Bernasconi SA",
      "source": "typeform",
      "last_message": "Relances automatiques des clients pour les services, à démarrer avant la fin de l'année. Merci de me rappeler.",
      "qualification": {
        "score": 90,
        "category": "chaud",
        "reason": "budget annoncé de 6000 CHF, délai court, demande explicite",
        "status": "auto"
      },
      "qualifications": {
        "tf_b3rn4sc0n1": {
          "score": 90,
          "category": "chaud",
          "reason": "budget annoncé de 6000 CHF, délai court, demande explicite",
          "status": "auto"
        }
      },
      "tags": [
        "typeform",
        "qualifie-auto",
        "chaud"
      ],
      "submissions": [
        "tf_b3rn4sc0n1"
      ],
      "created_at": "2026-10-31T19:58:54.819Z",
      "updated_at": "2026-10-31T19:58:54.819Z"
    },
    {
      "id": "C-1004",
      "email": "nadia@traiteur-rossi.example",
      "name": "Nadia Rossi",
      "company": "Traiteur Rossi",
      "source": "tally",
      "last_message": "Nous recevons les commandes par email et par messagerie, nous aimerions un formulaire unique avec devis.",
      "qualification": {
        "score": null,
        "category": "à qualifier",
        "reason": "modèle trop lent (délai de 4 s dépassé)",
        "status": "manuelle"
      },
      "qualifications": {
        "sub_R0ss1": {
          "score": null,
          "category": "à qualifier",
          "reason": "modèle trop lent (délai de 4 s dépassé)",
          "status": "manuelle"
        }
      },
      "tags": [
        "tally",
        "qualification-manuelle",
        "à qualifier"
      ],
      "submissions": [
        "sub_R0ss1"
      ],
      "created_at": "2026-10-31T19:59:06.374Z",
      "updated_at": "2026-10-31T19:59:06.374Z"
    },
    {
      "id": "C-1005",
      "email": "thomas@menuiserie-meier.example",
      "name": "Thomas Meier",
      "company": "Menuiserie Meier",
      "source": "typeform",
      "last_message": "Un devis pour automatiser nos factures.",
      "qualification": {
        "score": null,
        "category": "à qualifier",
        "reason": "réponse du modèle hors contrat : score hors bornes (140), catégorie inconnue (prioritaire absolu)",
        "status": "manuelle"
      },
      "qualifications": {
        "tf_m31er": {
          "score": null,
          "category": "à qualifier",
          "reason": "réponse du modèle hors contrat : score hors bornes (140), catégorie inconnue (prioritaire absolu)",
          "status": "manuelle"
        }
      },
      "tags": [
        "typeform",
        "qualification-manuelle",
        "à qualifier"
      ],
      "submissions": [
        "tf_m31er"
      ],
      "created_at": "2026-10-31T19:59:09.541Z",
      "updated_at": "2026-10-31T19:59:09.541Z"
    }
  ],
  "executions": [
    {
      "id": 1,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:26.040000+00:00",
      "ms": 246,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 23,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 9,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 14,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 23,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 18,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 10,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 25,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 38,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Agenda : proposer 3 créneaux (simulé)",
          "status": "success",
          "ms": 19,
          "error": null
        },
        {
          "node": "Email : proposition de rendez-vous (simulé)",
          "status": "success",
          "ms": 15,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 13,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 8,
          "error": null
        }
      ]
    },
    {
      "id": 2,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:28.457000+00:00",
      "ms": 54,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 8,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Reprendre la qualification",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 2,
          "error": null
        }
      ]
    },
    {
      "id": 3,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:31.445000+00:00",
      "ms": 54,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Reprendre la qualification",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Agenda : proposer 3 créneaux (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Email : proposition de rendez-vous (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 2,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 1,
          "error": null
        }
      ]
    },
    {
      "id": 4,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:34.468000+00:00",
      "ms": 43,
      "last_node": "Répondre 422",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 2,
          "error": null
        },
        {
          "node": "Préparer le rejet",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Slack : formulaire rejeté (simulé)",
          "status": "success",
          "ms": 10,
          "error": null
        },
        {
          "node": "Répondre 422",
          "status": "success",
          "ms": 4,
          "error": null
        }
      ]
    },
    {
      "id": 5,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:37.484000+00:00",
      "ms": 63,
      "last_node": "Répondre 422",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 8,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 22,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 8,
          "error": null
        },
        {
          "node": "Préparer le rejet",
          "status": "success",
          "ms": 11,
          "error": null
        },
        {
          "node": "Slack : formulaire rejeté (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Répondre 422",
          "status": "success",
          "ms": 1,
          "error": null
        }
      ]
    },
    {
      "id": 6,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:39.701000+00:00",
      "ms": 4161,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 4078,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 15,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 2,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Agenda : proposer 3 créneaux (simulé)",
          "status": "success",
          "ms": 10,
          "error": null
        },
        {
          "node": "Email : proposition de rendez-vous (simulé)",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 1,
          "error": null
        }
      ]
    },
    {
      "id": 7,
      "workflow": "leadIntakeDemo01",
      "status": "error",
      "mode": "webhook",
      "started": "2026-10-31T19:58:46.017000+00:00",
      "ms": 4097,
      "last_node": "CRM : créer ou mettre à jour (simulé)",
      "error": "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)",
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 8,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "error",
          "ms": 4053,
          "error": "Service unavailable - try again later or consider setting this node to retry automatically (in the node settings)"
        }
      ]
    },
    {
      "id": 8,
      "workflow": "errorAlertDemo01",
      "status": "success",
      "mode": "error",
      "started": "2026-10-31T19:58:50.139000+00:00",
      "ms": 31,
      "last_node": "Slack : alerte #ops-alertes (simulé)",
      "error": null,
      "nodes": [
        {
          "node": "Exécution en échec",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Mettre en forme l'incident",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "Journal des incidents (simulé)",
          "status": "success",
          "ms": 10,
          "error": null
        },
        {
          "node": "Slack : alerte #ops-alertes (simulé)",
          "status": "success",
          "ms": 11,
          "error": null
        }
      ]
    },
    {
      "id": 9,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:54.776000+00:00",
      "ms": 58,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Agenda : proposer 3 créneaux (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Email : proposition de rendez-vous (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 2,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 1,
          "error": null
        }
      ]
    },
    {
      "id": 10,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:58:57.785000+00:00",
      "ms": 8647,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 2,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 8522,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 20,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 17,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 13,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Email : accusé de réception (simulé)",
          "status": "success",
          "ms": 26,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 6,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 2,
          "error": null
        }
      ]
    },
    {
      "id": 11,
      "workflow": "leadIntakeDemo01",
      "status": "success",
      "mode": "webhook",
      "started": "2026-10-31T19:59:09.495000+00:00",
      "ms": 59,
      "last_node": "Répondre 200",
      "error": null,
      "nodes": [
        {
          "node": "Formulaire (Typeform ou Tally)",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "Réglages du client",
          "status": "success",
          "ms": 7,
          "error": null
        },
        {
          "node": "Normaliser et valider",
          "status": "success",
          "ms": 8,
          "error": null
        },
        {
          "node": "Formulaire valide ?",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "CRM : chercher le contact (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Doublon ?",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Qualification déjà enregistrée ?",
          "status": "success",
          "ms": 0,
          "error": null
        },
        {
          "node": "IA : qualifier le lead (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Contrôler la qualification",
          "status": "success",
          "ms": 5,
          "error": null
        },
        {
          "node": "CRM : créer ou mettre à jour (simulé)",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Décider de la suite",
          "status": "success",
          "ms": 4,
          "error": null
        },
        {
          "node": "Nouveau contact ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Lead chaud ?",
          "status": "success",
          "ms": 1,
          "error": null
        },
        {
          "node": "Email : accusé de réception (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Slack : alerter l'équipe (simulé)",
          "status": "success",
          "ms": 3,
          "error": null
        },
        {
          "node": "Répondre 200",
          "status": "success",
          "ms": 1,
          "error": null
        }
      ]
    }
  ]
}
