Évitez les doublons avec l'idempotence

Identifiez les causes de doublons dans un workflow en production

Imaginez : votre boîte Slack affiche de nombreuses notifications. Un bug a touché 50 clients la nuit précédente. Ils ont tous soumis un ticket dans les 5 minutes. Le workflow a fait son travail, 50 fois… HubSpot contient maintenant 50 tickets quasi-identiques, et l’équipe support ne sait plus par où commencer.

Les doublons arrivent pour trois raisons principales :

  1. Un incident massif : plusieurs utilisateurs signalent le même problème en même temps ;

  2. Un double envoi : l’outil émetteur renvoie la notification parce qu’il n’a pas reçu de confirmation à temps ;

  3. Un workflow relancé après une panne : les items déjà traités sont soumis à nouveau.

Dans tous ces cas, le workflow fonctionne correctement, c’est le contexte qui crée le problème. La solution : rendre le workflow idempotent.

Choisissez une clé d’unicité adaptée à votre contexte

Pour qu’un workflow soit idempotent, il doit reconnaître qu’un ticket a déjà été traité.

Choisir une clé d’unicité est indispensable pour que votre workflow puisse reconnaître qu’un ticket correspond à un événement déjà traité. Sans cette clé, vous ne pouvez pas détecter les doublons, ni rendre le pipeline idempotent : relancer le workflow ou recevoir deux fois la même alerte créerait plusieurs tickets pour le même incident.

Cette clé d’unicité peut prendre deux formes :

  1. Un identifiant stable fourni par la source (l’ID de l’alerte ou du ticket émetteur) — c’est la solution à préférer si elle est disponible

  2. Une combinaison sujet + email + fenêtre temporelle : si deux tickets arrivent avec le même objet et le même expéditeur dans les 10 minutes, on les traite comme un seul événement.

Dans notre pipeline, on choisit la combinaisonout_subject+out_customer_email+ une fenêtre de 15 minutes : en dehors des incidents massifs, deux tickets identiques de la même personne dans ce délai signalent un double envoi.

Appliquez le pattern upsert pour créer ou mettre à jour sans doublon

Dans n8n, la logique s’implémente en trois étapes :

  1. Cherchez le ticket dans HubSpot avec votre clé d’unicité.

  2. Évaluez avec un nœud IF : ticket trouvé ou non ?

  3. Chemin « trouvé » → mettez à jour (PATCH). Chemin « non trouvé » → créez (POST).

Qu’il se déclenche 1 fois ou 50 fois, le résultat dans HubSpot est identique.

Définissez une fenêtre de déduplication temporelle

Quand plusieurs tickets arrivent pour le même incident en l'espace de quelques minutes, on peut les considérer comme un seul événement.

À vous de jouer !

Revenons à notre projet de workflow pour AgroTech !

Consigne

Lorsqu'un capteur subit un dysfonctionnement ou une anomalie (ex: gel en cours), il peut envoyer une alerte en boucle toutes les minutes. Pour éviter de saturer le CRM de l'exploitation avec des dizaines de tickets identiques, vous devez ajouter une logique d'upsert (dédoublonnage) avant la création dans HubSpot.

Ajoutez une étape de vérification avant l'enregistrement dans HubSpot :

  1. Recherchez si une alerte/ticket avec le même sujet (  out_subject  ) et le même email capteur (  out_device_email  ) a déjà été créée récemment.

  2. Si l'alerte existe déjà, mettez à jour le ticket existant au lieu d'en créer un nouveau (vous pouvez incrémenter un compteur duplicate_countou ajouter une note dans le ticket).

  3. Si l'alerte n'existe pas, créez le ticket normalement.

  • 5 exécutions successives du workflow pour le même incident ➔ 1 seul ticket créé dans HubSpot.

  • Le champ/propriété  duplicate_count  reflète le nombre de signalements identiques reçus (ex: 5).

Corrigé

Voici un exemple de ce que vous pouviez faire pour y arriver :

Capture d’écran du workflow n8n intitulé 'Upsert & Dédoublonnage Capteurs AgroTech' dans l’éditeur.

  • Objectif : Éviter la création de doublons lorsqu’un capteur émet plusieurs fois la même alerte.

  • Principe : Génération d’une clé unique basée sur le sujet et l’identifiant du capteur.

  • Fonctionnement (décrit dans la fenêtre à gauche) :

    1. Génération d’une clé unique basée sur le sujet et l’identifiant du capteur.

    2. Recherche via l’API Search de HubSpot.

    3. Si 0 résultatPOST (création d’un ticket avecduplicate_count = 1).

    4. Si 1+ résultatPATCH (incrémentation deduplicate_count).

  • Structure du workflow (sur fond vert) :

    • Nœud 1 : 'When clicking Test workflow' (déclencheur).

    • Nœud 2 : 'Simuler relevé normalisé' (manuel, données de test).

    • Nœud 3 : 'Générer Clé d’Idempotence' (Code JS pour créer la clé).

    • Nœud 4 : 'Rechercher Alerte Existante' (POST vers HubSpot API).

    • Nœud 5 : 'Existe déjà ?' (IF pour vérifier l’existence du ticket).

    • Nœud 6 : 'Créer Nouveau Ticket' (POST, si aucun résultat).

    • Nœud 7 : 'Incrémenter Compteur & Update' (PATCH, si résultat existant).

  • Logs (en bas) : Exécution réussie en 1.048s (Créer Nouveau Ticket : 506ms).

  • Bouton 'Execute workflow' en orange.

Capture d’écran des paramètres et de l’exécution du nœud 'Créer Nouveau Ticket' dans n8n.

  • Input : Données de 'Existe déjà ?' avec :

    • total: 0(aucun résultat trouvé).

    • results: [](liste vide).

    • Données du relevé normalisé (ex:out_source,out_subject).

  • Paramètres :

    • Method : POST.

    • URL :https://api.hubspot.com/crm/v3/objects/tickets.

    • Authentication :

      • Generic Credential TypeBearer Authn8n-test-api-hubspot.

    • Send Headers :Content-Type: application/json.

  • Output :

    • id: 426074892489.

    • properties:

      • content: Niveau de charge inférieur à 10%\n Key: agri-alert_batterie-faible-sur-le-capteur_sensor-zone-nord@farm.local\n Compteur de répétition: 1.

      • createdate: 2026-07-28T10:23:46.693Z.

      • hs_ticket_priority: MEDIUM.

      • hs_object_source: INTEGRATION.

      • url: <https://app-eu1.hubspot.com/contacts/148805580/record/0-5/426074892489>.

Capture d’écran des paramètres et de l’exécution du nœud 'Incrémenter Compteur & Update' dans n8n.

  • Input : Données de 'Existe déjà ?' avec :

    • total: 1(un résultat trouvé).

    • results[0].id: 426074892489.

    • propertiesdu ticket existant (ex:content,createdate).

  • Paramètres :

    • Method : PATCH.

    • URL :https://api.hubspot.com/crm/v3/objects/tickets/{{ $json.results[0].id }}(dynamic ID).

    • Authentication :

      • Generic Credential TypeBearer Authn8n-test-api-hubspot.

    • Send Headers :Content-Type: application/json.

  • Output :

    • id: 426074892489.

    • properties:

      • content: Niveau de charge inférieur à 10%\n [Alerte répétée requise le 2026-07-28T10:23:1332]\n Key: agri-alert_batterie-faible-sur-le-capteur_sensor-zone-nord@farm.local\n Compteur de répétition: 2.

      • hs_lastmodifieddate: 2026-07-28T10:26:23.833Z(mis à jour).

      • hs_v2_time_in_current_stage: 2026-07-28T10:26:23.833Z.

Capture d’écran du workflow 'Upsert & Dédoublonnage Capteurs AgroTech' après exécution réussie.

  • Logs (en bas à gauche) :

    • Success in 1.644spour l’ensemble du workflow.

    • Générer Clé d’Idempotence: Success in 2ms.

    • Rechercher Alerte Existante: Success in 150ms.

    • Existe déjà ?: Success in 1ms.

    • 'Incrémenter Compteur & Update: Success in 828ms'.

  • Output du nœud 'Incrémenter Compteur & Update' :

    • id: 426074892489.

    • properties:

      • content: Niveau de charge inférieur à 10%\n [Alerte répétée requise le 2026-07-28T10:23:1332]\n Key: agri-alert_batterie-faible-sur-le-capteur_sensor-zone-nord@farm.local\n Compteur de répétition: 2.

      • hs_lastmodifieddate: 2026-07-28T10:26:23.833Z.

      • hs_v2_time_in_current_stage: 2026-07-28T10:26:23.833Z.

En résumé

  • Les doublons arrivent pour des raisons légitimes : incident massif, double envoi, workflow relancé. C'est un contexte à anticiper.

  • Un workflow idempotent peut être déclenché plusieurs fois sans effet de bord : le résultat reste le même.

  • Choisissez votre clé d'unicité selon la source : identifiant stable ou combinaison sujet + email + fenêtre temporelle.

  • Le pattern upsert est la brique centrale pour protéger votre pipeline.

Dans le prochain chapitre, vous allez brancher un Agent IA sur ce pipeline : il lira chaque ticket enrichi et produira automatiquement une catégorie, un niveau d'escalade et un premier jet de réponse prêt à valider.

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best