AutomationFlowsSlack & Telegram › Daily Google Calendar Summary to Slack

Daily Google Calendar Summary to Slack

Original n8n title: Send a Daily Summary of Your Google Calendar Events to Slack

Send A Daily Summary Of Your Google Calendar Events To Slack. Uses googleCalendar, dateTime, slack. Scheduled trigger; 12 nodes.

Cron / scheduled trigger★★★★☆ complexity12 nodesGoogle CalendarSlack
Slack & Telegram Trigger: Cron / scheduled Nodes: 12 Complexity: ★★★★☆ Added:

This workflow follows the Google Calendar → Slack 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
{
  "nodes": [
    {
      "name": "Google Calendar",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        540,
        -320
      ],
      "parameters": {
        "options": {},
        "calendar": "xxxxx@gmail.com",
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "googleCalendarOAuth2Api": "<your credential>"
      },
      "typeVersion": 1
    },
    {
      "name": "Function",
      "type": "n8n-nodes-base.function",
      "position": [
        540,
        70
      ],
      "parameters": {
        "functionCode": "var date = new Date().toISOString();\nvar day = new Date().getDay();\nconst weekday = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\nitems[0].json.date_today = date;\nitems[0].json.day_today = weekday[day];\n\nreturn items;"
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "name": "Date & Time",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        720,
        -320
      ],
      "parameters": {
        "value": "={{$json[\"start\"][\"dateTime\"]}}",
        "custom": true,
        "options": {
          "toTimezone": "Asia/Qatar"
        },
        "toFormat": "DD/MM/YYYY",
        "dataPropertyName": "Event Start Date Only"
      },
      "typeVersion": 1
    },
    {
      "name": "IF",
      "type": "n8n-nodes-base.if",
      "position": [
        1410,
        -110
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "= {{$json[\"Event Date\"]}}",
              "value2": "= {{$json[\"Today's Date\"]}}"
            }
          ],
          "dateTime": []
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Date & Time1",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        880,
        70
      ],
      "parameters": {
        "value": "={{$json[\"date_today\"]}}",
        "custom": true,
        "options": {
          "toTimezone": "Asia/Qatar"
        },
        "toFormat": "DD/MM/YYYY",
        "dataPropertyName": "Today's Date"
      },
      "typeVersion": 1
    },
    {
      "name": "Set",
      "type": "n8n-nodes-base.set",
      "position": [
        910,
        -320
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "Event Name",
              "value": "={{$json[\"summary\"]}}"
            },
            {
              "name": "Event Date",
              "value": "={{$json[\"Event Start Date Only\"]}}"
            },
            {
              "name": "Today's Date",
              "value": "="
            },
            {
              "name": "Gcal URL",
              "value": "={{$json[\"htmlLink\"]}}"
            },
            {
              "name": "Location",
              "value": "={{$json[\"location\"]}}"
            },
            {
              "name": "Start Time",
              "value": "={{$json[\"start\"][\"dateTime\"]}}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1200,
        -110
      ],
      "parameters": {
        "mode": "multiplex"
      },
      "typeVersion": 1
    },
    {
      "name": "Set1",
      "type": "n8n-nodes-base.set",
      "position": [
        1630,
        -130
      ],
      "parameters": {
        "values": {
          "number": [],
          "string": [
            {
              "name": "Name",
              "value": "={{$json[\"Event Name\"]}}"
            },
            {
              "name": "Time",
              "value": "={{$json[\"Start Time\"]}}"
            },
            {
              "name": "URL",
              "value": "={{$json[\"Gcal URL\"]}}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "Date & Time2",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        1800,
        -130
      ],
      "parameters": {
        "value": "={{$json[\"Time\"]}}",
        "custom": true,
        "options": {
          "toTimezone": "Asia/Qatar"
        },
        "toFormat": "HH:mm",
        "dataPropertyName": "Time"
      },
      "typeVersion": 1
    },
    {
      "name": "Function1",
      "type": "n8n-nodes-base.function",
      "position": [
        1960,
        -130
      ],
      "parameters": {
        "functionCode": "// Create our Slack message\n// This will output a list of Ticket URLs with the status and the subject\n// 12345 [STATUS] - Ticket Subject\nlet message = \"*Hello , Please find below a list of your meetings for today*. \\n\";\n\n// Loop the input items\nfor (item of items) {\n  // Append the ticket information to the message\n  message += \"*\" + item.json.Name +' @ '+ item.json.Time + \"\\n*  - \" + item.json.URL + \"\\n\"; \n}\n\n// Return our message\nreturn [{json: {message}}];\n"
      },
      "typeVersion": 1
    },
    {
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2150,
        -130
      ],
      "parameters": {
        "text": "={{$json[\"message\"]}}",
        "channel": "virtual-assistant",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": "<your credential>"
      },
      "typeVersion": 1
    },
    {
      "name": "Cron",
      "type": "n8n-nodes-base.cron",
      "position": [
        250,
        -130
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "hour": 6
            }
          ]
        }
      },
      "retryOnFail": true,
      "typeVersion": 1
    }
  ],
  "connections": {
    "IF": {
      "main": [
        [
          {
            "node": "Set1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cron": {
      "main": [
        [
          {
            "node": "Google Calendar",
            "type": "main",
            "index": 0
          },
          {
            "node": "Function",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set1": {
      "main": [
        [
          {
            "node": "Date & Time2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "IF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Function": {
      "main": [
        [
          {
            "node": "Date & Time1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Function1": {
      "main": [
        [
          {
            "node": "Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time": {
      "main": [
        [
          {
            "node": "Set",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time1": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Date & Time2": {
      "main": [
        [
          {
            "node": "Function1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar": {
      "main": [
        [
          {
            "node": "Date & Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

Start your day informed by receiving a concise daily summary of your Google Calendar events directly in Slack, saving time on manual checks and ensuring you never miss important appointments. This workflow suits busy professionals or teams relying on Google Calendar for scheduling, delivering a tailored message with event details like titles, times, and locations at a set hour each morning. The key step involves querying Google Calendar for upcoming events, processing them through conditional logic to filter relevant ones, and then formatting the output for seamless posting to your chosen Slack channel.

Use this workflow when you need a reliable, automated nudge for daily planning without app-switching, particularly in remote or distributed teams where Slack is the central hub. Avoid it if your calendar events are highly dynamic or require real-time updates, as the cron trigger runs on a fixed schedule. Common variations include adjusting the summary to cover weekly events or integrating additional filters for specific event types, such as meetings only.

About this workflow

Send A Daily Summary Of Your Google Calendar Events To Slack. Uses googleCalendar, dateTime, slack. Scheduled trigger; 12 nodes.

Source: https://github.com/Zie619/n8n-workflows — 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

Who’s it for

Google Calendar, Slack, HTTP Request
Slack & Telegram

Optimize your performance review process with this automated workflow. Running daily at 8 AM, it retrieves scheduled reviews from a Google Sheet, validates upcoming sessions, processes each review, an

Google Sheets, Email Send, Google Calendar +1
Slack & Telegram

This workflow will trigger daily at 6am to retrieve your day's calendar events from Google Calendar and send them as a summary message to Slack.

Google Calendar, Slack
Slack & Telegram

Busy professionals who want a quick daily update combining their calendar, weather, and top news.

Google Calendar, HTTP Request, RSS Feed Read +1
Slack & Telegram

Send interview reminders (10 minutes) from Google Calendar to Slack DMs. Uses slack, googleCalendar. Scheduled trigger; 10 nodes.

Slack, Google Calendar