Des idées de contenu tirées des concurrents qui cartonnent — le workflow n8n – AutomationBoost
Workflow n8n · gratuit

Des idées tirées des concurrents qui cartonnent

20 nœuds · rapport hebdomadaire · YouTube + Gmail

La vidéo promettait un générateur d'idées branché sur trois sources — les tendances, les concurrents, les hashtags — et un chiffre : 1200 idées par jour.

Commençons par ce qui est vrai. La brique qui existe vraiment, celle que je te donne ici, c'est la deuxième : l'analyse des concurrents. Elle va chercher les vidéos publiées par des chaînes que tu désignes, les classe par engagement réel, garde les dix meilleures et en tire dix idées argumentées, une fois par semaine, par email. Ce n'est pas 1200 par jour. C'est dix par semaine, et chacune est adossée à une vidéo qui a réellement performé.

Pourquoi je le dis comme ça

Le volet hashtags n'existe pas, et le volume annoncé dans la vidéo n'est pas ce que produit cet outil. Je préfère te donner la brique qui tourne plutôt qu'une page qui tient la promesse en mots et rien en fichier. Dix idées défendables valent mieux que mille lignes qu'on ne lit jamais — et c'est plutôt ça, le vrai problème d'une file d'idées.

Ce workflow est un modèle public signé Julien Sanson, que j'ai nettoyé et remis en français. Le crédit lui revient.

Ce qu'il fait, nœud par nœud

Ce ne sont pas des étapes idéales : c'est le contenu réel du fichier que tu vas copier plus bas.

  1. Weekly Trigger — se déclenche chaque lundi à 9 h.
  2. Workflow Configuration — le seul nœud que tu dois vraiment toucher. Il contient deux valeurs : la liste des identifiants de chaînes concurrentes, séparés par des virgules, et l'adresse email qui recevra le rapport.
  3. Get Competitor Channels (×4) — quatre branches en parallèle, une par chaîne. Chacune lit un identifiant différent dans la liste.
  4. Get Channel Videos (×4) — récupère les vidéos publiées sur les 30 derniers jours. C'est ce qui garde l'analyse fraîche : une vidéo qui a explosé il y a deux ans ne dit plus rien de ce qui marche maintenant.
  5. Get Video Statistics (×4) — va chercher vues, likes et commentaires pour chaque vidéo.
  6. Merge — rassemble les quatre branches en une seule liste.
  7. Calculate Engagement Score — un nœud de code qui calcule, pour chaque vidéo :
    ((likes + commentaires × 2) ÷ vues) × 1000
  8. Sort and Get Top 10 — trie par score décroissant, garde les dix premières, et les emballe en un seul élément.
  9. AI Video Ideas Generator — reçoit la liste des dix avec leurs chiffres, et rend dix idées. Pour chacune : un titre, deux ou trois phrases de description, une analyse du potentiel viral appuyée sur les chiffres des dix vidéos, et cinq à sept prompts d'image pour la miniature.
  10. Send Email Report — envoie le tout par Gmail, sujet Top 10 YouTube Video Ideas — Weekly Report.

Le calcul qui fait tout le travail

Une seule ligne de code porte l'intérêt du système, et elle mérite qu'on s'y arrête :

score = ((likes + commentaires × 2) ÷ vues) × 1000

Elle dit deux choses. D'abord, on divise par les vues : une vidéo à 2 000 vues qui déclenche 300 réactions bat une vidéo à 200 000 vues qui n'en déclenche que 400. C'est exactement ce que tu veux copier — un sujet qui fait réagir, pas un sujet qui a été poussé par un algorithme.

Ensuite, un commentaire compte double. Laisser un like coûte un geste ; écrire un commentaire coûte une minute. Le second signal est plus difficile à obtenir, donc plus fiable pour repérer un sujet qui touche.

Le facteur 1000 ne sert qu'à obtenir des nombres lisibles plutôt que des zéros après la virgule.

Comment l'installer

  1. Copie le bloc ci-dessous avec le bouton.
  2. Dans n8n : Workflows → Import from clipboard → colle → Import.
  3. Ouvre Workflow Configuration et remplace les quatre UC_CHAINE_CONCURRENTE_x par de vrais identifiants de chaînes, puis [email protected] par ton adresse.
  4. Branche tes accès sur les nœuds YouTube, sur le modèle de langage et sur Gmail. Le fichier n'en contient aucun — c'est voulu, un workflow ne doit jamais transporter les identifiants de quelqu'un d'autre.
  5. Active-le. Le premier rapport arrive le lundi suivant — ou lance-le à la main pour ne pas attendre.
Où trouver un identifiant de chaîne

Ce n'est pas le @nom visible dans l'URL. L'identifiant commence par UC et fait 24 caractères. Ouvre la chaîne, puis Partager la chaîne → Copier l'ID de la chaîne. Si tu colles un @nom à la place, les nœuds YouTube renvoient une erreur immédiate — et c'est une bonne nouvelle, tu le vois tout de suite.

Ce que j'ai retiré, et pourquoi

Le modèle d'origine traînait une seconde copie de lui-même : un brouillon plus ancien qui n'analysait qu'une seule chaîne, laissé dans la toile et débranché du reste. Il ne servait à rien et rendait le canevas illisible à l'ouverture. Je l'ai supprimé du fichier que tu télécharges. Ce que tu importes, ce sont les vingt nœuds réellement reliés entre eux — rien de plus.

Les identifiants de chaînes et l'adresse email d'origine ont aussi été remplacés par des marqueurs. Un workflow qu'on partage ne doit pas transporter la liste de veille ni la boîte mail de celui qui l'a écrit.

Le workflow, en entier

[IDEAS] Idées de contenu à partir des concurrents qui cartonnent
{
  "name": "[IDEAS] Idées de contenu à partir des concurrents qui cartonnent",
  "nodes": [
    {
      "id": "30eb8ead-93db-43c0-ac55-e70e9f4db034",
      "name": "Weekly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        288,
        80
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 9
            }
          ]
        }
      }
    },
    {
      "id": "8ec697c9-3307-48c1-a522-658304278ede",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        480,
        80
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "competitorChannelIds",
              "value": "=UC_CHAINE_CONCURRENTE_1,\nUC_CHAINE_CONCURRENTE_2,\nUC_CHAINE_CONCURRENTE_3,UC_CHAINE_CONCURRENTE_4",
              "type": "string"
            },
            {
              "id": "id-2",
              "name": "recipientEmail",
              "value": "[email protected]",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      }
    },
    {
      "id": "be567d71-481c-4b63-9378-da83c905e831",
      "name": "Get Competitor Channels",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        704,
        80
      ],
      "parameters": {
        "operation": "get",
        "channelId": "={{ $json.competitorChannelIds.split(',')[0].trim() }}"
      }
    },
    {
      "id": "953b976f-4851-4f23-997c-a4b482b118d1",
      "name": "Get Channel Videos",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        896,
        80
      ],
      "parameters": {
        "resource": "video",
        "returnAll": true,
        "filters": {
          "channelId": "={{ $json.id }}",
          "publishedAfter": "={{ $now.minus({ days: 30 }).toISO() }}"
        },
        "options": {}
      }
    },
    {
      "id": "773beb7f-175d-40fa-bf8b-7b2b1dd63d4a",
      "name": "Calculate Engagement Score",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        336,
        304
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Calculate engagement score for each video\nconst item = $input.item.json;\n\n// Extract video data\nconst title = item.snippet?.title || item.title || '';\nconst videoId = item.id?.videoId || item.id || '';\nconst url = `https://www.youtube.com/watch?v=${videoId}`;\n\n// Extract statistics\nconst views = parseInt(item.statistics?.viewCount || 0);\nconst likes = parseInt(item.statistics?.likeCount || 0);\nconst comments = parseInt(item.statistics?.commentCount || 0);\n\n// Calculate engagement score: (likes + comments * 2) / views * 1000\nlet engagementScore = 0;\nif (views > 0) {\n  engagementScore = ((likes + (comments * 2)) / views) * 1000;\n}\n\n// Return the processed data\nreturn {\n  title: title,\n  url: url,\n  views: views,\n  likes: likes,\n  comments: comments,\n  engagementScore: engagementScore\n};"
      }
    },
    {
      "id": "73333842-f189-4bde-a7c7-94d3c37836cd",
      "name": "Sort and Get Top 10",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        544,
        304
      ],
      "parameters": {
        "jsCode": "// Sort all items by engagementScore in descending order\nconst sortedItems = $input.all().sort((a, b) => {\n  const scoreA = a.json.engagementScore || 0;\n  const scoreB = b.json.engagementScore || 0;\n  return scoreB - scoreA;\n});\n\n// Get only the top 10 videos\nconst top10 = sortedItems.slice(0, 10);\n\n// Return a single item containing an array of all top 10 videos\nreturn [{ json: { videos: top10.map(item => item.json) } }];"
      }
    },
    {
      "id": "529c428c-db8e-4a16-9434-e08144a55238",
      "name": "Send Email Report",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1088,
        304
      ],
      "parameters": {
        "sendTo": "={{ $('Workflow Configuration').first().json.recipientEmail }}",
        "subject": "Top 10 YouTube Video Ideas - Weekly Report",
        "message": "={{ $('AI Video Ideas Generator2').first().json.output }}",
        "options": {}
      }
    },
    {
      "id": "37247b14-8954-4308-9799-dafb0f9142d0",
      "name": "Get Video Statistics",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        1088,
        80
      ],
      "parameters": {
        "resource": "video",
        "operation": "get",
        "videoId": "={{ $json.id.videoId }}",
        "part": [
          "snippet",
          "statistics"
        ],
        "options": {}
      }
    },
    {
      "id": "e9f4c663-03a2-4ea0-acc4-8cd15b6bb639",
      "name": "GPT Engine8",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        864,
        528
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4.1-mini",
          "mode": "list",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      }
    },
    {
      "id": "1caab242-9863-4a2b-aa9b-1903f687321c",
      "name": "AI Video Ideas Generator2",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        752,
        304
      ],
      "parameters": {
        "promptType": "define",
        "text": "=\nHere are the top 10 performing videos:\n\n{{ $json.videos.map((video, index) => `${index + 1}. ${video.title} (${video.views} views, ${video.likes} likes, ${video.comments} comments, Engagement Score: ${video.engagementScore.toFixed(2)})`).join('\\n') }}",
        "options": {
          "systemMessage": "=You are a YouTube content strategist and expert in viral growth, specializing prompting image.\n\nBased on the top 10 performing videos from competitor channels provided below, generate 10 unique video ideas with high viral potential. For each idea, provide:\n\n1. **Catchy Title** – A title that is click-worthy, keyword-optimized, and emotionally engaging.\n2. **Brief Description** – 2-3 sentences summarizing the content and value of the video.\n3. **Viral Potential Analysis** – Why this topic is likely to perform well, based on the data from the top 10 competitor videos (views, likes, comments, engagement score).\n4. **MidJourney Prompts** – 5 to 7 detailed prompts to generate visuals for this video, suitable for thumbnails or video clips. Include styles, moods, and relevant AI/no-code imagery.\n5. **Script with Hook** – A short script including:\n   - **Hook (first 5-10 seconds)** – Captivating question, bold claim, or surprising fact to grab attention.\n   - **Main Content Outline** – 3-5 key points or steps to deliver value.\n   - **Call to Action** – End with a strong call to like, subscribe, or visit a link.\n\nHere are the top 10 performing videos:\n\n{{ $json.videos.map((video, index) => `${index + 1}. ${video.title} (${video.views} views, ${video.likes} likes, ${video.comments} comments, Engagement Score: ${video.engagementScore.toFixed(2)})`).join('\\n') }}\n\nPlease analyze these videos and provide 10 unique video ideas in a **well-formatted HTML report** suitable for a professional email. The HTML should include headings, bold text, lists, and clear structure for readability.\n"
        }
      }
    },
    {
      "id": "dc10e25a-c3d3-442c-bc83-0357883f27e0",
      "name": "Get Competitor Channels2",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        704,
        -112
      ],
      "parameters": {
        "operation": "get",
        "channelId": "={{ $json.competitorChannelIds.split(',')[1].trim() }}"
      }
    },
    {
      "id": "86253b0e-ea86-4adc-969b-9221483a7dfa",
      "name": "Get Channel Videos2",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        896,
        -112
      ],
      "parameters": {
        "resource": "video",
        "returnAll": true,
        "filters": {
          "channelId": "={{ $json.id }}",
          "publishedAfter": "={{ $now.minus({ days: 30 }).toISO() }}"
        },
        "options": {}
      }
    },
    {
      "id": "17a21e77-be1e-4d72-9059-66f1d35fa10e",
      "name": "Get Video Statistics2",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        1088,
        -112
      ],
      "parameters": {
        "resource": "video",
        "operation": "get",
        "videoId": "={{ $json.id.videoId }}",
        "part": [
          "snippet",
          "statistics"
        ],
        "options": {}
      }
    },
    {
      "id": "76272d50-6855-4a84-b7c6-ddf07d6363ee",
      "name": "Get Competitor Channels3",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        672,
        -304
      ],
      "parameters": {
        "operation": "get",
        "channelId": "={{ $json.competitorChannelIds.split(',')[2].trim() }}"
      }
    },
    {
      "id": "53e0bac8-0aa0-4631-96cb-e2dfcd60ffa8",
      "name": "Get Channel Videos3",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        864,
        -304
      ],
      "parameters": {
        "resource": "video",
        "returnAll": true,
        "filters": {
          "channelId": "={{ $json.id }}",
          "publishedAfter": "={{ $now.minus({ days: 30 }).toISO() }}"
        },
        "options": {}
      }
    },
    {
      "id": "894a4e08-dc98-4498-859f-588ced721e8f",
      "name": "Get Video Statistics3",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        1056,
        -304
      ],
      "parameters": {
        "resource": "video",
        "operation": "get",
        "videoId": "={{ $json.id.videoId }}",
        "part": [
          "snippet",
          "statistics"
        ],
        "options": {}
      }
    },
    {
      "id": "11995811-0f29-42f3-b6dd-5b81c0f5c45b",
      "name": "Get Competitor Channels4",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        672,
        -496
      ],
      "parameters": {
        "operation": "get",
        "channelId": "={{ $json.competitorChannelIds.split(',')[3].trim() }}"
      }
    },
    {
      "id": "c8e62dd8-d400-487b-940c-80b05fe3fa62",
      "name": "Get Channel Videos4",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        864,
        -496
      ],
      "parameters": {
        "resource": "video",
        "returnAll": true,
        "filters": {
          "channelId": "={{ $json.id }}",
          "publishedAfter": "={{ $now.minus({ days: 300 }).toISO() }}"
        },
        "options": {}
      }
    },
    {
      "id": "1e03d40b-ed35-40ad-ab12-f5ab8a3a8961",
      "name": "Get Video Statistics4",
      "type": "n8n-nodes-base.youTube",
      "typeVersion": 1,
      "position": [
        1056,
        -496
      ],
      "parameters": {
        "resource": "video",
        "operation": "get",
        "videoId": "={{ $json.id.videoId }}",
        "part": [
          "snippet",
          "statistics"
        ],
        "options": {}
      }
    },
    {
      "id": "325f044b-f668-4f89-ad48-232a0db03cc1",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        1632,
        48
      ],
      "parameters": {
        "numberInputs": 4
      }
    }
  ],
  "connections": {
    "Weekly Trigger": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Get Competitor Channels",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Competitor Channels2",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Competitor Channels3",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Competitor Channels4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Competitor Channels": {
      "main": [
        [
          {
            "node": "Get Channel Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Engagement Score": {
      "main": [
        [
          {
            "node": "Sort and Get Top 10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort and Get Top 10": {
      "main": [
        [
          {
            "node": "AI Video Ideas Generator2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Channel Videos": {
      "main": [
        [
          {
            "node": "Get Video Statistics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Video Statistics": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT Engine8": {
      "ai_languageModel": [
        [
          {
            "node": "AI Video Ideas Generator2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Video Ideas Generator2": {
      "main": [
        [
          {
            "node": "Send Email Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Competitor Channels2": {
      "main": [
        [
          {
            "node": "Get Channel Videos2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Channel Videos2": {
      "main": [
        [
          {
            "node": "Get Video Statistics2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Video Statistics2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Get Competitor Channels3": {
      "main": [
        [
          {
            "node": "Get Channel Videos3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Channel Videos3": {
      "main": [
        [
          {
            "node": "Get Video Statistics3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Video Statistics3": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Get Competitor Channels4": {
      "main": [
        [
          {
            "node": "Get Channel Videos4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Channel Videos4": {
      "main": [
        [
          {
            "node": "Get Video Statistics4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Calculate Engagement Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Video Statistics4": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}

IDEAS | TONY PAYET / AUTOMATION BOOST | 2026

← Toutes les ressources