{"workflow":{"id":14302,"name":"Monitor Instagram hashtag trends and email reports with Apify and Gmail","views":2,"recentViews":1,"totalViews":2,"createdAt":"2026-03-24T16:52:24.372Z","description":"**📺 Full walkthrough video: https://www.youtube.com/watch?v=Me4d4BILvHk**\n\n## What it does\nThis workflow automatically monitors trending content on Instagram using keywords you define. It scrapes the most engaging posts, calculates an engagement score based on likes and comments, ranks content in a leaderboard, and delivers a professional HTML email dashboard — while storing historical data in a structured table for long-term trend tracking.\n\nNo manual research. No tab switching. Just the top-performing Instagram content in your inbox, automatically.\n\n## Who's it for\nSocial media managers, content creators, brand managers, marketing teams, and agencies who need to track hashtag performance and trending Instagram content for competitive analysis, content inspiration, and influencer discovery.\n\n## How it works\nThe workflow runs a full scraping cycle for each keyword in your list:\n\n- **Instagram Monitoring**: Scrapes hashtag-based posts with likes and comments\n- **Engagement Scoring**: Ranks content based on likes and comments\n- **Email Report**: Delivers a formatted HTML dashboard with clickable links to original posts\n- **Data Storage**: Pushes all results into a DataTable for historical tracking and trend analysis\n\n## Requirements\n\n- Apify account (free tier works — no recurring cost)\n- Gmail account for report delivery\n- n8n instance (cloud or self-hosted)\n- Instagram Scraper: `apify~instagram-scraper`\n\n## How to set up\n\n### Step 1: Configure Apify credentials\n- Set up Apify API authentication in n8n\n- Ensure access to the Instagram scraper: `apify~instagram-scraper`\n- Install the Apify community node: https://docs.apify.com/platform/integrations/n8n\n\n### Step 2: Add your keywords\nOpen the **\"Query social media\"** DataTable and add one keyword per row. The Loop Over Query node automatically runs a full Instagram scraping cycle for every keyword — no limit on the number of keywords.\n\n### Step 3: Configure search parameters\n\nInstagram:\n- Target hashtags via `directUrls`\n- Results type: `posts`\n- Time filter: `onlyPostsNewerThan: 7 days`\n- Result limit: 15\n\n### Step 4: Set up email reporting\n- Configure Gmail OAuth2 credentials in n8n\n- Update the recipient email address in the **Send a message** node\n- Customize subject and styling as needed\n\n### Step 5: Schedule the workflow\nAdd a Schedule Trigger to run the workflow automatically — daily, weekly, or at any interval that suits your monitoring needs.\n\n## Engagement scoring methodology\n\n**Instagram**\n`Score = (likes × 1) + (comments × 2)`\nFocused on recent content to capture trending moments. Carousel sub-items excluded to avoid duplicates.\n\n### Performance levels\n- **High**: Score ≥ 10,000 — viral or highly engaging content\n- **Medium**: Score ≥ 1,000 — solid engagement, worth monitoring\n- **Low**: Score &lt; 1,000 — baseline engagement\n\n## Results & dashboard\n\nThe automated email report includes:\n- **Instagram leaderboard**: Top 10 posts ranked by engagement score\n- **Per-post detail**: Account, content preview, score, level, and direct link to original post\n- **Historical DataTable**: One row per post with keyword, score, date — queryable over time\n\n## How to customize\n\n### Keyword targeting\n- Add as many keywords as needed — one row per keyword in the DataTable\n- Use brand names, product names, competitor terms, or campaign hashtags\n- Adjust for seasonal trends or campaign periods\n\n### Scoring adjustments\nModify the Code node to:\n- Change metric multipliers based on your priorities\n- Add recency bonuses for fresher content\n- Filter out low-quality or spam content\n\n### Reporting enhancements\n- Add multiple email recipients\n- Export results to Google Sheets or Airtable\n- Set alert thresholds for high-performing content\n- Connect to Slack or Teams for real-time notifications\n\n## Use cases\n\n**Brand & competitive monitoring**\nTrack brand mentions and competitor content performance on Instagram simultaneously.\n\n**Content strategy**\nIdentify top-performing posts, discover effective hashtags, and spot emerging trends before they peak.\n\n**Influencer discovery**\nFind creators driving the most engagement in your niche and evaluate potential collaborators based on real performance data.\n\n**Campaign tracking**\nMonitor hashtag campaigns, track sponsored content performance, and measure share of voice over time.\n\n## Limitations\n\n- Subject to Apify scraper quotas (free tier: ~$5 credit/month included)\n- Some private or restricted content may not be accessible\n- Dependent on third-party scraper availability and maintenance","workflow":{"meta":{"instanceId":"393ca9e36a1f81b0f643c72792946a5fe5e49eb4864181ba4032e5a408278263"},"nodes":[{"id":"7bd30fa4-5d9b-40d9-881f-1874d6b50aa5","name":"Sort Instagram Results","type":"n8n-nodes-base.code","notes":"### What the system does:\nLaunches Instagram hashtag scraping via Apify's Instagram scraper\nSearches recent posts (last 7 days) under specified hashtags\nImplements 30-second processing wait for data collection completion\nRetrieves Instagram post data including likes, comments, and captions\nFilters and processes main posts (excluding carousel items and stories)\nApplies Instagram-specific engagement scoring for content ranking\n\n**Instagram Scoring Formula:**\n- Likes: 1 point each\n- Comments: 2 points each (emphasizing meaningful engagement)\n- Final score = (likes × 1) + (comments × 2)\n\n### Result:\n✅ Top 10 most engaging Instagram posts identified\n✅ Visual content performance metrics captured\n✅ Influencer and brand content engagement measured\n✅ Platform-specific engagement patterns analyzed","position":[1504,2544],"parameters":{"jsCode":"// Code pour nœud Code n8n - Classement Instagram avec output simplifié\n// Récupérer les données d'entrée\nconst items = $input.all();\n\n// Filtrer uniquement les posts principaux (exclure les carousel_item)\nconst posts = items.filter(item => {\n  const post = item.json;\n  return post.productType !== 'carousel_item' && post.url && post.url.includes('/p/');\n});\n\n// Calculer le score pour chaque post\nconst postsWithScore = posts.map(item => {\n  const post = item.json;\n  \n  // likesCount peut être -1 si masqué par Instagram → on traite comme 0\n  const likes = (post.likesCount && post.likesCount > 0) ? post.likesCount : 0;\n  const comments = post.commentsCount || 0;\n  \n  // Calcul du score : (likes × 1) + (comments × 2)\n  const totalScore = (likes * 1) + (comments * 2);\n  \n  return {\n    json: {\n      url: post.url,\n      caption: post.caption || \"Pas de caption\",\n      score: totalScore,\n      details: {\n        likes: likes,\n        comments: comments,\n        type: post.type,\n        author: post.ownerUsername || 'inconnu',\n        timestamp: post.timestamp\n      }\n    }\n  };\n});\n\n// Trier par score décroissant\nconst sortedPosts = postsWithScore.sort((a, b) => b.json.score - a.json.score);\n\n// Prendre les 10 meilleurs\nconst top10Posts = sortedPosts.slice(0, 10);\n\n// Ajouter un rang à chaque post\nconst rankedPosts = top10Posts.map((post, index) => ({\n  json: {\n    rank: index + 1,\n    url: post.json.url,\n    caption: post.json.caption,\n    score: post.json.score\n  }\n}));\n\n// Log pour debug\nconsole.log(`🏆 TOP 10 POSTS INSTAGRAM - Score = (likes×1) + (comments×2)`);\nconsole.log(`────────────────────────────────────────────────────────────`);\nrankedPosts.forEach((post) => {\n  const p = post.json;\n  const shortCaption = p.caption.length > 60 ? p.caption.substring(0, 60) + '...' : p.caption;\n  console.log(`${p.rank}. Score: ${p.score}`);\n  console.log(`   URL: ${p.url}`);\n  console.log(`   Caption: \"${shortCaption}\"`);\n  console.log(`   ────────────────────────────────────────────────────────`);\n});\nconsole.log(`\\n📊 Analysé ${posts.length} posts au total`);\n\nreturn rankedPosts;"},"notesInFlow":true,"typeVersion":2},{"id":"250a1c09-2596-402e-b2ba-7f4bd3a2e99b","name":"Scheduled Run Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[624,2544],"parameters":{"rule":{"interval":[{}]}},"typeVersion":1.2},{"id":"f9fd04d6-364f-4432-9322-94cfcce56c4f","name":"Read Queries from Table","type":"n8n-nodes-base.dataTable","position":[832,2544],"parameters":{"operation":"get","returnAll":true,"dataTableId":{"__rl":true,"mode":"list","value":"BYMzHVIbNU0mmvAZ","cachedResultUrl":"/projects/oTpNUA7ZOCuhiQA0/datatables/BYMzHVIbNU0mmvAZ","cachedResultName":"Query social media"}},"typeVersion":1},{"id":"bc8ad46c-3107-4091-b179-d6bca7b20fe4","name":"Send Instagram Report Email","type":"n8n-nodes-base.gmail","notes":"Send dahsboard with top 10 of the most engaging post ","position":[1984,2544],"webhookId":"57a6f413-f0fa-4e3b-8576-96fce6d1a87f","parameters":{"sendTo":"user@example.com","message":"=<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Trends Social Media - {{ $('Loop Over Queries1').first().json.Query }}</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            min-height: 100vh;\n            padding: 20px;\n        }\n\n        .newsletter-container {\n            max-width: 1200px;\n            margin: 0 auto;\n            background: white;\n            border-radius: 20px;\n            overflow: hidden;\n            box-shadow: 0 20px 40px rgba(0,0,0,0.1);\n        }\n\n        .header {\n            background: linear-gradient(135deg, #ff6b6b, #ee5a24);\n            color: white;\n            padding: 40px 30px;\n            text-align: center;\n        }\n\n        .header h1 {\n            font-size: 2.8em;\n            margin-bottom: 10px;\n            font-weight: 700;\n        }\n\n        .header p {\n            font-size: 1.2em;\n            opacity: 0.9;\n            margin-bottom: 15px;\n        }\n\n        .keyword-badge {\n            display: inline-block;\n            background: rgba(255,255,255,0.2);\n            color: white;\n            padding: 8px 20px;\n            border-radius: 20px;\n            font-size: 1em;\n            font-weight: 600;\n            backdrop-filter: blur(10px);\n        }\n\n        .stats-overview {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 20px;\n            padding: 30px;\n            background: #f8f9fa;\n        }\n\n        .stat-card {\n            background: white;\n            padding: 20px;\n            border-radius: 15px;\n            text-align: center;\n            box-shadow: 0 5px 15px rgba(0,0,0,0.08);\n            border-left: 4px solid;\n        }\n\n        .stat-card.high { border-left-color: #ff4757; }\n        .stat-card.medium { border-left-color: #ffa502; }\n        .stat-card.low { border-left-color: #70a1ff; }\n\n        .stat-number {\n            font-size: 2.5em;\n            font-weight: bold;\n            margin-bottom: 5px;\n        }\n\n        .stat-label {\n            color: #666;\n            font-size: 0.9em;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n        }\n\n        .table-container {\n            margin: 30px;\n            background: white;\n            border-radius: 15px;\n            overflow: hidden;\n            box-shadow: 0 10px 25px rgba(0,0,0,0.1);\n        }\n\n        .table-header {\n            background: linear-gradient(135deg, #2c3e50, #34495e);\n            color: white;\n            padding: 25px 30px;\n            text-align: center;\n        }\n\n        .table-title {\n            font-size: 1.8em;\n            font-weight: 600;\n            margin-bottom: 5px;\n        }\n\n        .table-subtitle {\n            opacity: 0.8;\n            font-size: 1em;\n        }\n\n        .trends-table {\n            width: 100%;\n            border-collapse: collapse;\n            font-size: 0.95em;\n        }\n\n        .trends-table th {\n            background: #f8f9fa;\n            padding: 15px 12px;\n            text-align: left;\n            font-weight: 600;\n            color: #555;\n            border-bottom: 2px solid #dee2e6;\n            text-transform: uppercase;\n            font-size: 0.8em;\n            letter-spacing: 0.5px;\n        }\n\n        .trends-table td {\n            padding: 15px 12px;\n            border-bottom: 1px solid #eee;\n            vertical-align: middle;\n            text-align: center;\n        }\n\n        .trends-table td:nth-child(3),\n        .trends-table td:nth-child(4) {\n            text-align: left;\n        }\n\n        .trends-table tr:nth-child(even) {\n            background-color: #f8f9fa;\n        }\n\n        .trends-table tr:hover {\n            background-color: #e3f2fd;\n            transform: scale(1.01);\n            transition: all 0.2s ease;\n        }\n\n        .rank-number {\n            font-weight: bold;\n            font-size: 1.2em;\n            color: #2c3e50;\n        }\n\n        .rank-number.top3 {\n            color: #ff6b6b;\n            font-size: 1.4em;\n        }\n\n        .source-badge {\n            padding: 6px 12px;\n            border-radius: 20px;\n            font-size: 0.8em;\n            font-weight: 600;\n            text-transform: uppercase;\n            letter-spacing: 0.5px;\n        }\n\n        .source-badge.tiktok {\n            background: #ff0050;\n            color: white;\n        }\n\n        .source-badge.reddit {\n            background: #ff4500;\n            color: white;\n        }\n\n        .source-badge.instagram {\n            background: #e4405f;\n            color: white;\n        }\n\n        .level-badge {\n            padding: 4px 10px;\n            border-radius: 15px;\n            font-size: 0.75em;\n            font-weight: 600;\n            text-transform: uppercase;\n        }\n\n        .level-badge.high {\n            background: #ff4757;\n            color: white;\n        }\n\n        .level-badge.medium {\n            background: #ffa502;\n            color: white;\n        }\n\n        .level-badge.low {\n            background: #70a1ff;\n            color: white;\n        }\n\n        .content-text {\n            max-width: 250px;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            color: #555;\n            line-height: 1.4;\n        }\n\n        .author-link {\n            color: #667eea;\n            text-decoration: none;\n            font-weight: 600;\n        }\n\n        .author-link:hover {\n            text-decoration: underline;\n        }\n\n        .score-number {\n            font-weight: bold;\n            color: #2c3e50;\n            font-size: 1.1em;\n        }\n\n        .footer {\n            text-align: center;\n            padding: 30px;\n            background: #f8f9fa;\n            color: #666;\n            border-top: 1px solid #eee;\n        }\n\n        .footer p {\n            margin-bottom: 10px;\n        }\n\n        .date-info {\n            font-size: 0.9em;\n            color: #888;\n        }\n\n        @media (max-width: 768px) {\n            .newsletter-container {\n                margin: 10px;\n                border-radius: 15px;\n            }\n            \n            .header {\n                padding: 30px 20px;\n            }\n            \n            .header h1 {\n                font-size: 2.2em;\n            }\n            \n            .table-container {\n                margin: 20px;\n                overflow-x: auto;\n            }\n            \n            .trends-table {\n                min-width: 800px;\n            }\n            \n            .stats-overview {\n                padding: 20px;\n                grid-template-columns: 1fr;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"newsletter-container\">\n        <!-- Header -->\n        <header class=\"header\">\n            <h1>📊 Récapitulatif par Hashtag</h1>\n            <p>Scores totaux par réseau social</p>\n        </header>\n\n        <!-- Hashtag Summary Table -->\n        <section class=\"table-container\" style=\"margin: 30px 30px 0 30px;\">\n            <table class=\"trends-table\">\n                <thead>\n                    <tr>\n                        <th>Hashtag</th>\n                        <th>TikTok</th>\n                        <th>Reddit</th>\n                        <th>Instagram</th>\n                        <th>Score Total</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <tr>\n                        <td>\n                            <span style=\"font-weight: bold; color: #ff6b6b; font-size: 1.1em;\">#{{ $('Loop Over Queries1').first().json.Query }}</span>\n                        </td>\n                        <td>\n                            <span class=\"score-number\">{{ $('Rank Instagram Posts1').all().filter(item => item.json.source === 'TikTok').reduce((sum, item) => sum + item.json.score, 0).toLocaleString('fr-FR') }}</span>\n                        </td>\n                        <td>\n                            <span class=\"score-number\">{{ $('Rank Instagram Posts1').all().filter(item => item.json.source === 'Reddit').reduce((sum, item) => sum + item.json.score, 0).toLocaleString('fr-FR') }}</span>\n                        </td>\n                        <td>\n                            <span class=\"score-number\">{{ $('Rank Instagram Posts1').all().filter(item => item.json.source === 'Instagram').reduce((sum, item) => sum + item.json.score, 0).toLocaleString('fr-FR') }}</span>\n                        </td>\n                        <td>\n                            <span class=\"score-number\" style=\"color: #ff6b6b; font-size: 1.2em;\">{{ $('Rank Instagram Posts1').all().reduce((sum, item) => sum + item.json.score, 0).toLocaleString('fr-FR') }}</span>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </section>\n\n        <!-- Main Table -->\n        <section class=\"table-container\">\n            <div class=\"table-header\">\n                <div class=\"table-title\">#{{ $('Loop Over Queries1').first().json.Query }}</div>\n                <div class=\"table-subtitle\"></div>\n            </div>\n            \n            <table class=\"trends-table\">\n                <thead>\n                    <tr>\n                        <th>Rang</th>\n                        <th>Source</th>\n                        <th>Auteur</th>\n                        <th>Contenu</th>\n                        <th>Score</th>\n                        <th>Level</th>\n                    </tr>\n                </thead>\n                <tbody>\n                    {{ $('Rank Instagram Posts1').all().map(item => `\n                        <tr onclick=\"window.open('${item.json.url}', '_blank')\" style=\"cursor: pointer;\">\n                            <td>\n                                <span class=\"rank-number ${item.json.rank <= 3 ? 'top3' : ''}\">${item.json.rank}</span>\n                            </td>\n                            <td>\n                                <span class=\"source-badge ${item.json.source.toLowerCase()}\">${item.json.source}</span>\n                            </td>\n                            <td>\n                                <a href=\"${item.json.url}\" target=\"_blank\" class=\"author-link\">${item.json.author}</a>\n                            </td>\n                            <td>\n                                <div class=\"content-text\" title=\"${item.json.content}\">${item.json.content}</div>\n                            </td>\n                            <td>\n                                <span class=\"score-number\">${item.json.score.toLocaleString('fr-FR')}</span>\n                            </td>\n                            <td>\n                                <span class=\"level-badge ${item.json.level.toLowerCase()}\">${item.json.level}</span>\n                            </td>\n                        </tr>\n                    `).join('') }}\n                </tbody>\n            </table>\n        </section>\n\n        <!-- Footer -->\n        <footer class=\"footer\">\n            <p><strong>Social Media Trends Dashboard</strong></p>\n            <p>Analyse automatisée des contenus par mot-clé</p>\n            <div class=\"date-info\">\n                <p>Généré le {{ new Date().toLocaleDateString('fr-FR', { \n                    year: 'numeric', \n                    month: 'long', \n                    day: 'numeric', \n                    hour: '2-digit', \n                    minute: '2-digit' \n                }) }}</p>\n            </div>\n        </footer>\n    </div>\n</body>\n</html>","options":{},"subject":"Social media monitoring"},"credentials":{"gmailOAuth2":{"id":"credential-id","name":"Allan Growth AI"}},"executeOnce":true,"notesInFlow":true,"typeVersion":2.1},{"id":"7b695b73-05bd-4468-b089-2fa91a8211ed","name":"Save Results to Data Table","type":"n8n-nodes-base.dataTable","position":[1984,2416],"parameters":{"columns":{"value":{"url":"={{ $json.url }}","Date":"={{ $now.toISO() }}","rank":"={{ $json.rank }}","level":"={{ $json.level }}","score":"={{ $json.score }}","author":"={{ $json.author }}","source":"={{ $json.source }}","content":"={{ $json.content }}","keyword":"={{ $json.keyword }}"},"schema":[{"id":"rank","type":"number","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"rank","defaultMatch":false},{"id":"keyword","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"keyword","defaultMatch":false},{"id":"source","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"source","defaultMatch":false},{"id":"author","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"author","defaultMatch":false},{"id":"content","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"content","defaultMatch":false},{"id":"score","type":"number","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"score","defaultMatch":false},{"id":"level","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"level","defaultMatch":false},{"id":"url","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"url","defaultMatch":false},{"id":"Date","type":"dateTime","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Date","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"dataTableId":{"__rl":true,"mode":"list","value":"75Jvx9ALCoEGcdwY","cachedResultUrl":"/projects/oTpNUA7ZOCuhiQA0/datatables/75Jvx9ALCoEGcdwY","cachedResultName":"Trend Social media"}},"typeVersion":1},{"id":"61231991-602c-4ef5-aeed-b8e5606de43e","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[16,2240],"parameters":{"width":480,"height":896,"content":"## Untitled workflow\n\n### How it works\n\n1. A scheduled trigger fires periodically and fetches a list of search queries from a data table.\n2. The workflow loops over each query one at a time using a batch iterator.\n3. For each query, Instagram posts are fetched via the Apify API.\n4. The raw post data is sorted and then ranked using custom code.\n5. The ranked results are stored back into a data table and sent as a Gmail notification.\n6. The loop continues with the next query until all queries are processed.\n\n### Setup steps\n\n- - [ ] Configure the **Reddit Schedule Trigger** with the desired run frequency (e.g., daily, hourly).\n- - [ ] Set up the **Reddit Get row(s)** data table with the list of Instagram search queries to process.\n- - [ ] Add your **Apify API key** to the `Insta get posts solo` HTTP Request node (URL/auth configuration).\n- - [ ] Connect your **Gmail account** credentials to the `Reddit Send a message1` node and set the recipient email address.\n- - [ ] Configure the **Reddot Push to data table** node to point to the correct destination data table for storing results.\n\n### Customization\n\nYou can adjust the ranking and sorting logic inside the `Sort Instagram solo` and `Classement Instagram` code nodes to change how posts are scored or filtered. The batch size in `Reddit Loop Over Query` can also be tuned depending on API rate limits."},"typeVersion":1},{"id":"8e08c7c3-ecd9-4937-9d7b-72c48fac1e51","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[576,2384],"parameters":{"color":7,"width":400,"height":320,"content":"## Schedule trigger and query fetch\n\nA scheduled trigger fires the workflow and retrieves the list of Instagram search queries stored in a data table."},"typeVersion":1},{"id":"baf1d1b8-dad5-4fcf-87d0-9f80ebbd05d5","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[1056,2416],"parameters":{"color":7,"width":592,"height":304,"content":"## Loop and fetch Instagram posts\n\nIterates over each query in batches, calls the Apify Instagram API for each one, and collects the raw post data."},"typeVersion":1},{"id":"936ff1d1-7a62-48c9-9d82-5b1711bc0a16","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[1696,2240],"parameters":{"color":7,"width":432,"height":464,"content":"## Rank results and send output\n\nRanks the sorted Instagram posts using custom code, then simultaneously saves the results to a data table and sends a Gmail notification before looping back to the next query."},"typeVersion":1},{"id":"ac1436af-4006-400b-bad9-f15807682fdd","name":"Loop Over Queries1","type":"n8n-nodes-base.splitInBatches","position":[1104,2544],"parameters":{"options":{}},"typeVersion":3},{"id":"d13ce838-7324-4549-bb7f-8a6eef0631c8","name":"Rank Instagram Posts1","type":"n8n-nodes-base.code","notes":"Sorts all posts + give them points depending on their likes + comments","position":[1744,2544],"parameters":{"jsCode":"// Code pour nœud Code n8n - Classement Instagram\n// Récupérer le keyword dynamiquement\nconst keyword = $('Loop Over Query').first().json.Query;\n\n// Récupérer les données du nœud précédent\nconst instagramData = $('Sort Instagram').all();\n\nconsole.log(`📥 Récupération des données:`);\nconsole.log(`- Instagram: ${instagramData.length} posts`);\n\n// Fonction pour déterminer le level basé sur le score\nfunction getLevel(score) {\n  if (score >= 10000) return 'High';\n  if (score >= 1000) return 'Medium';\n  return 'Low';\n}\n\n// Fonction pour extraire l'auteur Instagram\nfunction getAuthor(item) {\n  const instaMatch = item.url.match(/instagram\\.com\\/([^\\/]+)/);\n  return instaMatch ? `@${instaMatch[1]}` : '@inconnu';\n}\n\n// Transformer les données Instagram\nconst instagramPosts = instagramData.map(item => ({\n  json: {\n    source: 'Instagram',\n    keyword: keyword,\n    author: getAuthor(item.json),\n    content: (item.json.caption || 'Pas de caption').substring(0, 50) + '...',\n    score: item.json.score,\n    level: getLevel(item.json.score),\n    url: item.json.url,\n    originalRank: item.json.rank\n  }\n}));\n\n// Trier par score décroissant\nconst sortedPosts = instagramPosts.sort((a, b) => b.json.score - a.json.score);\n\n// Ajouter le rang\nconst rankedPosts = sortedPosts.map((post, index) => ({\n  json: {\n    ...post.json,\n    rank: index + 1,\n    date: new Date().toISOString().split('T')[0]\n  }\n}));\n\n// Prendre le top 15\nconst topPosts = rankedPosts.slice(0, 15);\n\n// Statistiques par niveau\nconst stats = {\n  total: topPosts.length,\n  byLevel: {\n    High: topPosts.filter(p => p.json.level === 'High').length,\n    Medium: topPosts.filter(p => p.json.level === 'Medium').length,\n    Low: topPosts.filter(p => p.json.level === 'Low').length\n  }\n};\n\n// Log pour debug\nconsole.log(`🏆 TOP ${topPosts.length} POSTS INSTAGRAM - Mot-clé: \"${keyword}\"`);\nconsole.log(`────────────────────────────────────────────────────────────────────────────────`);\n\ntopPosts.forEach((post) => {\n  const p = post.json;\n  console.log(`${p.rank}. ${p.author} - Score: ${p.score.toLocaleString()} (${p.level})`);\n  console.log(`   Contenu: \"${p.content}\"`);\n  console.log(`   URL: ${p.url}`);\n  console.log(`   ────────────────────────────────────────────────────────────────────────────`);\n});\n\nconsole.log(`\\n📊 STATISTIQUES:`);\nconsole.log(`Total: ${stats.total} posts`);\nconsole.log(`Par niveau: High(${stats.byLevel.High}) | Medium(${stats.byLevel.Medium}) | Low(${stats.byLevel.Low})`);\n\n// Retourner le classement\nreturn topPosts;"},"notesInFlow":true,"typeVersion":2},{"id":"9a9d636a-458c-45b0-9d94-53b9265429b6","name":"Fetch Instagram Posts via Apify1","type":"n8n-nodes-base.httpRequest","notes":"Post the request on apify","position":[1312,2544],"parameters":{"url":"https://api.apify.com/v2/acts/reGe1ST3OBgYZSsZJ/run-sync-get-dataset-items","method":"POST","options":{},"jsonBody":"={\n    \"hashtags\": [\n        \"{{ $json.Query.replace(/\\s+/g, '') }}\"\n    ],\n    \"keywordSearch\": false,\n    \"resultsLimit\": 50,\n    \"resultsType\": \"posts\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"nodeCredentialType":"apifyApi"},"credentials":{"apifyApi":{"id":"credential-id","name":"Bonus 4"},"httpHeaderAuth":{"id":"credential-id","name":"Apify"}},"executeOnce":false,"notesInFlow":true,"retryOnFail":true,"typeVersion":4.2}],"pinData":{},"connections":{"Loop Over Queries1":{"main":[[],[{"node":"Fetch Instagram Posts via Apify1","type":"main","index":0}]]},"Rank Instagram Posts1":{"main":[[{"node":"Send Instagram Report Email","type":"main","index":0},{"node":"Save Results to Data Table","type":"main","index":0}]]},"Scheduled Run Trigger":{"main":[[{"node":"Read Queries from Table","type":"main","index":0}]]},"Sort Instagram Results":{"main":[[{"node":"Rank Instagram Posts1","type":"main","index":0}]]},"Read Queries from Table":{"main":[[{"node":"Loop Over Queries1","type":"main","index":0}]]},"Send Instagram Report Email":{"main":[[{"node":"Loop Over Queries1","type":"main","index":0}]]},"Fetch Instagram Posts via Apify1":{"main":[[{"node":"Sort Instagram Results","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":12,"nodeTypes":{"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.dataTable":{"count":2},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.httpRequest":{"count":1},"n8n-nodes-base.splitInBatches":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Growth AI","username":"growthai","bio":"n8n automation expert eliminating repetitive tasks for businesses. Specializing in native API integrations (HubSpot, Pipedrive, Notion, Gmail, Slack) with custom workflows tailored to your tech stack. GDPR-compliant European hosting with AI agents. From lead qualification to content generation - I architect battle-tested automations that run 24/7. Your manual routines disappear without pain.\n","verified":true,"links":["https://growth-ai.fr/"],"avatar":"https://gravatar.com/avatar/e93e43e1e71be1aee89eb849a5396be04c95604624b155a29298b9209e2534c3?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1315,"icon":"fa:table","name":"n8n-nodes-base.dataTable","codex":{"data":{"alias":["data","table","knowledge","data table","table","sheet","database","data base","mysql","postgres","postgresql","airtable","supabase","noco","notion"],"details":"Data table","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.datatable/"}]},"categories":["Core Nodes","Development"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\",\"transform\"]","defaults":{"name":"Data table"},"iconData":{"icon":"table","type":"icon"},"displayName":"Data table","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":32,"name":"Market Research"},{"id":49,"name":"AI Summarization"}],"image":[]}}