N8N WORKFLOWS ā SOCIAL MEDIA & AFFILIATE MARKETING
Affiliate Marketing Automation Workflow
Our Guidance
Hereās how this dual-tier system works, and what to connect for each tier.
Tier 1 (Free) needs only a Google Sheet and your already-connected Anthropic account ā add a product, and Claude drafts copy for all 7 platforms automatically.
Tier 2 (Full Automation, $299 setup + $97/month) additionally connects X, LinkedIn, Telegram, Facebook, Instagram, and Pinterest ā mark a row “Ready” and it publishes everywhere at once.
TikTok stays manual by design ā no API can auto-publish a video that doesnāt exist yet, so Tier 2 just flags the row once your script is ready to film.
Full credential setup for all 7 platforms is documented inside the workflowās own sticky notes ā no separate guide needed.
Enterprise or multi-brand catalogs start at $499+ ā reach out for a custom quote.
Get the Workflow File
{"name": "Affiliate Marketing Automation Workflow", "nodes": [{"parameters": {"pollTimes": {"item": [{"mode": "everyMinute"}]}, "documentId": {"__rl": true, "mode": "id", "value": "<__PLACEHOLDER_VALUE__same Google Sheet ID as Tier 1__>", "cachedResultName": "From Config"}, "sheetName": {"__rl": true, "mode": "list", "value": "", "cachedResultName": "Select your Products tab"}, "event": "rowUpdate", "options": {"columnsToWatch": ["Status"]}}, "id": "6a0c4ac3-f2d7-41a2-b6ce-2d594d385f5d", "name": "Status Changed to Ready", "type": "n8n-nodes-base.googleSheetsTrigger", "typeVersion": 1, "position": [-416, 496]}, {"parameters": {"assignments": {"assignments": [{"id": "sheetId", "name": "sheetId", "value": "<__PLACEHOLDER_VALUE__same Google Sheet ID as Tier 1__>", "type": "string"}, {"id": "sheetName", "name": "sheetName", "value": "Products", "type": "string"}, {"id": "linkedinOrgId", "name": "linkedinOrgId", "value": "<__PLACEHOLDER_VALUE__urn:li:organization:XXXXXXX__>", "type": "string"}, {"id": "telegramChatId", "name": "telegramChatId", "value": "<__PLACEHOLDER_VALUE__e.g. @yourchannel or -100XXXXXXXXXX__>", "type": "string"}, {"id": "facebookPageId", "name": "facebookPageId", "value": "<__PLACEHOLDER_VALUE__your Facebook Page ID__>", "type": "string"}, {"id": "instagramUserId", "name": "instagramUserId", "value": "<__PLACEHOLDER_VALUE__your Instagram Business Account ID (via Graph API)__>", "type": "string"}, {"id": "pinterestBoardId", "name": "pinterestBoardId", "value": "<__PLACEHOLDER_VALUE__your Pinterest Board ID__>", "type": "string"}]}, "includeOtherFields": true, "options": {}}, "id": "82985222-aa13-4b75-911e-24ca4628ba52", "name": "Config (edit me)", "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [-160, 496]}, {"parameters": {"conditions": {"options": {"caseSensitive": false, "leftValue": "", "typeValidation": "loose", "version": 1}, "combinator": "and", "conditions": [{"leftValue": "={{ $json.Status }}", "operator": {"type": "string", "operation": "equals"}, "rightValue": "Ready"}]}, "options": {}}, "id": "220a2c68-889b-4c38-91e5-fae93f3a1a06", "name": "Status = Ready?", "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [80, 496]}, {"parameters": {"text": "={{ $json.Twitter_Post }}", "additionalFields": {}}, "id": "cbf56f2a-6712-48ad-84e1-ad7f832fa930", "name": "Post to X (Twitter)", "type": "n8n-nodes-base.twitter", "typeVersion": 2, "position": [352, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"postAs": "organization", "organization": "={{ nodeJson(config, 'linkedinOrgId') }}", "text": "={{ $json.LinkedIn_Post }}", "additionalFields": {}}, "id": "6c2d8fef-13d3-4d74-9986-b4e25a0bdaf7", "name": "Post to LinkedIn", "type": "n8n-nodes-base.linkedIn", "typeVersion": 1, "position": [608, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"chatId": "={{ nodeJson(config, 'telegramChatId') }}", "text": "={{ $json.Telegram_Text }}", "additionalFields": {"appendAttribution": false, "parse_mode": "HTML"}}, "id": "ee090d00-1a4e-4bef-b730-7ee279f1674e", "name": "Post to Telegram", "type": "n8n-nodes-base.telegram", "typeVersion": 1.2, "position": [864, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "webhookId": "ba98df22-9c66-4790-8d5a-638375133156", "onError": "continueRegularOutput"}, {"parameters": {"httpRequestMethod": "POST", "graphApiVersion": "v23.0", "node": "={{ nodeJson(config, 'facebookPageId') }}", "edge": "feed", "options": {"queryParameters": {"parameter": [{"name": "message", "value": "={{ $json.Facebook_Post }}"}, {"name": "link", "value": "={{ $json.AffiliateLink }}"}]}}}, "id": "19bc870d-cc7e-4aae-9d5c-b6077c31dbf7", "name": "Post to Facebook Page", "type": "n8n-nodes-base.facebookGraphApi", "typeVersion": 1, "position": [1120, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"httpRequestMethod": "POST", "graphApiVersion": "v23.0", "node": "={{ nodeJson(config, 'instagramUserId') }}", "edge": "media", "options": {"queryParameters": {"parameter": [{"name": "image_url", "value": "={{ $json.ImageURL }}"}, {"name": "caption", "value": "={{ $json.Instagram_Caption }}"}]}}}, "id": "24e24738-0e76-462b-a848-3890354fdd67", "name": "Instagram: Create Media Container", "type": "n8n-nodes-base.facebookGraphApi", "typeVersion": 1, "position": [1392, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"httpRequestMethod": "POST", "graphApiVersion": "v23.0", "node": "={{ nodeJson(config, 'instagramUserId') }}", "edge": "media_publish", "options": {"queryParameters": {"parameter": [{"name": "creation_id", "value": "={{ $json.id }}"}]}}}, "id": "8af04660-b560-4494-81a6-e6d8c120d335", "name": "Instagram: Publish Container", "type": "n8n-nodes-base.facebookGraphApi", "typeVersion": 1, "position": [1648, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"method": "POST", "url": "https://api.pinterest.com/v5/pins", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ JSON.stringify({ board_id: nodeJson(config, 'pinterestBoardId'), link: $json.AffiliateLink, description: $json.Pinterest_Description, media_source: { source_type: 'image_url', url: $json.ImageURL } }) }}", "options": {}}, "id": "b2c5d20e-935e-43a8-a08b-55f70f9f8b3f", "name": "Post to Pinterest", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1904, 496], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "onError": "continueRegularOutput"}, {"parameters": {"operation": "update", "documentId": {"__rl": true, "mode": "id", "value": "={{ nodeJson(config, 'sheetId') }}", "cachedResultName": "From Config"}, "sheetName": {"__rl": true, "mode": "name", "value": "={{ nodeJson(config, 'sheetName') }}", "cachedResultName": "From Config"}, "columns": {"mappingMode": "defineBelow", "value": {"AffiliateLink": "={{ $json.AffiliateLink }}", "Status": "Published (TikTok needs manual filming + posting)"}, "schema": [{"id": "AffiliateLink", "displayName": "AffiliateLink", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true}, {"id": "Status", "displayName": "Status", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}], "matchingColumns": ["AffiliateLink"]}, "options": {}}, "id": "9448008a-83dc-462b-9156-207701c05b82", "name": "TikTok: Flag for Manual Filming", "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [2160, 496], "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000}, {"parameters": {}, "id": "65eefe8b-2e10-4903-a2e9-6328dd3b6404", "name": "Not Ready Yet - Skip", "type": "n8n-nodes-base.noOp", "typeVersion": 1, "position": [80, 720]}, {"parameters": {}, "id": "d0ea604c-2582-470c-8056-4d7091fc6b4b", "name": "On Any Error", "type": "n8n-nodes-base.errorTrigger", "typeVersion": 1, "position": [-432, 96]}, {"parameters": {"select": "channel", "channelId": {"__rl": true, "mode": "name", "value": "<__PLACEHOLDER_VALUE__e.g. ops-alerts__>", "cachedResultName": "From placeholder"}, "text": "={{ \"\ud83d\udea8 Tier 2 Publishing Engine failed: \" + $json.execution.error.message + \" (node: \" + $json.execution.error.node.name + \")\" }}", "otherOptions": {}}, "id": "19719e56-53bf-41c1-bfdd-c35924fae424", "name": "Notify Ops (Slack)", "type": "n8n-nodes-base.slack", "typeVersion": 2.5, "position": [272, 208], "webhookId": "07c9a0aa-9535-433e-be41-e4ba2559d820"}, {"parameters": {"content": "## š“ TIER 2: Automated Publishing Engine\n\nThis is the PAID, hands-free workflow. It watches your Sheet's Status column. The moment you change a row's Status to exactly \"Ready\", it publishes to all 7 platforms automatically (except TikTok ā see its note below for why).\n\n**Completely independent from Tier 1.** This workflow doesn't generate content ā it only reads whatever Tier 1 already wrote into the row and publishes it.\n\nā ļø **Color limitation, please read:** n8n sticky notes only support 7 fixed preset colors, not custom hex codes. I've mapped each platform to the closest/most distinct preset available and kept your exact emoji per platform so they stay visually distinct even where the exact hue doesn't match your brand-color spec.", "height": 440, "width": 560, "color": 7}, "id": "7f1132af-fa46-4a82-b4e9-594ef39fe834", "name": "Overview", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1088, -320]}, {"parameters": {"content": "## š§ How to Use This\n\n**Setup (once):**\n1. Fill in \"Config\": same Sheet ID/tab as Tier 1, plus your LinkedIn Organization URN, Telegram Chat ID, Facebook Page ID, Instagram Business Account ID, Pinterest Board ID\n2. Connect 6 accounts (see the color-coded notes below for exactly where to get each credential)\n3. On the trigger node, select your Sheet + tab\n4. Activate\n\n**Daily use:** open your Sheet, review the row Tier 1 generated, tweak anything you like, then change Status to exactly \"Ready\". Within a minute it publishes everywhere ā except TikTok, which still needs you to film and post manually (no API can auto-publish a script as a video).", "height": 400, "width": 560, "color": 2}, "id": "5bb1dce5-d914-47d3-b98f-752be63b84a7", "name": "How to Use This", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1088, 224]}, {"parameters": {"content": "## 0ļøā£ Error Monitoring\n\nEvery platform node has retry logic + continueOnFail ā if one platform's API is down, the others still publish. You get a Slack alert only on hard, unrecoverable failures.\n\nā ļø Settings ā Error Workflow ā select this workflow itself.", "height": 260, "width": 460, "color": 3}, "id": "d0ff4808-8c5c-42f2-b014-5a4f1cb04419", "name": "Error Monitoring", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1072, -672]}, {"parameters": {"content": "## šµ X / Twitter\n\n**Infrastructure & Rules:**\nX Developer Account + API v2. n8n's native X node uses OAuth2 (not the older OAuth 1.0a) ā create your credential via the X Developer Portal, generate OAuth2 Client ID/Secret, then connect via the credential dropdown here.\n\nFully automated. Subject to X's API rate limits and paid API tiers (check your tier's monthly post cap before relying on this for high volume).", "height": 256, "width": 636, "color": 5}, "id": "b7ba8465-10dd-4530-b917-c8a1dcf28bd2", "name": "X Twitter", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-608, -672]}, {"parameters": {"content": "## š· LinkedIn\n\n**Infrastructure & Rules:**\nLinkedIn Developer App + Share API (OAuth2). Create an app at developer.linkedin.com, request the \"Share on LinkedIn\" + \"Community Management API\" products, then connect via OAuth2 here.\n\nSupports automated posting. ā ļø Tokens expire every 60 days ā you'll need to reauthorize the credential periodically or this branch will silently fail (covered by error monitoring above).", "height": 256, "width": 636, "color": 2}, "id": "d306bf1c-b27c-4392-82f9-dab44652fde7", "name": "LinkedIn Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [32, -672]}, {"parameters": {"content": "## āļø Telegram\n\n**Infrastructure & Rules:**\nTelegram BotFather + Bot Token. Message @BotFather on Telegram, run /newbot, copy the token it gives you ā that's your entire credential.\n\nThe absolute easiest of all 7. 100% free, fully automated, and instant. Add your bot as an admin of your channel/group, and put that channel's ID (or @username) in Config.", "height": 252, "width": 588, "color": 7}, "id": "90b2ea23-cb7e-4d0e-9621-9f4b53f9a868", "name": "Telegram Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [672, -672]}, {"parameters": {"content": "## š Facebook\n\n**Infrastructure & Rules:**\nFacebook Page + Meta Developer App + Pages API (Graph API). Create an app at developers.facebook.com, add the \"Pages\" product, generate a Page Access Token with pages_manage_posts permission.\n\nHighly reliable for automated business Page publishing. This same Graph API connection is reused for Instagram right next to it.", "height": 252, "width": 572, "color": 4}, "id": "9b71ddc7-7e40-4a43-9802-b596e962ceb0", "name": "Facebook Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1264, -672]}, {"parameters": {"content": "## šø Instagram\n\n**Infrastructure & Rules:**\nMeta Business Suite + Graph API, via your Instagram Business Account connected to the Facebook Page above (same credential, no separate app needed).\n\nSupports automated single images (and carousels/Reels with more setup). ā ļø Requires a PUBLIC image URL ā this is why Tier 1's sheet has an ImageURL column. Two steps happen here: create a media container, then publish it.", "height": 292, "width": 640}, "id": "3716885c-90f0-4b81-8cc7-04dbbac5ebc0", "name": "Instagram Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [32, -400]}, {"parameters": {"content": "## š Pinterest\n\n**Infrastructure & Rules:**\nPinterest Business Account + API v5. Create an app at developers.pinterest.com, generate an access token, and connect it here as a Header Auth credential (Header Name: Authorization, Value: Bearer YOUR_TOKEN).\n\nAutomated pin creation with your affiliate link and description. Also requires a public ImageURL, same as Instagram. No native n8n node exists for Pinterest ā this uses a direct HTTP Request, so double-check the endpoint still matches Pinterest's current docs before relying on it heavily.", "height": 292, "width": 1164, "color": 3}, "id": "43ea7be3-0e1e-4e85-9946-7a7a1b090795", "name": "Pinterest Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [672, -400]}, {"parameters": {"content": "## š£ TikTok\n\n**Infrastructure & Rules:**\nTikTok Business Account + Content Posting API. Saves as drafts, or requires manual final approval via the mobile app ā this is intentional and TikTok-mandated, to prevent shadowbans on fully automated accounts.\n\nā ļø **Important:** TikTok is a video platform. Tier 1 only generates a script/caption, not an actual video file ā no API can auto-publish a video that doesn't exist yet. So this branch does NOT call TikTok's API. It marks the row so you know it's ready for you to film and post manually using the script already sitting in your Sheet.", "height": 540, "width": 444, "color": 6}, "id": "f2f6ec48-9e24-4b25-baf7-e08c92305f14", "name": "TikTok Note", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [1856, -656]}, {"parameters": {"pollTimes": {"item": [{"mode": "everyMinute"}]}, "documentId": {"__rl": true, "mode": "id", "value": "<__PLACEHOLDER_VALUE__paste your Google Sheet ID or full URL__>", "cachedResultName": "From Config"}, "sheetName": {"__rl": true, "mode": "list", "value": "", "cachedResultName": "Select your Products tab"}, "event": "rowAdded", "options": {}}, "id": "c7f78a89-ef2d-499c-be9b-6d9441e68976", "name": "New Product Row Added", "type": "n8n-nodes-base.googleSheetsTrigger", "typeVersion": 1, "position": [-496, -1904]}, {"parameters": {"jsCode": "\nconst items = $input.all();\n\nreturn items.map(item => {\n const row = item.json;\n const productName = row.ProductName || row['Product Name'] || row.product_name || row.Name || '';\n const description = row.Description || row.description || '';\n const affiliateLink = row.AffiliateLink || row['Affiliate Link'] || row.affiliate_link || row.Link || '';\n\n return {\n json: {\n productName,\n description,\n affiliateLink\n }\n };\n});\n"}, "id": "b401b231-b3f6-4759-b113-6e4e71c71cd1", "name": "Extract Product Data", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [0, -1904]}, {"parameters": {"modelId": {"__rl": true, "mode": "id", "value": "claude-sonnet-5"}, "messages": {"values": [{"content": "={{ \"Product Name: \" + nodeJson(extractProductData, 'productName') + \"\\nDescription: \" + nodeJson(extractProductData, 'description') + \"\\nAffiliate Link: \" + nodeJson(extractProductData, 'affiliateLink') + \"\\n\\nGenerate promotional content for SEVEN platforms:\\n- tiktok_hook: a 1-sentence attention-grabbing opening line for a short-form video\\n- tiktok_script: a 3-5 beat script/shot outline (hook, problem, product demo, benefit, CTA) plus a suggested visual description\\n- tiktok_caption: a caption under 150 characters with 3-5 trending relevant hashtags, ending with the affiliate link\\n- twitter_post: a punchy post under 280 characters with the affiliate link and 1-2 hashtags\\n- linkedin_post: a professional, value-driven post (3-5 sentences) focused on the problem it solves, ending with the affiliate link\\n- telegram_text: a clean, engaging broadcast message (3-4 sentences) with the affiliate link\\n- instagram_caption: an engaging caption (3-5 sentences) with a strong hook, line breaks, and 5-8 relevant hashtags, ending with the affiliate link\\n- facebook_post: a warm, conversational post (3-5 sentences) suited to a Facebook Page audience, ending with the affiliate link\\n- pinterest_description: an SEO-friendly pin description (under 500 characters) with 2-3 keyword-rich phrases and the affiliate link\\n\\nRespond with ONLY the JSON object, no markdown fences, no commentary.\" }"}]}, "options": {"system": "You are an expert affiliate marketing copywriter. Given the product name, description, and affiliate link, you generate platform-native promotional content for seven platforms. You ALWAYS respond with ONLY a single valid JSON object (no markdown fences, no commentary before or after) matching exactly this shape: {\"tiktok_hook\":string,\"tiktok_script\":string,\"tiktok_caption\":string,\"twitter_post\":string,\"linkedin_post\":string,\"telegram_text\":string,\"instagram_caption\":string,\"facebook_post\":string,\"pinterest_description\":string}. Every field must be plain text, ready to copy-paste and post as-is.", "maxTokens": 3000, "temperature": 0.8}}, "id": "6efab318-76ac-4059-8b5a-cba9d910f096", "name": "Generate Content (Claude)", "type": "@n8n/n8n-nodes-langchain.anthropic", "typeVersion": 1, "position": [272, -1904], "retryOnFail": true, "maxTries": 2, "waitBetweenTries": 3000, "credentials": {"anthropicApi": {"id": "LNlkJdvx9A1wJIV6", "name": "Anthropic account"}}}, {"parameters": {"jsCode": "\nconst items = $input.all();\n\nreturn items.map(item => {\n const json = item.json;\n let raw = json.content || json.text || (json.message && json.message.content) || '';\n if (Array.isArray(raw)) {\n raw = raw.map(block => (block && block.text) ? block.text : '').join('');\n }\n if (typeof raw !== 'string') {\n raw = String(raw || '');\n }\n\n const cleaned = raw.replace(/```json/gi, '').replace(/```/g, '').trim();\n\n let parsed = null;\n try {\n parsed = JSON.parse(cleaned);\n } catch (e) {\n parsed = null;\n }\n\n const parseError = !parsed || typeof parsed !== 'object';\n const parseStatus = parseError ? 'error' : 'ok';\n const get = (key) => (parseError ? '' : (parsed[key] || ''));\n\n return {\n json: {\n tiktok_hook: get('tiktok_hook'),\n tiktok_script: get('tiktok_script'),\n tiktok_caption: get('tiktok_caption'),\n twitter_post: get('twitter_post'),\n linkedin_post: get('linkedin_post'),\n telegram_text: get('telegram_text'),\n instagram_caption: get('instagram_caption'),\n facebook_post: get('facebook_post'),\n pinterest_description: get('pinterest_description'),\n parseStatus\n }\n };\n});\n"}, "id": "2e560ab2-82e4-4550-8e31-fa43b87fe370", "name": "Parse AI Output", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [528, -1904]}, {"parameters": {"conditions": {"options": {"caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 1}, "combinator": "and", "conditions": [{"leftValue": "={{ $json.parseStatus }}", "operator": {"type": "string", "operation": "equals"}, "rightValue": "ok"}]}, "options": {}}, "id": "3ef87839-4521-4038-8935-7d9eefdc4bca", "name": "Parsed Successfully?", "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [784, -1904]}, {"parameters": {"operation": "appendOrUpdate", "documentId": {"__rl": true, "mode": "id", "value": "={{ nodeJson(config, 'sheetId') }}", "cachedResultName": "From Config"}, "sheetName": {"__rl": true, "mode": "name", "value": "={{ nodeJson(config, 'sheetName') }}", "cachedResultName": "From Config"}, "columns": {"mappingMode": "defineBelow", "value": {"AffiliateLink": "={{ nodeJson(extractProductData, 'affiliateLink') }}", "TikTok_Script": "={{ $json.tiktok_hook + \"\\n\\n\" + $json.tiktok_script }}", "TikTok_Caption": "={{ $json.tiktok_caption }}", "Twitter_Post": "={{ $json.twitter_post }}", "LinkedIn_Post": "={{ $json.linkedin_post }}", "Telegram_Text": "={{ $json.telegram_text }}", "Instagram_Caption": "={{ $json.instagram_caption }}", "Facebook_Post": "={{ $json.facebook_post }}", "Pinterest_Description": "={{ $json.pinterest_description }}", "Status": "Generated - Ready to Review", "LastUpdated": "={{ $now.toISO() }}"}, "schema": [{"id": "ProductName", "displayName": "ProductName", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Description", "displayName": "Description", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "AffiliateLink", "displayName": "AffiliateLink", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true}, {"id": "ImageURL", "displayName": "ImageURL", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "TikTok_Script", "displayName": "TikTok_Script", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "TikTok_Caption", "displayName": "TikTok_Caption", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Twitter_Post", "displayName": "Twitter_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "LinkedIn_Post", "displayName": "LinkedIn_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Telegram_Text", "displayName": "Telegram_Text", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Instagram_Caption", "displayName": "Instagram_Caption", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Facebook_Post", "displayName": "Facebook_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Pinterest_Description", "displayName": "Pinterest_Description", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Status", "displayName": "Status", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "LastUpdated", "displayName": "LastUpdated", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}], "matchingColumns": ["AffiliateLink"]}, "options": {}}, "id": "54f535df-803e-4eab-803e-3b6a195257e6", "name": "Write Content to Sheet", "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [1040, -2016], "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000}, {"parameters": {"operation": "appendOrUpdate", "documentId": {"__rl": true, "mode": "id", "value": "={{ nodeJson(config, 'sheetId') }}", "cachedResultName": "From Config"}, "sheetName": {"__rl": true, "mode": "name", "value": "={{ nodeJson(config, 'sheetName') }}", "cachedResultName": "From Config"}, "columns": {"mappingMode": "defineBelow", "value": {"AffiliateLink": "={{ nodeJson(extractProductData, 'affiliateLink') }}", "Status": "Error - Could Not Parse AI Response (check manually)", "LastUpdated": "={{ $now.toISO() }}"}, "schema": [{"id": "ProductName", "displayName": "ProductName", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Description", "displayName": "Description", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "AffiliateLink", "displayName": "AffiliateLink", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true}, {"id": "ImageURL", "displayName": "ImageURL", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "TikTok_Script", "displayName": "TikTok_Script", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "TikTok_Caption", "displayName": "TikTok_Caption", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Twitter_Post", "displayName": "Twitter_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "LinkedIn_Post", "displayName": "LinkedIn_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Telegram_Text", "displayName": "Telegram_Text", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Instagram_Caption", "displayName": "Instagram_Caption", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Facebook_Post", "displayName": "Facebook_Post", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Pinterest_Description", "displayName": "Pinterest_Description", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "Status", "displayName": "Status", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}, {"id": "LastUpdated", "displayName": "LastUpdated", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false}], "matchingColumns": ["AffiliateLink"]}, "options": {}}, "id": "e55951d7-4b99-4da3-8d8c-c8bbcd6c3155", "name": "Log Parse Error", "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [1040, -1792], "retryOnFail": true, "maxTries": 3, "waitBetweenTries": 2000}, {"parameters": {"assignments": {"assignments": [{"id": "sheetId", "name": "sheetId", "value": "<__PLACEHOLDER_VALUE__same Google Sheet ID as above__>", "type": "string"}, {"id": "sheetName", "name": "sheetName", "value": "Products", "type": "string"}, {"id": "brandName", "name": "brandName", "value": "<__PLACEHOLDER_VALUE__e.g. Your Store Name__>", "type": "string"}]}, "includeOtherFields": true, "options": {}}, "id": "62625d24-f751-47ca-ac4b-73f369ed1f7d", "name": "Config (edit me)1", "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [-240, -1904]}, {"parameters": {"select": "channel", "channelId": {"__rl": true, "mode": "name", "value": "<__PLACEHOLDER_VALUE__e.g. ops-alerts__>", "cachedResultName": "From placeholder"}, "text": "={{ \"šØ Tier 1 Content Dashboard failed: \" + $json.execution.error.message + \" (node: \" + $json.execution.error.node.name + \")\" }}", "otherOptions": {}}, "id": "76d22326-1877-4f0b-8631-eae71ef177c0", "name": "Notify Ops (Slack)1", "type": "n8n-nodes-base.slack", "typeVersion": 2.5, "position": [272, -32], "webhookId": "8c1e442e-2fa5-4178-80c1-e005d6e2b8d2"}, {"parameters": {"content": "## šµ TIER 1: Free Content Dashboard\n\nThis is the FREE, simple workflow. Add a product to your Sheet ā Claude generates content for all 7 platforms ā everything lands in dedicated columns for you to review, tweak, and copy-paste manually.\n\n**This is a completely independent workflow from Tier 2.** Nothing here auto-publishes anywhere ā that's intentional. This workflow ends the moment content is written back to your sheet.\n\nWhen you're ready to go hands-free, Tier 2 (a separate workflow) picks up where this leaves off ā it watches for you to mark a row \"Ready\" and publishes automatically.", "height": 420, "width": 520, "color": 7}, "id": "8de789c0-3c1c-4a83-862a-013c52fa6abe", "name": "Overview1", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1056, -2016]}, {"parameters": {"content": "## š§ How to Use This\n\n**Setup (once, ~10 minutes):**\n1. Create a Google Sheet, tab \"Products\", header row: ProductName, Description, AffiliateLink, ImageURL, TikTok_Script, TikTok_Caption, Twitter_Post, LinkedIn_Post, Telegram_Text, Instagram_Caption, Facebook_Post, Pinterest_Description, Status, LastUpdated\n2. Fill in \"Config\": Sheet ID, tab name, brand name\n3. On the trigger node: select your Sheet + tab, connect Google Sheets (needs its own Trigger-specific credential slot)\n4. Anthropic (Claude) is already connected\n5. Activate\n\n**Daily use:** just add ProductName + Description + AffiliateLink to a new row. Content for all 7 platforms appears in that row within a minute. Add an ImageURL too if you plan to use Tier 2 later for Instagram/Facebook/Pinterest.", "height": 460, "width": 520, "color": 2}, "id": "aa550a6b-733d-4672-a23f-34818adb8d90", "name": "How to Use This1", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1056, -1520]}, {"parameters": {"jsCode": "const items = $input.all();\nconst tier1Nodes = ['New Product Row Added','Config (edit me)1','Extract Product Data','Generate Content (Claude)','Parse AI Output','Parsed Successfully?','Write Content to Sheet','Log Parse Error'];\nreturn items.map(item => {\n const failedNodeName = (item.json.execution && item.json.execution.error && item.json.execution.error.node && item.json.execution.error.node.name) || '';\n const track = tier1Nodes.includes(failedNodeName) ? 'tier1' : 'tier2';\n return { json: { ...item.json, track } };\n});"}, "id": "bf9620e8-7485-4894-b7af-dc2ea58ef457", "name": "Determine Failed Track", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [-192, 96]}, {"parameters": {"conditions": {"combinator": "and", "conditions": [{"leftValue": "={{ $json.track }}", "operator": {"operation": "equals", "type": "string"}, "rightValue": "tier1"}], "options": {"caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 1}}, "options": {}}, "id": "2ad31ef8-e1a4-4f93-b94a-ec4a13f7fec9", "name": "Which Track Failed?", "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [32, 96]}, {"parameters": {"content": "## š° Pricing & Value Proposition\n\n\n\n**Starter Package ā Free Tier Dashboard (Tier 1 only)**\nFree setup. Community support. Generates ready-to-post copy for all 7 platforms ā you review and post it yourself.\n\n**Full Automation Package ā Tier 1 + Tier 2**\n$299 one-time setup fee + $97/month maintenance & API support. Fully hands-free: mark a row \"Ready\" and it publishes everywhere automatically (except TikTok filming, which stays manual by platform design).\n\n**Enterprise / Custom Integration**\n$499+ setup fee. For multi-brand catalogs, custom platforms beyond these 7, or bespoke approval workflows.\n\n*Pricing note: this is a starting reference point, not audited SaaS/agency benchmarking ā sanity-check it against your actual support load and comparable local offers before publishing it publicly.*", "height": 460, "width": 640, "color": 4}, "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "name": "Pricing & Value Proposition", "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [-1088, 720]}], "connections": {"Status Changed to Ready": {"main": [[{"node": "Config (edit me)", "type": "main", "index": 0}]]}, "Config (edit me)": {"main": [[{"node": "Status = Ready?", "type": "main", "index": 0}]]}, "Status = Ready?": {"main": [[{"node": "Post to X (Twitter)", "type": "main", "index": 0}], [{"node": "Not Ready Yet - Skip", "type": "main", "index": 0}]]}, "Post to X (Twitter)": {"main": [[{"node": "Post to LinkedIn", "type": "main", "index": 0}]]}, "Post to LinkedIn": {"main": [[{"node": "Post to Telegram", "type": "main", "index": 0}]]}, "Post to Telegram": {"main": [[{"node": "Post to Facebook Page", "type": "main", "index": 0}]]}, "Post to Facebook Page": {"main": [[{"node": "Instagram: Create Media Container", "type": "main", "index": 0}]]}, "Instagram: Create Media Container": {"main": [[{"node": "Instagram: Publish Container", "type": "main", "index": 0}]]}, "Instagram: Publish Container": {"main": [[{"node": "Post to Pinterest", "type": "main", "index": 0}]]}, "Post to Pinterest": {"main": [[{"node": "TikTok: Flag for Manual Filming", "type": "main", "index": 0}]]}, "On Any Error": {"main": [[{"node": "Determine Failed Track", "type": "main", "index": 0}]]}, "New Product Row Added": {"main": [[{"node": "Config (edit me)1", "type": "main", "index": 0}]]}, "Extract Product Data": {"main": [[{"node": "Generate Content (Claude)", "type": "main", "index": 0}]]}, "Generate Content (Claude)": {"main": [[{"node": "Parse AI Output", "type": "main", "index": 0}]]}, "Parse AI Output": {"main": [[{"node": "Parsed Successfully?", "type": "main", "index": 0}]]}, "Parsed Successfully?": {"main": [[{"node": "Write Content to Sheet", "type": "main", "index": 0}], [{"node": "Log Parse Error", "type": "main", "index": 0}]]}, "Config (edit me)1": {"main": [[{"node": "Extract Product Data", "type": "main", "index": 0}]]}, "Determine Failed Track": {"main": [[{"node": "Which Track Failed?", "type": "main", "index": 0}]]}, "Which Track Failed?": {"main": [[{"node": "Notify Ops (Slack)1", "type": "main", "index": 0}], [{"node": "Notify Ops (Slack)", "type": "main", "index": 0}]]}}, "pinData": {}, "meta": {"aiBuilderAssisted": true, "builderVariant": "mcp", "instanceId": "a8610f00e1fe2a5bce768598a7e63848df427bd4d8770071107d6f6e694414de"}}