{
  "name": "Automate daily standups using Slack, Notion, and Redis",
  "nodes": [
    {
      "id": "6f110ebd-9f44-4f0a-9227-bae4470cd24c",
      "name": "📋 Template Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -8368,
        1184
      ],
      "parameters": {
        "width": 680,
        "height": 520,
        "content": "# Automated daily standup system with Slack, Notion and Redis\n\n## How it works\nThis workflow automates daily standups for your team across two sessions — morning and evening — using Slack as the inter"
      }
    },
    {
      "id": "367c6c50-f925-4e84-92a8-de0d31e5df8d",
      "name": "🌙 Evening Summary Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        1376
      ],
      "parameters": {
        "width": 404,
        "height": 572,
        "content": "# 🌙 Evening Standup Summary\n\n## How it works\n1. Triggers Mon–Sat at 6:30 PM IST\n2. Fetches active members from `Team_Members` Notion DB\n3. Fetches today's evening standups from `Daily_Standups_Afterno"
      }
    },
    {
      "id": "73ac0ac6-c917-4de0-9ac5-16ff881cabe5",
      "name": "Trigger Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        1488
      ],
      "parameters": {
        "width": 260,
        "height": 320,
        "content": "## ⏰ Trigger\nFires Mon–Sat at 6:30 PM IST (`30 18 * * 1-6`). Kicks off both Notion fetches in parallel."
      }
    },
    {
      "id": "f4d8740c-1fd8-4e8c-9da4-8e9ab9fbc2db",
      "name": "Fetch Data Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        1328
      ],
      "parameters": {
        "width": 292,
        "height": 596,
        "content": "## 📋 Fetch Data\nFetches active members (`Team_Members`) and today's responded evening standups (`Daily_Standups_Afternoon`) from Notion in parallel."
      }
    },
    {
      "id": "d0c3e15f-b77c-4e65-a492-8891574f9724",
      "name": "Merge Build Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        1488
      ],
      "parameters": {
        "width": 424,
        "height": 344,
        "content": "## 🔀 Merge & Build\nMerges both datasets, calculates response rate, missing members, help requests, task completion, and formats the Slack message."
      }
    },
    {
      "id": "876b6513-75a0-4778-960b-a106c6665ec4",
      "name": "Send Slack Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        1488
      ],
      "parameters": {
        "width": 320,
        "height": 336,
        "content": "## 📤 Send to Slack\nPosts the formatted evening summary to the admin Slack channel via SlackBot Chintanbhai."
      }
    },
    {
      "id": "71ef2aec-3f18-4c5b-8a17-e7ae01cbf425",
      "name": "Fetch Active Members",
      "type": "n8n-nodes-base.notion",
      "position": [
        -112,
        1728
      ]
    },
    {
      "id": "598c75cc-04ad-4e38-b6ac-edafe14d0383",
      "name": "Merge Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        160,
        1632
      ]
    },
    {
      "id": "06b8f6de-7298-421a-89ed-04bbbf00b967",
      "name": "Fetch Evening Standups",
      "type": "n8n-nodes-base.notion",
      "position": [
        -112,
        1536
      ]
    },
    {
      "id": "c41a3b62-1eea-42d8-a350-1e1cc7d7f424",
      "name": "Evening schedule trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -416,
        1632
      ]
    },
    {
      "id": "9de24fc0-0075-4746-9b2d-269adbb48fbc",
      "name": "Build evening summary message",
      "type": "n8n-nodes-base.code",
      "position": [
        416,
        1632
      ]
    },
    {
      "id": "c0ff3755-e5da-4608-a265-f85421f5e296",
      "name": "Send to Admin Channel Evening",
      "type": "n8n-nodes-base.slack",
      "position": [
        704,
        1632
      ]
    },
    {
      "id": "2020c710-a210-42df-a02e-21ade4381f71",
      "name": "🌅 Morning Summary Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -976,
        480
      ],
      "parameters": {
        "width": 420,
        "height": 584,
        "content": "# 🌅 Morning Standup Summary\n\n## How it works\n1. Triggers Mon–Sat at 10:10 AM IST\n2. Fetches active members from `Team_Members` Notion DB\n3. Fetches today's responded standups from `Daily_Standups` DB\n"
      }
    },
    {
      "id": "a8681070-4e2f-4901-a4b4-9b72bfb644d6",
      "name": "Send to Admin Channel",
      "type": "n8n-nodes-base.slack",
      "position": [
        864,
        784
      ]
    },
    {
      "id": "d1644f61-afd1-4054-9103-0a887c82aad4",
      "name": "Morning schedule trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -384,
        768
      ]
    },
    {
      "id": "985857f3-5a33-4461-9a8d-7c301e6d682d",
      "name": "Fetch team members (morning)",
      "type": "n8n-nodes-base.notion",
      "position": [
        -32,
        640
      ]
    },
    {
      "id": "e269b8d3-f186-46e7-8db4-6779eb8d5ee6",
      "name": "Fetch today's morning standups",
      "type": "n8n-nodes-base.notion",
      "position": [
        -32,
        880
      ]
    },
    {
      "id": "484fc410-b4f5-4418-a087-948e464aa90d",
      "name": "Merge morning data",
      "type": "n8n-nodes-base.merge",
      "position": [
        288,
        784
      ]
    },
    {
      "id": "aa7c5fdd-41a0-46b5-ad69-7265e0f7c13b",
      "name": "Build morning summary message",
      "type": "n8n-nodes-base.code",
      "position": [
        496,
        784
      ]
    },
    {
      "id": "056d01d8-6b8b-45f0-b1bc-4d8d81fa6594",
      "name": "Trigger Group Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        608
      ],
      "parameters": {
        "width": 324,
        "height": 336,
        "content": "## ⏰ Trigger\nFires Mon–Sat at 10:10 AM IST (`10 10 * * 1-6`). Kicks off both Notion fetches in parallel."
      }
    },
    {
      "id": "9223fba9-3482-4478-955e-002d1545f070",
      "name": "Fetch Data Group Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        496
      ],
      "parameters": {
        "width": 320,
        "height": 572,
        "content": "## 📋 Fetch Data\nFetches active members (`Team_Members`) and today's responded morning standups (`Daily_Standups`) from Notion in parallel."
      }
    },
    {
      "id": "d25db796-f2df-43a6-8feb-9ded9861083e",
      "name": "Merge Build Group Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        208,
        640
      ],
      "parameters": {
        "width": 492,
        "height": 328,
        "content": "## 🔀 Merge & Build\nMerges both datasets. Code node normalizes fields, calculates attendance stats, detects blockers, and formats the Slack message."
      }
    },
    {
      "id": "45394719-6b96-47a5-8d46-51472c82e029",
      "name": "Send Slack Group Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        640
      ],
      "parameters": {
        "width": 352,
        "height": 336,
        "content": "## 📤 Send to Slack\nPosts the formatted morning standup summary to the admin Slack channel via SlackBot Chintanbhai."
      }
    },
    {
      "id": "e9d5f66e-57d8-462f-9bc2-ec3a28db3d22",
      "name": "🌅 Morning Initiator Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -7472,
        240
      ],
      "parameters": {
        "width": 460,
        "height": 508,
        "content": "# 🌅 Morning Standup Initiator\n\n## How it works\n1. Triggers Mon–Sat at 9:40 AM IST\n2. Fetches active members from `Team_Members` Notion DB\n3. Loops through each developer one at a time\n4. Validates mem"
      }
    },
    {
      "id": "84bbf89f-6820-4ae4-8aec-afadd95438ea",
      "name": "Fetch Gate Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6624,
        336
      ],
      "parameters": {
        "width": 412,
        "height": 336,
        "content": "## 📋 Fetch & Gate\nFetches active members from `Team_Members` Notion DB. IF node stops the flow if no active members are found."
      }
    },
    {
      "id": "13b3c99e-e92d-432f-a687-f67c5ec512e2",
      "name": "Loop Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6128,
        288
      ],
      "parameters": {
        "width": 300,
        "height": 384,
        "content": "## 🔁 Developer Loop\n`splitInBatches` iterates one member at a time. All paths (valid, invalid, skipped) converge at `Continue to next` before looping back."
      }
    },
    {
      "id": "d02ad8b0-9326-43fb-95bd-94f22b63f93b",
      "name": "Validate Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5760,
        192
      ],
      "parameters": {
        "width": 448,
        "height": 336,
        "content": "## ✅ Validate Member\nCode node normalizes Notion fields and checks required values. IF node skips invalid members without breaking the loop."
      }
    },
    {
      "id": "99dc63bc-7092-4a96-a503-decf4694a4c4",
      "name": "Redis Check Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5280,
        128
      ],
      "parameters": {
        "width": 468,
        "height": 408,
        "content": "## 🔴 Redis Session Check\nGETs existing session key `morning:standup:session:{slack_user_id}`. Code node parses the response — sets `needs_new_session` true/false. IF node skips members with active ses"
      }
    },
    {
      "id": "11396eb2-cb2a-44cd-82fb-6b1afc5c5d2e",
      "name": "Create Session Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4784,
        96
      ],
      "parameters": {
        "width": 768,
        "height": 420,
        "content": "## 📝 Create Session\nCreates a `Conversation_State` record in Notion (question 1, In Progress). Code node builds the Redis payload with a 24hr TTL."
      }
    },
    {
      "id": "fefd9e1e-81b4-4a9c-a4d5-d4e3c851ea27",
      "name": "Save Send Group Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3968,
        0
      ],
      "parameters": {
        "width": 1244,
        "height": 824,
        "content": "## 🔴 Save & Send\nIF `can_write_redis` is true: SETs session in Redis (86400s TTL), sends Question 1 Slack DM, then saves the DM channel ID back to `Team_Members` in Notion."
      }
    },
    {
      "id": "900c50f1-aebc-4e22-85a6-5d7bce1cfd09",
      "name": "Morning standup initiator trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -6864,
        480
      ]
    },
    {
      "id": "828dc392-0297-4856-82a1-9dca2efc75ab",
      "name": "Get active team members",
      "type": "n8n-nodes-base.notion",
      "position": [
        -6576,
        480
      ]
    },
    {
      "id": "6aaaacd8-76ae-4428-948b-41860e06a7e7",
      "name": "Check if members found",
      "type": "n8n-nodes-base.if",
      "position": [
        -6352,
        480
      ]
    },
    {
      "id": "ae99b0ff-4147-4ff9-86a2-688156f51893",
      "name": "Developer loop",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -6048,
        464
      ]
    },
    {
      "id": "86aaa4ea-6e5a-427a-8d13-46622cce5bec",
      "name": "Extract and validate member data",
      "type": "n8n-nodes-base.code",
      "position": [
        -5712,
        352
      ]
    },
    {
      "id": "425d4c33-df67-4b4a-a4c1-21b6b3f6efcf",
      "name": "Is valid member",
      "type": "n8n-nodes-base.if",
      "position": [
        -5440,
        352
      ]
    },
    {
      "id": "d1c62232-d310-49e5-984e-f6d35d5488f0",
      "name": "Check existing Redis session",
      "type": "n8n-nodes-base.redis",
      "position": [
        -5200,
        336
      ]
    },
    {
      "id": "f4da8526-ae46-4004-ad4b-ba8fba872e5a",
      "name": "Parse session state",
      "type": "n8n-nodes-base.code",
      "position": [
        -4944,
        336
      ]
    },
    {
      "id": "6e2c790c-e4bc-4a9c-bcad-77b4202cac15",
      "name": "Needs new session",
      "type": "n8n-nodes-base.if",
      "position": [
        -4688,
        320
      ]
    },
    {
      "id": "6966a3c3-bc2b-46ad-9f31-96e776b94a53",
      "name": "Create Notion session",
      "type": "n8n-nodes-base.notion",
      "position": [
        -4400,
        256
      ]
    },
    {
      "id": "a4937e19-26c6-4e8a-930d-66af41f04dba",
      "name": "Prepare session data",
      "type": "n8n-nodes-base.code",
      "position": [
        -4144,
        256
      ]
    },
    {
      "id": "0cd88a6f-bcf5-406a-bf2e-8ab7fcafe8d5",
      "name": "Session data ready",
      "type": "n8n-nodes-base.if",
      "position": [
        -3904,
        240
      ]
    },
    {
      "id": "2d534d2a-b921-4f26-ac21-39bb38efbe1f",
      "name": "Save session to Redis",
      "type": "n8n-nodes-base.redis",
      "position": [
        -3648,
        192
      ]
    },
    {
      "id": "976a61ec-965a-440a-82f9-0467a8088f4c",
      "name": "Send standup message",
      "type": "n8n-nodes-base.slack",
      "position": [
        -3376,
        192
      ]
    },
    {
      "id": "ca0b2a68-fd2c-4bd3-b047-c965beb6ee52",
      "name": "Update Slack channel ID in Notion",
      "type": "n8n-nodes-base.notion",
      "position": [
        -3104,
        128
      ]
    },
    {
      "id": "6346f77a-1041-4bc5-88e0-ba53d7cf8bc6",
      "name": "Continue to next (morning)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -2976,
        560
      ]
    },
    {
      "id": "ea8dbfff-e1e1-48b2-89aa-3ac474554cc2",
      "name": "Trigger Group Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6976,
        336
      ],
      "parameters": {
        "width": 328,
        "height": 336,
        "content": "## ⏰ Trigger\nFires Mon–Sat at 9:40 AM IST (`0 40 9 * * 1-6`). Kicks off the standup initiation flow for all active team members."
      }
    },
    {
      "id": "6645947e-7806-4d7b-86e7-aec6a332b340",
      "name": "Main Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -7456,
        1312
      ],
      "parameters": {
        "width": 464,
        "height": 560,
        "content": "# 🌙 Evening Standup Initiator\n\n## How it works\nFires Mon–Sat at 6 PM IST. Fetches all active developers from Notion, loops through each one, checks Redis for a duplicate session (skips if today's sess"
      }
    },
    {
      "id": "4a794720-ee6a-40e5-bd87-d2adbf8f1594",
      "name": "Group: Trigger Fetch Gate",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6912,
        1440
      ],
      "parameters": {
        "width": 1056,
        "height": 372,
        "content": "## ⏰ Trigger, Fetch & Gate\nSchedule fires Mon–Sat 6 PM IST. Fetches active members from Notion (`Daily_Standups = true`, `Active_Status = Active`). If no records returned, outputs `NO_DEVELOPERS` stat"
      }
    },
    {
      "id": "105aa8a6-8215-41df-8048-a2252287ae9c",
      "name": "Group: Loop Validate",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5856,
        1600
      ],
      "parameters": {
        "width": 816,
        "height": 276,
        "content": "## 🔁 Developer Loop & Validation\nIterates through each member one at a time. Validates required fields (`slack_user_id`, `developer_id`, `full_name`, `team_role`). Invalid members are silently skipped"
      }
    },
    {
      "id": "b841778d-7663-48e0-91aa-9dabda821b0d",
      "name": "Group: Redis Check",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4976,
        1584
      ],
      "parameters": {
        "width": 848,
        "height": 260,
        "content": "## 🔴 Redis Session Check\nGETs `standup:evening:{slack_user_id}`. If a session exists with today's date, sets `skip: true` to prevent duplicate standups. Continues safely if Redis is unreachable (`cont"
      }
    },
    {
      "id": "df73094b-61e2-41d6-9182-36f0a77c1a1a",
      "name": "Group: Session Create Store",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4112,
        1456
      ],
      "parameters": {
        "width": 928,
        "height": 324,
        "content": "## 📝 Session Creation & Storage\nCreates a Notion record in `Conversation_State_Afternoon` (Question 1, In Progress). Builds Redis session object with answers, timestamps, and record ID. SETs key with "
      }
    },
    {
      "id": "e32eaf2e-c587-4d12-8055-0137fbdc57bd",
      "name": "Group: Slack Log Continue",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3152,
        1296
      ],
      "parameters": {
        "width": 1168,
        "height": 996,
        "content": "## 💬 Send, Log & Loop Back\nSends Question 1 of 3 via Slack DM (`chat:write`). Logs final status (`SUCCESS` or `SLACK_FAILED`). All paths — success, skipped, or failed — converge at `Continue to next`,"
      }
    },
    {
      "id": "c3966ff3-dd43-45a3-a7ad-91c2e279edb6",
      "name": "Evening standup initiator trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -6848,
        1648
      ]
    },
    {
      "id": "a1dcd3e0-e402-440b-8d76-059f2e295672",
      "name": "Get active team members (evening)",
      "type": "n8n-nodes-base.notion",
      "position": [
        -6576,
        1648
      ]
    },
    {
      "id": "63623162-b826-4913-8c74-42e49f269ec9",
      "name": "Check developers found",
      "type": "n8n-nodes-base.if",
      "position": [
        -6336,
        1632
      ]
    },
    {
      "id": "d61c8546-6257-49bb-ab43-be9862570360",
      "name": "No developers found",
      "type": "n8n-nodes-base.code",
      "position": [
        -6112,
        1536
      ]
    },
    {
      "id": "41d9d62d-6903-4b7e-bcfa-ea6bb4f1f2f8",
      "name": "Process each developer",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -5792,
        1696
      ]
    },
    {
      "id": "63aa7f68-312d-476f-8f59-532126317494",
      "name": "Validate and prepare member data",
      "type": "n8n-nodes-base.code",
      "position": [
        -5536,
        1712
      ]
    },
    {
      "id": "e4f2fa1e-1569-4b15-9bd9-272c9b94cfb5",
      "name": "Check if valid member (evening)",
      "type": "n8n-nodes-base.if",
      "position": [
        -5296,
        1696
      ]
    },
    {
      "id": "7729190a-eda6-4380-8ffe-c1d5c30698f7",
      "name": "Check evening Redis session",
      "type": "n8n-nodes-base.redis",
      "position": [
        -4912,
        1680
      ]
    },
    {
      "id": "cd413cd2-60f1-4de8-8fa8-7a40cb381b0e",
      "name": "Check evening session status",
      "type": "n8n-nodes-base.code",
      "position": [
        -4640,
        1680
      ]
    },
    {
      "id": "30d95079-1c26-4295-a02f-1cefd6609724",
      "name": "Should proceed with evening session",
      "type": "n8n-nodes-base.if",
      "position": [
        -4384,
        1680
      ]
    },
    {
      "id": "1041c488-c78c-4217-9c02-ff6e77f31f2c",
      "name": "Create evening Notion session",
      "type": "n8n-nodes-base.notion",
      "position": [
        -4048,
        1616
      ]
    },
    {
      "id": "75246922-3404-42fb-8a46-423b972d6f3a",
      "name": "Build evening session data",
      "type": "n8n-nodes-base.code",
      "position": [
        -3760,
        1600
      ]
    },
    {
      "id": "177f9493-44cf-4e03-927e-3b23211fa843",
      "name": "Evening session ready",
      "type": "n8n-nodes-base.if",
      "position": [
        -3440,
        1600
      ]
    },
    {
      "id": "00406a2d-922a-440f-b29f-d05686392b6c",
      "name": "Store evening session in Redis",
      "type": "n8n-nodes-base.redis",
      "position": [
        -3088,
        1488
      ]
    },
    {
      "id": "828b422e-c5fe-42e4-a888-79a865e1835e",
      "name": "Send evening standup message",
      "type": "n8n-nodes-base.slack",
      "position": [
        -2816,
        1472
      ]
    },
    {
      "id": "3b67d075-85b1-4f3d-bd8a-2bf8c808d2e8",
      "name": "Log final result",
      "type": "n8n-nodes-base.code",
      "position": [
        -2576,
        1472
      ]
    },
    {
      "id": "f3bf25e0-83c1-4c72-b24b-c5402a1954f5",
      "name": "Continue to next (evening)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -2176,
        2064
      ]
    }
  ],
  "connections": {
    "Merge Data": {
      "main": [
        [
          {
            "node": "Build evening summary message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Developer loop": {
      "main": [
        [],
        [
          {
            "node": "Extract and validate member data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is valid member": {
      "main": [
        [
          {
            "node": "Check existing Redis session",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (morning)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log final result": {
      "main": [
        [
          {
            "node": "Continue to next (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Needs new session": {
      "main": [
        [
          {
            "node": "Create Notion session",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (morning)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge morning data": {
      "main": [
        [
          {
            "node": "Build morning summary message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Session data ready": {
      "main": [
        [
          {
            "node": "Save session to Redis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (morning)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse session state": {
      "main": [
        [
          {
            "node": "Needs new session",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Active Members": {
      "main": [
        [
          {
            "node": "Merge Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Prepare session data": {
      "main": [
        [
          {
            "node": "Session data ready",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send standup message": {
      "main": [
        [
          {
            "node": "Continue to next (morning)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update Slack channel ID in Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Notion session": {
      "main": [
        [
          {
            "node": "Prepare session data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evening session ready": {
      "main": [
        [
          {
            "node": "Store evening session in Redis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save session to Redis": {
      "main": [
        [
          {
            "node": "Send standup message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check developers found": {
      "main": [
        [
          {
            "node": "No developers found",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Process each developer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if members found": {
      "main": [
        [
          {
            "node": "Developer loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Evening Standups": {
      "main": [
        [
          {
            "node": "Merge Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process each developer": {
      "main": [
        [],
        [
          {
            "node": "Validate and prepare member data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get active team members": {
      "main": [
        [
          {
            "node": "Check if members found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evening schedule trigger": {
      "main": [
        [
          {
            "node": "Fetch Active Members",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch Evening Standups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Morning schedule trigger": {
      "main": [
        [
          {
            "node": "Fetch team members (morning)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch today's morning standups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build evening session data": {
      "main": [
        [
          {
            "node": "Evening session ready",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Continue to next (evening)": {
      "main": [
        [
          {
            "node": "Process each developer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Continue to next (morning)": {
      "main": [
        [
          {
            "node": "Developer loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check evening Redis session": {
      "main": [
        [
          {
            "node": "Check evening session status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check evening session status": {
      "main": [
        [
          {
            "node": "Should proceed with evening session",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check existing Redis session": {
      "main": [
        [
          {
            "node": "Parse session state",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch team members (morning)": {
      "main": [
        [
          {
            "node": "Merge morning data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send evening standup message": {
      "main": [
        [
          {
            "node": "Log final result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build evening summary message": {
      "main": [
        [
          {
            "node": "Send to Admin Channel Evening",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build morning summary message": {
      "main": [
        [
          {
            "node": "Send to Admin Channel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create evening Notion session": {
      "main": [
        [
          {
            "node": "Build evening session data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch today's morning standups": {
      "main": [
        [
          {
            "node": "Merge morning data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Store evening session in Redis": {
      "main": [
        [
          {
            "node": "Send evening standup message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if valid member (evening)": {
      "main": [
        [
          {
            "node": "Check evening Redis session",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract and validate member data": {
      "main": [
        [
          {
            "node": "Is valid member",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate and prepare member data": {
      "main": [
        [
          {
            "node": "Check if valid member (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evening standup initiator trigger": {
      "main": [
        [
          {
            "node": "Get active team members (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get active team members (evening)": {
      "main": [
        [
          {
            "node": "Check developers found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Morning standup initiator trigger": {
      "main": [
        [
          {
            "node": "Get active team members",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Should proceed with evening session": {
      "main": [
        [
          {
            "node": "Create evening Notion session",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Continue to next (evening)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}