{
  "nodes": [
    {
      "name": "Telegram Bot Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        0,
        544
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        336
      ],
      "parameters": {
        "width": 389,
        "height": 384,
        "content": "# \ud83d\udcf1 Telegram URL Processor\n\nThis workflow receives URLs from Telegram and processes them into social media content:\n\n- \u2705 Extracts URL from message\n- \ud83d\udcca Saves to Google Sheets\n- \ud83d\udcc4 Fetches content\n- \ud83e\udd16 AI summarization\n- \ud83c\udfa8 Image generation\n- \ud83d\udcf1 Multi-platform posting\n- \u2705 Returns post URLs"
      },
      "typeVersion": 1
    },
    {
      "name": "Extract URL",
      "type": "n8n-nodes-base.function",
      "position": [
        448,
        448
      ],
      "parameters": {
        "functionCode": "// Extract URL from Telegram message\nconst message = $json.message.text;\nconst urlRegex = /(https?:\\/\\/[^\\s]+)/g;\nconst urls = message.match(urlRegex);\n\nif (!urls || urls.length === 0) {\n  throw new Error('No URL found in the message');\n}\n\nconst extractedUrl = urls[0];\nconst chatId = $json.message.chat.id;\nconst messageId = $json.message.message_id;\nconst timestamp = new Date().toISOString();\n\nreturn {\n  json: {\n    url: extractedUrl,\n    chatId: chatId,\n    messageId: messageId,\n    timestamp: timestamp,\n    originalMessage: message\n  }\n};"
      },
      "typeVersion": 1
    },
    {
      "name": "Fetch URL Content",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        896,
        448
      ],
      "parameters": {
        "url": "={{ $node['Extract URL'].json.url }}",
        "options": {
          "redirect": {
            "redirect": {}
          },
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Extract Text Content",
      "type": "n8n-nodes-base.function",
      "position": [
        1120,
        448
      ],
      "parameters": {
        "functionCode": "// Extract text content from HTML\nconst html = $json.data;\nconst url = $node['Extract URL'].json.url;\n\n// Simple HTML to text conversion\nlet textContent = html\n  .replace(/<script[^>]*>.*?<\\/script>/gi, '')\n  .replace(/<style[^>]*>.*?<\\/style>/gi, '')\n  .replace(/<[^>]*>/g, ' ')\n  .replace(/\\s+/g, ' ')\n  .trim();\n\n// Extract title (simple approach)\nconst titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/i);\nconst title = titleMatch ? titleMatch[1].trim() : 'Article';\n\n// Limit content length for AI processing\nif (textContent.length > 8000) {\n  textContent = textContent.substring(0, 8000) + '...';\n}\n\nif (textContent.length < 100) {\n  throw new Error('Could not extract meaningful content from the URL');\n}\n\nreturn {\n  json: {\n    url: url,\n    title: title,\n    content: textContent,\n    wordCount: textContent.split(' ').length\n  }\n};"
      },
      "typeVersion": 1
    },
    {
      "name": "AI Processing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1328,
        64
      ],
      "parameters": {
        "width": 280,
        "height": 864,
        "content": "# \ud83e\udd16 AI Content Generation\n\nThis section handles:\n- Content summarization\n- Social media post creation\n- Image description generation\n- Platform-specific optimization"
      },
      "typeVersion": 1
    },
    {
      "name": "Post to Facebook",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3520,
        276
      ],
      "parameters": {
        "url": "=https://graph.facebook.com/v19.0/[INSERT_YOUR_SITE_ID]/photos",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "caption",
              "value": "={{ $input.first().json.message.content }}"
            },
            {
              "name": "=url",
              "value": "={{ $item(0).$node[\"Supabase Public URL\"].json[\"public_url\"] }}"
            },
            {
              "value": "="
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/x-www-form-urlencoded"
            }
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Post to Instagram",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3520,
        468
      ],
      "parameters": {
        "url": "=https://graph.facebook.com/v23.0/[INSERT_YOUR_SITE_ID]/media",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "image_url",
              "value": "={{ $item(0).$node[\"Supabase Public URL\"].json[\"public_url\"] }}"
            },
            {
              "name": "caption",
              "value": "={{ $input.first().json.message.content }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/x-www-form-urlencoded"
            }
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Final Status Update",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4864,
        448
      ],
      "parameters": {
        "columns": {
          "value": {
            "Image URL": "={{ $item(0).$node[\"Supabase Public URL\"].json[\"public_url\"] }}",
            "Source URL": "={{ $node[\"Telegram Bot Trigger\"].json.message.text }}",
            "Facebook URL": "={{ $json.facebook_post_url }}",
            "LinkedIn URL": "={{ $json.linkedin_post_url }}",
            "Instagram URL": "={{ $json.instagram_post_url }}",
            "Facebook Content": "={{ $node[\"Facebook Post\"].json.message.content }}",
            "Instagram Content": "={{ $node[\"Instagram Post\"].json.message.content }}",
            "LinkedIn Content ": "={{ $node[\"LinkedIn Post\"].json.message.content }}"
          },
          "schema": [
            {
              "id": "Source URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Source URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Facebook Content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Facebook Content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Facebook URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Facebook URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Instagram Content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram Content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Instagram URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn Content ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn Content ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Image URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Image URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Source URL"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw/edit#gid=0",
          "cachedResultName": "Arkusz1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw/edit?usp=drivesdk",
          "cachedResultName": "n8n - Telegram Social Media Content Automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4,
      "alwaysOutputData": true
    },
    {
      "name": "Publishing Phase",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4568,
        -44
      ],
      "parameters": {
        "height": 652,
        "content": "# \ud83d\udcf1 Social Media Publishing\n\nPosts content to:\n- Facebook Pages via Graph API\n- Instagram Business via Graph API\n- LinkedIn via REST API"
      },
      "typeVersion": 1
    },
    {
      "name": "Post to Instagram1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3744,
        468
      ],
      "parameters": {
        "url": "=https://graph.facebook.com/v23.0/[INSERT_YOUR_SITE_ID]/media_publish",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "creation_id",
              "value": "={{ $json.id }}"
            },
            {
              "name": "access_token",
              "value": "={{ $credentials.facebookGraph.accessToken }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/x-www-form-urlencoded"
            }
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Facebook Post",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1344,
        368
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "GPT-4.1-NANO"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Based on the provided article content, create a Facebook post that is professional yet approachable, ranging from 100-200 words. The tone should be informative and engaging, with occasional light humor when appropriate to the topic. Focus on the key takeaway or most interesting insight from the article. Include a clear call-to-action that encourages meaningful discussion in the comments. The post should feel conversational and relatable while maintaining credibility. If the topic allows, incorporate a subtle touch of humor or a relatable analogy that your professional network would appreciate. Keep the language of the original text. End with a thoughtful question to spark engagement.:  {{ $('Extract Text Content').item.json.content }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "name": "Instagram Post",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1344,
        560
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "GPT-4.1-NANO"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Transform the article content into a punchy Instagram post of 50-80 words maximum. Use a casual, energetic tone with 2-3 relevant emojis strategically placed. Include wordplay, puns, or clever turns of phrase when they fit naturally. Focus on one compelling hook or surprising fact from the article. Write in short, impactful sentences that work well with Instagram's visual-first format. Include 3-5 relevant hashtags at the end. The post should feel fresh, scrollable, and shareable while still delivering value from the original content. Keep the languafe of the original:  {{ $('Extract Text Content').item.json.content }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "name": "LinkedIn Post",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1344,
        744
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "GPT-4.1-NANO"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Create an engaging, professional LinkedIn post (max 400 characters) based on this article:  {{ $('Extract Text Content').item.json.content }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        3296,
        276
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        3296,
        468
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "name": "Merge2",
      "type": "n8n-nodes-base.merge",
      "position": [
        3296,
        888
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "name": "If message contains URL",
      "type": "n8n-nodes-base.if",
      "position": [
        224,
        544
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "dc0117b8-213b-4c6f-934e-583fe2ec7d45",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "=={{ ($json.message.text || '').match(/https?:\\/\\/\\S+/) !== null }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "name": "Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        448,
        640
      ],
      "parameters": {
        "text": "You can't do this here. You need to upload a URL with an article.",
        "chatId": "={{ $json.message.chat.id }}",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        3968,
        272
      ],
      "parameters": {
        "jsCode": "const id = $json.post_id || $json.id || '';\nconst parts = id.split('_');\nconst postId = parts.length > 1 ? parts[1] : '';\nconst facebookUsername = '<YOUR_FACEBOOK_PAGE_USERNAME>';\nconst facebookPostUrl = postId\n  ? `https://facebook.com/${facebookUsername}/posts/${postId}`\n  : '';\n\nreturn {\n  json: {\n    facebook_post_id: postId,\n    facebook_post_url: facebookPostUrl,\n    facebook_published: !!postId\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "name": "Code1",
      "type": "n8n-nodes-base.code",
      "position": [
        4192,
        468
      ],
      "parameters": {
        "jsCode": "const mediaId = $json.id || '';\nreturn {\n  json: {\n    instagram_post_id: mediaId,\n    instagram_post_url: $input.first().json.permalink, // nie mamy shortcode :(\n    instagram_published: !!mediaId\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "name": "LinkedIn",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        3744,
        888
      ],
      "parameters": {
        "text": "={{ $('LinkedIn Post').item.json.message.content }}",
        "person": "wZFKPz_aPr",
        "additionalFields": {},
        "shareMediaCategory": "IMAGE"
      },
      "credentials": {
        "linkedInOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Binary File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3520,
        888
      ],
      "parameters": {
        "url": "={{ $json.public_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Merge3",
      "type": "n8n-nodes-base.merge",
      "position": [
        4416,
        432
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "name": "Get Post URL",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3968,
        468
      ],
      "parameters": {
        "url": "={{ `https://graph.facebook.com/${$json.fbApiVersion || 'v19.0'}/${$json.id}?fields=permalink` }}",
        "options": {},
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {}
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Code2",
      "type": "n8n-nodes-base.code",
      "position": [
        3968,
        888
      ],
      "parameters": {
        "jsCode": "const urn = $json.urn || ''; // example: urn:li:share:7342310895114420224\nconst postId = urn.split(':').pop(); // get the numeric ID\n\nconst linkedinPostUrl = postId \n  ? `https://www.linkedin.com/feed/update/${urn.replace('urn:li:', '').replace(/:/g, '%3A')}/`\n  : '';\n\nreturn {\n  json: {\n    linkedin_post_id: postId,\n    linkedin_post_url: linkedinPostUrl,\n    linkedin_published: !!postId\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "name": "Code3",
      "type": "n8n-nodes-base.code",
      "position": [
        4640,
        448
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    json: Object.assign({}, ...items.map(item => item.json))\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        2272,
        716
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "bb4004a1-9c8b-4603-b8ed-227e50940f87",
              "name": "filename",
              "type": "string",
              "value": "={{$now.toMillis()}}.png"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "name": "Generate an image1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        2048,
        716
      ],
      "parameters": {
        "model": "gpt-image-1",
        "prompt": "={{ $json.text }}",
        "options": {
          "size": "1024x1024",
          "quality": "high"
        },
        "resource": "image"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "name": "Basic LLM Chain2",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1696,
        716
      ],
      "parameters": {
        "text": "=Wygeneruj prompt dla Recraft, tak, aby wygenerowa\u0142 profesjonalny obraz na social media (Facebook, Instagram) do tego TEMATU: {{ $json.text }} Pami\u0119taj, \u017ce obraz ma by\u0107 interesuj\u0105cy, pasuj\u0105cy do bloga technologicznego, na przyk\u0142ad fotorealistyczne fotki ekspert\u00f3w w biurze, w terenie, zdj\u0119cia konkretnych sprzetow, technologii czy koncepcji opisanych w artykule. Obrazki maj\u0105 by\u0107 esetyczne, wywo\u0142uj\u0105ce pozytywne uczucia. Tematyka i wygl\u0105d obrazka ma \u015bci\u015ble wi\u0105za\u0107 si\u0119 z tre\u015bci\u0105 zadanego TEMATU. W Prawym dolnym rogu ma by\u0107 ma\u0142y napis SmartCamp.AI. Pami\u0119taj, \u017ce to jest  prompt, kt\u00f3ry p\u00f3\u017aniej b\u0119dzie wklejany do body w api, wiec unikaj element\u00f3w, kt\u00f3re moga popsu\u0107 json (Nie mo\u017cesz u\u017cywa\u0107 cudzys\u0142ow\u00f3w). Wygeneruj sam prompt, bez wst\u0119pu, bez cudzys\u0142ow\u00f3w. Ca\u0142a wiadomo\u015b\u0107 musi mie\u0107 mniej ni\u017c 1000 znak\u00f3w.",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "name": "Send a photo message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        5088,
        448
      ],
      "parameters": {
        "file": "={{ $item(0).$node[\"Supabase Public URL\"].json[\"public_url\"] }}",
        "chatId": "={{ $node[\"Telegram Bot Trigger\"].json.message.chat.id }}",
        "operation": "sendPhoto",
        "additionalFields": {
          "caption": "=Content published!\n\nFacebook Post: {{ $node[\"Code3\"].json.facebook_post_url }}\n\nInstagram Post: {{ $node[\"Code3\"].json.instagram_post_url }}\n\nLinkedIn Post: {{ $node[\"Code3\"].json.linkedin_post_url }}\n"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "name": "Append or update row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        672,
        448
      ],
      "parameters": {
        "columns": {
          "value": {
            "Source URL": "={{ $json.url }}"
          },
          "schema": [
            {
              "id": "Source URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Source URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Facebook Content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Facebook Content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Facebook URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Facebook URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Instagram Content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram Content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Instagram URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn Content ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn Content ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Image URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Image URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Source URL"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw/edit#gid=0",
          "cachedResultName": "Arkusz1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b7k0A06DY_oI3Ex6fR48FN0PXK6g59U4714wBYUCezw/edit?usp=drivesdk",
          "cachedResultName": "n8n - Telegram Social Media Content Automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "name": "Credentials",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        768
      ],
      "parameters": {
        "width": 360,
        "height": 172,
        "content": "\ud83d\udd10 Credentials\nThis template uses n8n Credentials.\n- Facebook/Instagram: `facebookGraph`\n- Supabase: `supabase`\n- Google Sheets: OAuth2\n- OpenAI/Gemini: API key\nNo API keys are stored inside the template."
      },
      "typeVersion": 1
    },
    {
      "name": "Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -132,
        316
      ],
      "parameters": {
        "width": 360,
        "height": 388,
        "content": "\ud83e\uddea Input assumption\nSend a Telegram message with a single URL. The workflow extracts the URL and processes the article."
      },
      "typeVersion": 1
    },
    {
      "name": "Image pipeline",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2240,
        592
      ],
      "parameters": {
        "width": 920,
        "height": 284,
        "content": "\ud83d\uddbc\ufe0f Image handling\nGenerates an image with OpenAI and uploads it to Supabase Storage.\nSet your bucket name in the Set node or via JSON."
      },
      "typeVersion": 1
    },
    {
      "name": "Sheets mapping",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        604,
        268
      ],
      "parameters": {
        "width": 232,
        "height": 340,
        "content": "\ud83d\udcca Sheet mapping\nUpdate `YOUR_GOOGLE_SHEET_ID` and `Sheet1`.\nColumns will be created automatically on first run."
      },
      "typeVersion": 1
    },
    {
      "name": "Google Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1768,
        940
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Publishing Phase1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4832,
        -48
      ],
      "parameters": {
        "width": 400,
        "height": 652,
        "content": "# Final step \nUpdates Google Sheets with post details and sends a Telegram message with image + direct post links as confirmation."
      },
      "typeVersion": 1
    },
    {
      "name": "Upload to Supabase (uses credentials)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2720,
        716
      ],
      "parameters": {
        "url": "={{ ($json.supabase_base_url || '').trim().replace(/\\/+$/,'') + '/storage/v1/object/' + ($json.bucket || 'social-media-ai-generated') + '/' + $json.filename }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "binaryData",
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "=={{ $binary.data?.mimeType || 'application/octet-stream' }}"
            },
            {
              "name": "x-upsert",
              "value": "true"
            }
          ]
        },
        "inputDataFieldName": "data",
        "nodeCredentialType": "supabaseApi"
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "name": "Supabase Config",
      "type": "n8n-nodes-base.set",
      "position": [
        2496,
        716
      ],
      "parameters": {
        "options": {
          "stripBinary": false
        },
        "assignments": {
          "assignments": [
            {
              "id": "1dbcf7c4-2e01-4df2-874e-93868b74a519",
              "name": "bucket",
              "type": "string",
              "value": "social-media-ai-generated"
            },
            {
              "id": "4e88d63f-01de-4265-8271-fd0ed637b5fd",
              "name": "filename",
              "type": "string",
              "value": "={{ $json.filename }}"
            },
            {
              "id": "b5579b42-bc9e-44d9-b997-2f1e505c0692",
              "name": "link_ttl_seconds",
              "type": "string",
              "value": "3600"
            },
            {
              "id": "ab260017-3161-4cbf-ad86-84d23a94e780",
              "name": "supabase_base_url",
              "type": "string",
              "value": "https://api.supabase.smartcamp.ai"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "name": "Supabase Public URL",
      "type": "n8n-nodes-base.set",
      "position": [
        2960,
        720
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cdc9fb52-3d91-4af4-9ff4-8fb15e6543c4",
              "name": "public_url",
              "type": "string",
              "value": "={{ $node[\"Supabase Config\"].json.supabase_base_url.toString().trim().replace(/\\/+$/,'') + \"/storage/v1/object/public/\" + encodeURIComponent($node[\"Supabase Config\"].json.bucket) + \"/\" + encodeURIComponent($node[\"Supabase Config\"].json.filename) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "name": "Publishing Phase2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3456,
        -16
      ],
      "parameters": {
        "width": 432,
        "height": 652,
        "content": "# Instagram & Facebook Site IDs\n\nRemember to replace the palceholder with your respective site IDs"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "timezone": "Europe/Warsaw",
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "yGK0VwXqcskQjGJG",
    "executionOrder": "v1",
    "timeSavedPerExecution": 20
  },
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code1": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Code2": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Final Status Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Post to Facebook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Post to Instagram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge2": {
      "main": [
        [
          {
            "node": "Binary File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge3": {
      "main": [
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Binary File": {
      "main": [
        [
          {
            "node": "LinkedIn",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Supabase Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract URL": {
      "main": [
        [
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Post URL": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Facebook Post": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Post": {
      "main": [
        [
          {
            "node": "Basic LLM Chain2",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Instagram Post": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Config": {
      "main": [
        [
          {
            "node": "Upload to Supabase (uses credentials)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain2": {
      "main": [
        [
          {
            "node": "Generate an image1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Facebook": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch URL Content": {
      "main": [
        [
          {
            "node": "Extract Text Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Instagram": {
      "main": [
        [
          {
            "node": "Post to Instagram1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate an image1": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Instagram1": {
      "main": [
        [
          {
            "node": "Get Post URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Final Status Update": {
      "main": [
        [
          {
            "node": "Send a photo message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Public URL": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          },
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract Text Content": {
      "main": [
        [
          {
            "node": "Facebook Post",
            "type": "main",
            "index": 0
          },
          {
            "node": "Instagram Post",
            "type": "main",
            "index": 0
          },
          {
            "node": "LinkedIn Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Bot Trigger": {
      "main": [
        [
          {
            "node": "If message contains URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If message contains URL": {
      "main": [
        [
          {
            "node": "Extract URL",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append or update row in sheet": {
      "main": [
        [
          {
            "node": "Fetch URL Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload to Supabase (uses credentials)": {
      "main": [
        [
          {
            "node": "Supabase Public URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "meta": {
    "site": "https://github.com/zengfr/n8n-workflow-all-templates",
    "name": "Auto-Generate Social Media Posts from URLs with AI, Telegram & Multi-Platform Posting",
    "wechat": "youandme10086",
    "id": 9059,
    "update_time": "2025-11-10"
  }
}