AutomationFlowsSlack & Telegram › Daily Briefing

Daily Briefing

Daily-Briefing. Uses googleCalendar, telegram. Scheduled trigger; 9 nodes.

Cron / scheduled trigger★★★★☆ complexity9 nodesGoogle CalendarTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 9 Complexity: ★★★★☆ Added:

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": "Daily Briefing",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 7 * * *"
            }
          ]
        }
      },
      "id": "add9d9db-3c54-4929-8605-0f598521405c",
      "name": "Daily 7am",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        240,
        200
      ]
    },
    {
      "parameters": {
        "httpMethod": "GET",
        "path": "briefing",
        "options": {}
      },
      "id": "95e0047f-a5fe-42a5-9a3b-1897fd2ac244",
      "name": "On-Demand",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        400
      ]
    },
    {
      "parameters": {
        "mode": "passThrough",
        "output": "first"
      },
      "id": "afc46a7d-9025-4f46-90d9-82cb8dc077a1",
      "name": "Merge Triggers",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst { execSync } = require('child_process');\n\n// Scan Local-Network-Hub for files modified in last 48h\nconst findCmd = `find /mnt/docs/Local-Network-Hub -name \"*.md\" -newer /mnt/docs/Local-Network-Hub/03-Inbox -type f 2>/dev/null | head -30`;\nlet recentFiles = '';\ntry {\n    recentFiles = execSync(findCmd, { encoding: 'utf8' }).trim();\n} catch(e) {\n    recentFiles = '';\n}\n\n// Read Claude_Vault open tasks\nlet tasks = '';\ntry {\n    const taskFind = `find /mnt/docs/Claude_Vault/tasks -name \"*.md\" -type f 2>/dev/null`;\n    const taskFiles = execSync(taskFind, { encoding: 'utf8' }).trim().split('\\n').filter(Boolean);\n    const fs = require('fs');\n    const snippets = taskFiles.slice(0, 10).map(f => {\n        try {\n            const c = fs.readFileSync(f, 'utf8');\n            const titleLine = c.split('\\n').find(l => l.startsWith('title:') || l.startsWith('# ')) || f;\n            const statusLine = c.split('\\n').find(l => l.startsWith('status:')) || '';\n            return `- ${titleLine.replace(/^(title:|#)\\s*/,'')} ${statusLine}`.trim();\n        } catch { return ''; }\n    }).filter(Boolean);\n    tasks = snippets.join('\\n');\n} catch(e) {\n    tasks = 'Could not read tasks.';\n}\n\n// Read content of recent files (first 300 chars each)\nlet context = '';\nif (recentFiles) {\n    const fs = require('fs');\n    const files = recentFiles.split('\\n').filter(Boolean);\n    context = files.map(f => {\n        try {\n            const c = fs.readFileSync(f, 'utf8').substring(0, 300);\n            return `### ${f.split('/').pop()}\\n${c}`;\n        } catch { return ''; }\n    }).filter(Boolean).join('\\n\\n');\n}\n\nreturn [{ json: {\n    tasks,\n    context: context || 'No recent vault changes.',\n    date: new Date().toISOString().substring(0, 10)\n} }];\n"
      },
      "id": "9628dd41-59bf-4800-bced-1449e06bea43",
      "name": "Scan Vault",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst d = $input.first().json;\nconst prompt = `Today is ${d.date}. You are a concise executive assistant.\n\nOPEN TASKS:\n${d.tasks || 'None found.'}\n\nRECENT VAULT ACTIVITY:\n${d.context}\n\nWrite a tight daily briefing (under 200 words):\n1. Top 3 priority tasks for today with a one-line reason each\n2. Any urgent items or deadlines visible in the notes\n3. One suggested focus area\n\nBe direct. No filler. Use markdown.`;\n\nreturn [{ json: { prompt } }];\n"
      },
      "id": "8ea1f683-79fe-4319-8fcc-fdecd96dbd32",
      "name": "Build Prompt",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.groq.com/openai/v1/chat/completions",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.GROQ_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "body": "={{ JSON.stringify({ model: 'llama-3.3-70b-versatile', messages: [{role:'user', content: $json.prompt}], max_tokens: 500, temperature: 0.3 }) }}"
      },
      "id": "d1f0251c-8106-46c5-b594-452129e1704d",
      "name": "Groq",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1120,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "\nconst resp = $input.first().json;\nconst briefing = resp.choices[0].message.content;\n\nconst now = new Date();\nconst pad = n => String(n).padStart(2,'0');\nconst ts  = `${now.getFullYear()}-${pad(now.getMonth()+1)}-${pad(now.getDate())}`;\n\nconst content = `---\ntype: briefing\ndate: \"${ts}\"\ngenerated: \"${now.toISOString()}\"\n---\n\n${briefing}\n`;\n\nconst fs = require('fs');\nconst outPath = `/mnt/docs/Local-Network-Hub/00-System/daily-briefing-${ts}.md`;\nfs.writeFileSync(outPath, content, 'utf8');\n\n// Also overwrite a fixed \"today\" file for easy dashboard access\nfs.writeFileSync('/mnt/docs/Local-Network-Hub/00-System/today.md', content, 'utf8');\n\nreturn [{ json: { ok: true, file: outPath, preview: briefing.substring(0, 200) } }];\n"
      },
      "id": "1a92a95b-06d0-4939-b517-aab362e0ef9e",
      "name": "Write Briefing",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1340,
        300
      ]
    }
  ],
  "connections": {
    "Daily 7am": {
      "main": [
        [
          {
            "node": "Merge Triggers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On-Demand": {
      "main": [
        [
          {
            "node": "Merge Triggers",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Triggers": {
      "main": [
        [
          {
            "node": "Scan Vault",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scan Vault": {
      "main": [
        [
          {
            "node": "Build Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Prompt": {
      "main": [
        [
          {
            "node": "Groq",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq": {
      "main": [
        [
          {
            "node": "Write Briefing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "tags": []
}
Pro

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

About this workflow

Daily-Briefing. Uses googleCalendar, telegram. Scheduled trigger; 9 nodes.

Source: https://github.com/runfish5/micro-services/blob/main/projects/n8n/05_daily-briefing/workflows/daily-briefing.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

This n8n template demonstrates how to automatically fetch upcoming movie releases from TMDB and let users add selected movies to their Google Calendar directly from Telegram. On a daily schedule, the

HTTP Request, Data Table, Telegram +2
Slack & Telegram

20 - Daily Backup (22:00). Uses googleDrive, googleCalendar, telegram. Scheduled trigger; 13 nodes.

Google Drive, Google Calendar, Telegram
Slack & Telegram

This workflow automatically sends you a daily message on Telegram summarizing all your meetings and events for the day, straight from your Google Calendar.

Telegram, Google Calendar
Slack & Telegram

Automatically Send Daily Meeting List to Telegram. Uses googleCalendar, scheduleTrigger, telegram, stickyNote. Scheduled trigger; 8 nodes.

Google Calendar, Telegram
Slack & Telegram

This workflow automatically sends you a list of your daily meetings every morning via a Telegram bot.

Google Calendar, Telegram