Chapitre 5/9 • 15 min de lecture

Itérateurs

Traiter chaque élément d'un tableau séparément, puis recoller le résultat.

⏱️ En bref : Quand un module renvoie un tableau (5 emails, 10 deals, une liste de leads), Make a besoin d'un Iterator pour le "déplier" en bundles individuels que les modules suivants traiteront un par un. À la fin on utilise souvent un Array Aggregator pour recoller. C'est la base du traitement par lots.

Le problème que résout un itérateur

Make.com fonctionne par bundles. Un module qui sort 5 bundles déclenche 5 exécutions des modules suivants. Mais certains modules retournent un tableau dans un seul bundle, par exemple :

  • Un webhook Pipedrive qui envoie une liste de produits dans le deal : products: [{...}, {...}, {...}]
  • Une réponse API qui contient un array de résultats : {"data": [{...}, {...}]}
  • Un parser CSV qui retourne toutes les lignes en une fois

Sans itérateur, vous ne pouvez accéder qu'au premier élément du tableau ({{1.products[1].name}}) ou à tous d'un coup. Pour traiter chaque élément séparément (créer un produit dans Pipedrive pour chaque ligne), il faut un Iterator.

Ajouter un Iterator

Dans le scenario builder, ajoutez un module Flow Control → Iterator juste après le module qui sort le tableau. Dans son champ Array, mappez le tableau à itérer (ex : {{1.products}}).

À l'exécution, l'Iterator transforme un bundle contenant un tableau de N éléments en N bundles séquentiels. Tous les modules suivants vont s'exécuter N fois, une fois par élément. Vous accédez à chaque élément avec {{2.name}} (où 2 est l'ID de l'iterator).

💡 Astuce dimensionnement

Un Iterator qui déplie un tableau de 100 éléments dans un scénario à 4 modules en aval = 400 opérations par exécution. Pensez-y avant d'itérer sur des gros datasets : préférez parfois un Array Aggregator + un seul appel API en mode batch.

Recoller avec un Array Aggregator

Souvent, après avoir traité chaque élément séparément, on veut recombiner les résultats en un seul bundle. Exemple : itérer sur 10 leads, enrichir chacun via Clay, puis envoyer un seul email récapitulatif.

Pour ça, on ajoute un Flow Control → Array Aggregator à la fin de la boucle. Configurez :

  • Source module : l'iterator d'origine (Make doit savoir où la boucle commence)
  • Aggregated fields : sélectionner les champs à conserver dans le tableau final

L'Array Aggregator collecte tous les bundles produits par la boucle et les ressort en un seul bundle contenant un tableau, prêt à être passé au module suivant (ex : un module Slack qui formate le récap).

Iterator vs autres aggregators

Make propose plusieurs aggregators selon le format de sortie souhaité :

  • Array Aggregator : sort un tableau structuré. Le plus utilisé
  • Text Aggregator : concatène en texte avec un séparateur. Utile pour générer une liste à puces dans un email
  • Numeric Aggregator : sum, avg, min, max sur une valeur numérique. Utile pour totaux
  • Table Aggregator : sort un tableau formaté HTML/Markdown

Patterns courants en production

Trois cas d'usage que je vois revenir constamment :

  • Pipedrive deal won → itérer sur les produits → créer une ligne de facture par produit dans Sellsy/Dolibarr
  • Récupérer la liste des deals d'un owner → itérer → enrichir chaque contact via Clay → recoller en CSV
  • Webhook formulaire avec multi-select → itérer sur les options choisies → créer une activité Pipedrive par option

Pièges classiques

  • Oublier l'Array Aggregator : si vous avez besoin d'un seul bundle final (envoyer un email récap), sans aggregator vous envoyez N emails au lieu d'un
  • Itérer sur null : si le tableau source peut être vide ou absent, ajouter un filtre {{length(1.products)}} > 0 avant l'iterator
  • Aggregator dans la mauvaise source : l'aggregator doit pointer sur l'iterator, pas sur un module intermédiaire. Sinon le tableau sera mal délimité
  • Concurrence et opérations : un iterator de 1 000 éléments avec 5 modules en aval = 5 000 opérations. Surveiller le quota

Pour l'usage avancé d'itérateurs avec branches conditionnelles, voir le chapitre Routeurs et filtres.