AutomationFlowsSlack & Telegram › Auto-Schedule African History Posts to Telegram

Auto-Schedule African History Posts to Telegram

Original n8n title: African History Telegram Auto-scheduler

African History Telegram Auto-Scheduler. Uses httpRequest, telegram, splitInBatches, scheduleTrigger. Scheduled trigger; 23 nodes.

Cron / scheduled trigger★★★★☆ complexityAI-powered23 nodesHTTP RequestTelegramGoogle SheetsOpenAI
Slack & Telegram Trigger: Cron / scheduled Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "African History Telegram Auto-Scheduler",
  "nodes": [
    {
      "parameters": {
        "jsCode": "function getOpenAiMessage(json) {\n  const msg =\n    json?.output?.[0]?.content?.[0]?.text?.message ??\n    json?.output?.[0]?.content?.[0]?.text ??\n    \"\";\n  return typeof msg === \"string\" ? msg.trim() : \"\";\n}\n\nconst raw = getOpenAiMessage($json);\n\nif (!raw) {\n  throw new Error(\"OpenAI message empty. Check OpenAI node output.\");\n}\n\n// Extract FIRST JSON object from the response (handles preface text)\nconst match = raw.match(/\\{[\\s\\S]*\\}/);\nif (!match) {\n  throw new Error(\"No JSON object found in OpenAI output. First 500 chars: \" + raw.slice(0, 500));\n}\n\nlet obj;\ntry {\n  obj = JSON.parse(match[0]);\n} catch (e) {\n  throw new Error(\n    \"Failed to parse extracted JSON. Error: \" +\n      e.message +\n      \" | Extracted first 500 chars: \" +\n      match[0].slice(0, 500)\n  );\n}\n\n// Strict schema validation\nif (!obj.title || typeof obj.title !== \"string\") {\n  throw new Error(\"JSON missing/invalid 'title'.\");\n}\nif (!obj.narration || typeof obj.narration !== \"string\") {\n  throw new Error(\"JSON missing/invalid 'narration'.\");\n}\nif (!Array.isArray(obj.image_prompts)) {\n  throw new Error(\"JSON missing/invalid 'image_prompts' array.\");\n}\nif (obj.image_prompts.length < 5 || obj.image_prompts.length > 10) {\n  throw new Error(\"image_prompts must be 5\u201310. Got: \" + obj.image_prompts.length);\n}\n\n// Optional: normalize whitespace\nobj.narration = obj.narration.replace(/\\s+/g, \" \").trim();\nobj.image_prompts = obj.image_prompts.map(p => String(p).trim()).filter(Boolean);\n\nreturn [{ json: obj }];\n"
      },
      "id": "1c98bbb4-e69c-48b7-b4ac-dd5d4bf55ab0",
      "name": "Parse Fact Package JSON",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1328,
        688
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://api.elevenlabs.io/v1/text-to-speech/{{ $('Configuration').first().json.elevenLabsVoiceId }}?output_format=mp3_44100_128",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "xi-api-key",
              "value": "={{ $('Configuration').item.json.elevenLabsApiKey }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ {\n  text: $json.narration,\n  model_id: $('Configuration').first().json.elevenLabsModelId,\n  voice_settings: {\n    stability: 0.55,\n    similarity_boost: 0.75,\n    style: 0.1,\n    use_speaker_boost: true\n  }\n} }}",
        "options": {}
      },
      "id": "610683e0-1a11-4c0b-a6bc-15aa6b9699e0",
      "name": "ElevenLabs TTS (Adam)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1552,
        640
      ]
    },
    {
      "parameters": {
        "operation": "sendAudio",
        "chatId": "={{ $('Configuration').first().json.telegramChatId }}",
        "binaryData": true,
        "additionalFields": {
          "caption": "={{ $json.title }}"
        }
      },
      "id": "dc551539-b3a0-49c0-ad49-10495bae4842",
      "name": "Send Narration Audio",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1776,
        640
      ],
      "retryOnFail": true,
      "waitBetweenTries": 5000,
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Expands the fact package into one item per image prompt so the existing Flux pipeline can run unchanged.\n// Output items contain `image_prompt` (what your existing \"Start Image Generation\" node already expects).\n\nif (!Array.isArray($json.image_prompts) || $json.image_prompts.length === 0) {\n  throw new Error(\"No image_prompts array found.\");\n}\n\nreturn $json.image_prompts.map((prompt, idx) => ({\n  json: {\n    title: $json.title,\n    image_index: idx + 1,\n    image_prompt: prompt\n  }\n}));\n\n\n// If we somehow receive a single prompt item, just pass it through.\nif (!$json.image_prompt) {\n  throw new Error('No image_prompt found on item.');\n}\nreturn [{ json: $json }];"
      },
      "id": "b6a81f44-4d29-4348-8c4c-dc4aeecea879",
      "name": "Set Current Image Prompt",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1552,
        832
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "2bb8ecf6-92d9-4faa-9342-64b141c164da",
      "name": "Split Image Prompts (5-10)",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        1776,
        832
      ]
    },
    {
      "parameters": {
        "operation": "sendPhoto",
        "chatId": "={{ $('Configuration').first().json.telegramChatId }}",
        "file": "={{ $json.images[0].url }}",
        "additionalFields": {}
      },
      "id": "8a0e02b6-5bd7-4b35-a47a-c4a36935eacd",
      "name": "Send Generated Photo",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        3344,
        832
      ],
      "retryOnFail": true,
      "waitBetweenTries": 5000,
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0,10,20,30,40 7,16 * * *"
            }
          ]
        }
      },
      "id": "79351af7-3a03-4a12-ab8b-90b044ae610c",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.1,
      "position": [
        -720,
        576
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "anubis_ancient_captions - anubis_ancient_captions (1)",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 844807346,
          "mode": "list",
          "cachedResultName": "African American History",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=844807346"
        },
        "options": {}
      },
      "id": "49e2c6b6-0406-48bb-b096-8343d0bdd363",
      "name": "Read Top Caption",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.3,
      "position": [
        -496,
        576
      ],
      "executeOnce": false,
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const text = $input.first().json.output[0].content[0].text;\n// Split by the delimiter |||\nconst parts = text.split('|||');\n\n// Format for Google Sheets\nconst rows = parts.map(scene => {\n  return {\n    json: {\n      caption: scene.trim()\n    }\n  };\n}).filter(r => r.json.caption.length > 5); // Simple filter to remove empty splits\n\nreturn rows;"
      },
      "id": "51043496-d851-416c-97cb-68bb7904f291",
      "name": "Format for Sheets",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        752,
        448
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "anubis_ancient_captions - anubis_ancient_captions (1)",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 844807346,
          "mode": "list",
          "cachedResultName": "African American History",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=844807346"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "caption": "={{ $json.caption }}"
          },
          "matchingColumns": [
            "caption"
          ],
          "schema": [
            {
              "id": "caption",
              "displayName": "caption",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "id": "a7af3347-7e9a-4f1c-8ed7-c125113da69f",
      "name": "Refill Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.3,
      "position": [
        1040,
        496
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "delete",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "anubis_ancient_captions - anubis_ancient_captions (1)",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": 844807346,
          "mode": "list",
          "cachedResultName": "African American History",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=844807346"
        }
      },
      "id": "54a1d372-bdbc-473e-a896-3754b88908fa",
      "name": "Delete Used Row",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.3,
      "position": [
        448,
        752
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "id-3",
              "name": "falApiKey",
              "type": "string",
              "value": "YOUR_FAL_API_KEY"
            },
            {
              "id": "id-4",
              "name": "telegramChatId",
              "type": "string",
              "value": "YOUR_TELEGRAM_CHAT_ID"
            },
            {
              "id": "96016ebd-533b-4037-b69e-4be6c81a0d57",
              "name": "elevenLabsApiKey",
              "value": "YOUR_ELEVENLABS_API_KEY",
              "type": "string"
            },
            {
              "id": "d894a1a8-7d3f-45d2-a95a-0fc718d5b5a5",
              "name": "elevenLabsVoiceId",
              "value": "YOUR_ELEVENLABS_VOICE_ID",
              "type": "string"
            },
            {
              "id": "4988d4c7-1ccc-4f77-84eb-587b6326b26c",
              "name": "elevenLabsModelId",
              "value": "eleven_multilingual_v2",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "e873d34e-025d-4deb-b534-90a85f0209fd",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        736,
        768
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://queue.fal.run/fal-ai/flux/dev",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Key {{ $('Configuration').first().json.falApiKey }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ {\n  \"prompt\": $json.image_prompt,\n  \"image_size\": \"portrait_16_9\",\n  \"num_inference_steps\": 30,\n  \"guidance_scale\": 3.5\n} }}",
        "options": {}
      },
      "id": "68903f28-844b-40bc-a236-4f18c64dde7d",
      "name": "Start Image Generation",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2000,
        784
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "amount": 10
      },
      "id": "bee70202-e935-4f18-ab08-f128568fc3eb",
      "name": "Wait (Image Loop)",
      "type": "n8n-nodes-base.wait",
      "position": [
        2224,
        784
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "url": "={{ $json.status_url }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $('Configuration').first().json.falApiKey }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "options": {}
      },
      "id": "02bdaf25-f81a-4242-910a-1d9da9bd53d5",
      "name": "Check Image Status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2448,
        720
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "jsCode": "const j = $json;\nconst obj = Array.isArray(j) ? j[0] : j;\nreturn [{ json: { ...obj } }];"
      },
      "id": "b30a0242-07fc-487d-aff4-008e31bf4c5a",
      "name": "Normalize Image Status",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2672,
        720
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "0225d57d-419b-4494-b778-9844036f0b4d",
              "leftValue": "={{ $json.status }}",
              "rightValue": "COMPLETED",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        2896,
        784
      ],
      "id": "3d9cb175-6eb6-4921-9996-de60d45d747a",
      "name": "Image Complete?"
    },
    {
      "parameters": {
        "url": "={{ $json.response_url }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $('Configuration').first().json.falApiKey }}"
            }
          ]
        },
        "options": {}
      },
      "id": "5896fbb8-0f1c-4ec0-8c98-67f0bec8ba81",
      "name": "Fetch Image Result",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3120,
        784
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "chatgpt-4o-latest",
          "mode": "list",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "responses": {
          "values": [
            {
              "content": "You are an expert historian and educational content curator.\n\nGenerate 120 distinct African American history topics suitable for 45\u201375 second narrated short-form videos.\n\nRules:\n- Each topic must be 3\u201310 words long.\n- Topics must be factual, educational, and evergreen.\n- Focus on people, movements, inventions, cultural moments, achievements, and historical events.\n- Avoid political advocacy, modern political debates, or calls to action.\n- Avoid graphic violence.\n- Avoid slang, emojis, hashtags, or commentary.\n- Do NOT number the topics.\n- Do NOT use bullet points.\n- Do NOT include dates unless essential to clarity.\n- Each topic must be unique and non-repetitive.\n\nFormatting:\n- Output ONLY the topics.\n- Separate each topic using exactly: |||\n- No extra text before or after the list.\n\nContent balance guidelines:\n- Include a mix of early history, Reconstruction era, Harlem Renaissance, Civil Rights era, science & innovation, arts & music, business & entrepreneurship, military service, sports history, education, and cultural influence.\n- Maintain a respectful, neutral, documentary-style framing.\n\nBegin."
            }
          ]
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        400,
        448
      ],
      "id": "af8309f4-7b27-4caf-815e-e02795e0e371",
      "name": "Message a model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "chatgpt-4o-latest",
          "mode": "list",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "responses": {
          "values": [
            {
              "content": "=You are a JSON-only generator.\n\nCreate ONE African American history fact package based on the topic.\n\nTOPIC: {{ $('Limit1').item.json.caption }}{{ $('Limit1').item.json.caption }}\n\nReturn ONLY valid JSON with this exact schema:\n{\n  \"title\": \"string\",\n  \"narration\": \"string\",\n  \"image_prompts\": [\"string\"]\n}\n\nRules:\n- narration: 110\u2013160 words, documentary voiceover cadence, factual, respectful.\n- image_prompts: 10 prompts exactly, each a distinct visual beat for a slideshow.\n- No on-screen text, captions, typography, watermarks, logos, or readable text in the visuals.\n- Avoid graphic violence.\n- Include historically accurate cues (era, clothing, environment).\n\nCRITICAL:\n- Output ONLY JSON.\n- No preface text.\n- No markdown.\n- First character must be { and last character must be }.\n"
            }
          ]
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        976,
        784
      ],
      "id": "6427d44f-4e57-4f3f-872c-de5c22fbf7a9",
      "name": "Message a model1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\n\n// If Google Sheets returned 0 items, inject a single placeholder row\nif (!items || items.length === 0) {\n  return [{ json: { caption: \"\" } }];\n}\n\n// If there is data, make sure `caption` at least exists\nreturn items.map(item => {\n  const j = item.json || {};\n  return {\n    json: {\n      ...j,\n      caption: j.caption ?? \"\"\n    }\n  };\n});\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -272,
        496
      ],
      "id": "15af8c8d-c4b4-4c5f-884e-08784bd81a9d",
      "name": "Guard: Ensure One Item"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "62b7cf32-d281-4180-8819-96699de68be0",
              "leftValue": "={{$json.caption || ''}}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        176,
        496
      ],
      "id": "b078f62b-542f-46cf-aef9-946228c2c8b4",
      "name": "If"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.limit",
      "typeVersion": 1,
      "position": [
        -48,
        496
      ],
      "id": "8592975b-69a3-4b1d-ac2a-2b8e0c1b1921",
      "name": "Limit1"
    }
  ],
  "connections": {
    "Parse Fact Package JSON": {
      "main": [
        [
          {
            "node": "ElevenLabs TTS (Adam)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set Current Image Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ElevenLabs TTS (Adam)": {
      "main": [
        [
          {
            "node": "Send Narration Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Current Image Prompt": {
      "main": [
        [
          {
            "node": "Split Image Prompts (5-10)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Generated Photo": {
      "main": [
        [
          {
            "node": "Split Image Prompts (5-10)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Read Top Caption",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Top Caption": {
      "main": [
        [
          {
            "node": "Guard: Ensure One Item",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format for Sheets": {
      "main": [
        [
          {
            "node": "Refill Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Refill Sheet": {
      "main": [
        [
          {
            "node": "Read Top Caption",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Used Row": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configuration": {
      "main": [
        [
          {
            "node": "Message a model1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Image Generation": {
      "main": [
        [
          {
            "node": "Wait (Image Loop)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait (Image Loop)": {
      "main": [
        [
          {
            "node": "Check Image Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Image Status": {
      "main": [
        [
          {
            "node": "Normalize Image Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Image Status": {
      "main": [
        [
          {
            "node": "Image Complete?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image Complete?": {
      "main": [
        [
          {
            "node": "Fetch Image Result",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait (Image Loop)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Image Result": {
      "main": [
        [
          {
            "node": "Send Generated Photo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model": {
      "main": [
        [
          {
            "node": "Format for Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Image Prompts (5-10)": {
      "main": [
        [],
        [
          {
            "node": "Start Image Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model1": {
      "main": [
        [
          {
            "node": "Parse Fact Package JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Guard: Ensure One Item": {
      "main": [
        [
          {
            "node": "Limit1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limit1": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Message a model",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Delete Used Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "versionId": "f371b04f-dde0-4551-99dd-d809059b3fa5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "EmTNdzYFC4FFRdGP",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

Discover the rich tapestry of African history effortlessly with this automated Telegram scheduler that delivers daily engaging facts, narrated audio clips, and AI-generated images directly to your channel or group. Ideal for educators, history enthusiasts, or community managers keen to foster cultural awareness without constant manual effort, it leverages OpenAI for vivid image creation and ElevenLabs for natural-sounding voiceovers in an Adam-like tone. The core step involves pulling curated facts from Google Sheets, processing them into multimedia content, and scheduling seamless Telegram posts to captivate your audience.

Use this workflow to maintain a consistent stream of educational content on African heritage, especially for niche Telegram communities seeking automated, high-quality updates. Avoid it for real-time interactions or non-scheduled broadcasting, as it relies on cron triggers for fixed timing. Common variations include swapping ElevenLabs for other TTS services or expanding Google Sheets to cover broader historical themes, ensuring adaptability to specific educational needs.

About this workflow

African History Telegram Auto-Scheduler. Uses httpRequest, telegram, splitInBatches, scheduleTrigger. Scheduled trigger; 23 nodes.

Source: https://github.com/Markus864/markus-portfolio/blob/main/n8n-automations/african-history-telegram-scheduler.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

AI-Powered Short-Form Video Generator with OpenAI, Flux, Kling, and ElevenLabs and upload to all social networks. Uses httpRequest, openAi, stickyNote, googleDrive. Scheduled trigger; 51 nodes.

HTTP Request, OpenAI, Google Drive +4
Slack & Telegram

Auto-create and publish AI social videos with Telegram, GPT-4 and Blotato. Uses httpRequest, stickyNote, telegramTrigger, telegram. Event-driven trigger; 42 nodes.

HTTP Request, Telegram Trigger, Telegram +2
Slack & Telegram

AI Automated TikTok/Youtube Shorts/Reels Generator. Uses httpRequest, openAi, stickyNote, googleDrive. Scheduled trigger; 41 nodes.

HTTP Request, OpenAI, Google Drive +2
Slack & Telegram

This workflow is designed for business analysts, market researchers, lead generation specialists, and sales teams who need to gather detailed business intelligence from Google Maps. It's particularly

Telegram, OpenAI, N8N Nodes Apify +5
Slack & Telegram

This workflow monitors your Gmail support inbox every minute, automatically sending each unread email to OpenAI for intelligent analysis. The AI evaluates sentiment (Positive/Neutral/Negative/Critical

RSS Feed Read, OpenAI, Slack +3