AutomationFlowsSlack & Telegram › Telegram Action Notifier Heartbeat

Telegram Action Notifier Heartbeat

Original n8n title: 💓 Heartbeat

💓 Heartbeat. Uses telegram. Scheduled trigger; 12 nodes.

Cron / scheduled trigger★★★★☆ complexity12 nodesTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 12 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
{
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -1328,
        1504
      ],
      "id": "9cd73305-1a5f-4422-aeae-8e29910d653b",
      "name": "Heartbeat (15 min)"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT \n    u.telegram_id,\n    u.first_name,\n    u.timezone,\n    u.gender,\n    u.azkar_enabled,\n    u.period_mode_active,\n    u.last_feedback_message,\n    u.sunnah_enabled,\n    u.masjid_prayer_enabled,\n    u.consecutive_perfect_days,\n    u.best_streak,\n    u.created_at,\n    p.fajr, p.sunrise, p.dhuhr, p.asr, p.maghrib, p.isha,\n    p.fajr_notified, p.dhuhr_notified, p.asr_notified, p.maghrib_notified, p.isha_notified,\n    p.fajr_roasted, p.dhuhr_roasted, p.asr_roasted, p.maghrib_roasted, p.isha_roasted,\n    p.azkar_sabah_sent, p.azkar_masa_sent,\n    p.feedback_sent,\n    dp.\"Fajr\" AS fajr_prayed,\n    dp.\"Dhuhr\" AS dhuhr_prayed,\n    dp.\"Asr\" AS asr_prayed,\n    dp.\"Maghrib\" AS maghrib_prayed,\n    dp.\"Isha\" AS isha_prayed,\n    (NOW() AT TIME ZONE u.timezone)::time AS local_time,\n    (NOW() AT TIME ZONE u.timezone)::date AS local_date,\n    EXTRACT(DOW FROM NOW() AT TIME ZONE u.timezone) AS day_of_week\nFROM users u\nJOIN prayer_times_cache p \n    ON u.telegram_id = p.user_id \n    AND p.date = (NOW() AT TIME ZONE u.timezone)::date\nLEFT JOIN daily_prayers dp \n    ON u.telegram_id = dp.user_id \n    AND dp.date = (NOW() AT TIME ZONE u.timezone)::date\nWHERE u.is_onboarded = TRUE\n  AND u.is_paused = FALSE",
        "options": {}
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        -1120,
        1504
      ],
      "id": "dd8ece04-ac12-43f2-a622-b8b59e365a5b",
      "name": "Get Users + Cache",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const user = $input.first().json;\n\n// Helper: Parse time string to minutes since midnight\nconst timeToMinutes = (timeStr) => {\n    if (!timeStr) return null;\n    const [h, m] = timeStr.split(':').map(Number);\n    return h * 60 + m;\n};\n\n// Helper: Parse local_time to minutes\nconst localTimeToMinutes = (timeStr) => {\n    const [h, m] = timeStr.split(':').map(Number);\n    return h * 60 + m;\n};\n\nconst localMinutes = localTimeToMinutes(user.local_time);\nconst dayOfWeek = parseInt(user.day_of_week); // 0 = Sunday, 5 = Friday\nconst isFriday = dayOfWeek === 5;\nconst gender = user.gender; // 'male', 'female', or null\nconst isPeriodMode = user.period_mode_active === true;\nconst actions = [];\n\n// === FIRST DAY CHECK ===\nlet localDateStr;\nif (typeof user.local_date === 'string') {\n    localDateStr = user.local_date.split('T')[0];\n} else {\n    localDateStr = new Date(user.local_date).toISOString().split('T')[0];\n}\n\nconst createdAt = new Date(user.created_at);\nconst createdDateInUserTz = createdAt.toLocaleDateString('en-CA', { \n    timeZone: user.timezone || 'Africa/Cairo' \n});\n\nconst isFirstDay = localDateStr === createdDateInUserTz;\n\n// Skip prayer notifications/roasts on first day or period mode\nconst skipPrayerActions = isPeriodMode || isFirstDay;\n\n// Gender-specific notification messages\nconst notifyMessages = {\n    male: {\n        'Fajr': [\n            '\ud83c\udf05 \u0635\u0644\u064a\u062a \u0627\u0644\u0641\u062c\u0631\u061f',\n            '\ud83c\udf05 \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u0641\u062c\u0631',\n            '\ud83c\udf05 \u0627\u0644\u0641\u062c\u0631 - \u0635\u0644\u064a\u062a\u061f',\n            '\ud83c\udf05 \u0645\u062a\u0646\u0633\u0627\u0634 \u062a\u0633\u062c\u0644 \u0627\u0644\u0641\u062c\u0631',\n            '\ud83c\udf05 \u0635\u0644\u0627\u0629 \u0627\u0644\u0641\u062c\u0631 '\n        ],\n        'Dhuhr': [\n            '\u2600\ufe0f \u0635\u0644\u064a\u062a \u0627\u0644\u0638\u0647\u0631\u061f',\n            '\u2600\ufe0f \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631',\n            '\u2600\ufe0f \u0627\u0644\u0638\u0647\u0631 - \u0635\u0644\u064a\u062a\u061f',\n            '\u2600\ufe0f \u0645\u062a\u0646\u0633\u0627\u0634 \u062a\u0633\u062c\u0644 \u0627\u0644\u0638\u0647\u0631',\n            '\u2600\ufe0f \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631 '\n        ],\n        'Jumuah': [\n            '\ud83d\udd4c \u0635\u0644\u064a\u062a \u0627\u0644\u062c\u0645\u0639\u0629\u061f',\n            '\ud83d\udd4c \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u062c\u0645\u0639\u0629',\n            '\ud83d\udd4c \u062c\u0645\u0639\u0629 \u0645\u0628\u0627\u0631\u0643\u0629 - \u0635\u0644\u064a\u062a\u061f',\n            '\ud83d\udd4c \u062c\u0645\u0639\u0629 \u0645\u0628\u0627\u0631\u0643\u0629 \ud83e\udd0d',\n            '\ud83d\udd4c \u0635\u0644\u0627\u0629 \u0627\u0644\u062c\u0645\u0639\u0629 \ud83e\udd0d'\n        ],\n        'Asr': [\n            '\ud83c\udf24\ufe0f \u0635\u0644\u064a\u062a \u0627\u0644\u0639\u0635\u0631\u061f',\n            '\ud83c\udf24\ufe0f \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0635\u0631',\n            '\ud83c\udf24\ufe0f \u0627\u0644\u0639\u0635\u0631 - \u0635\u0644\u064a\u062a\u061f',\n            '\ud83c\udf24\ufe0f \u0645\u062a\u0646\u0633\u0627\u0634 \u062a\u0633\u062c\u0644 \u0627\u0644\u0639\u0635\u0631',\n            '\ud83c\udf24\ufe0f \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0635\u0631 '\n        ],\n        'Maghrib': [\n            '\ud83c\udf05 \u0635\u0644\u064a\u062a \u0627\u0644\u0645\u063a\u0631\u0628\u061f',\n            '\ud83c\udf05 \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u0645\u063a\u0631\u0628',\n            '\ud83c\udf05 \u0627\u0644\u0645\u063a\u0631\u0628 - \u0635\u0644\u064a\u062a\u061f',\n            '\ud83c\udf05 \u0645\u062a\u0646\u0633\u0627\u0634 \u062a\u0633\u062c\u0644 \u0627\u0644\u0645\u063a\u0631\u0628',\n            '\ud83c\udf05 \u0635\u0644\u0627\u0629 \u0627\u0644\u0645\u063a\u0631\u0628 '\n        ],\n        'Isha': [\n            '\ud83c\udf19 \u0635\u0644\u064a\u062a \u0627\u0644\u0639\u0634\u0627\u0621\u061f',\n            '\ud83c\udf19 \u0633\u062c\u0651\u0644 \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0634\u0627\u0621',\n            '\ud83c\udf19 \u0627\u0644\u0639\u0634\u0627\u0621 - \u0635\u0644\u064a\u062a\u061f',\n            '\ud83c\udf19 \u0645\u062a\u0646\u0633\u0627\u0634 \u062a\u0633\u062c\u0644 \u0627\u0644\u0639\u0634\u0627\u0621',\n            '\ud83c\udf19 \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0634\u0627\u0621 '\n        ]\n    },\n    female: {\n        'Fajr': [\n            '\ud83c\udf05 \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0641\u062c\u0631\u061f',\n            '\ud83c\udf05 \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0641\u062c\u0631',\n            '\ud83c\udf05 \u0627\u0644\u0641\u062c\u0631 - \u0635\u0644\u064a\u062a\u064a\u061f',\n            '\ud83c\udf05 \u0645\u062a\u0646\u0633\u064a\u0634 \u062a\u0633\u062c\u0644\u064a \u0627\u0644\u0641\u062c\u0631',\n            '\ud83c\udf05 \u0635\u0644\u0627\u0629 \u0627\u0644\u0641\u062c\u0631 '\n        ],\n        'Dhuhr': [\n            '\u2600\ufe0f \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0638\u0647\u0631\u061f',\n            '\u2600\ufe0f \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631',\n            '\u2600\ufe0f \u0627\u0644\u0638\u0647\u0631 - \u0635\u0644\u064a\u062a\u064a\u061f',\n            '\u2600\ufe0f \u0645\u062a\u0646\u0633\u064a\u0634 \u062a\u0633\u062c\u0644\u064a \u0627\u0644\u0638\u0647\u0631',\n            '\u2600\ufe0f \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631 '\n        ],\n        'Jumuah': [\n            '\ud83d\udd4c \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0638\u0647\u0631\u061f',\n            '\ud83d\udd4c \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631',\n            '\ud83d\udd4c \u0627\u0644\u062c\u0645\u0639\u0629 \u0645\u0628\u0627\u0631\u0643\u0629 - \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0638\u0647\u0631\u061f',\n            '\ud83d\udd4c \u062c\u0645\u0639\u0629 \u0645\u0628\u0627\u0631\u0643\u0629 \ud83e\udd0d',\n            '\ud83d\udd4c \u0635\u0644\u0627\u0629 \u0627\u0644\u0638\u0647\u0631 '\n        ],\n        'Asr': [\n            '\ud83c\udf24\ufe0f \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0639\u0635\u0631\u061f',\n            '\ud83c\udf24\ufe0f \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0635\u0631',\n            '\ud83c\udf24\ufe0f \u0627\u0644\u0639\u0635\u0631 - \u0635\u0644\u064a\u062a\u064a\u061f',\n            '\ud83c\udf24\ufe0f \u0645\u062a\u0646\u0633\u064a\u0634 \u062a\u0633\u062c\u0644\u064a \u0627\u0644\u0639\u0635\u0631',\n            '\ud83c\udf24\ufe0f \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0635\u0631 '\n        ],\n        'Maghrib': [\n            '\ud83c\udf05 \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0645\u063a\u0631\u0628\u061f',\n            '\ud83c\udf05 \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0645\u063a\u0631\u0628',\n            '\ud83c\udf05 \u0627\u0644\u0645\u063a\u0631\u0628 - \u0635\u0644\u064a\u062a\u064a\u061f',\n            '\ud83c\udf05 \u0645\u062a\u0646\u0633\u064a\u0634 \u062a\u0633\u062c\u0644\u064a \u0627\u0644\u0645\u063a\u0631\u0628',\n            '\ud83c\udf05 \u0635\u0644\u0627\u0629 \u0627\u0644\u0645\u063a\u0631\u0628 '\n        ],\n        'Isha': [\n            '\ud83c\udf19 \u0635\u0644\u064a\u062a\u064a \u0627\u0644\u0639\u0634\u0627\u0621\u061f',\n            '\ud83c\udf19 \u0633\u062c\u0651\u0644\u064a \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0634\u0627\u0621',\n            '\ud83c\udf19 \u0627\u0644\u0639\u0634\u0627\u0621 - \u0635\u0644\u064a\u062a\u064a\u061f',\n            '\ud83c\udf19 \u0645\u062a\u0646\u0633\u064a\u0634 \u062a\u0633\u062c\u0644\u064a \u0627\u0644\u0639\u0634\u0627\u0621',\n            '\ud83c\udf19 \u0635\u0644\u0627\u0629 \u0627\u0644\u0639\u0634\u0627\u0621 \ud83e\udd0d'\n        ]\n    }\n};\n\n// Helper: Get messages based on gender (defaults to male if null)\nconst getMessages = (prayer) => {\n    if (gender === 'female') {\n        return notifyMessages.female[prayer];\n    } else {\n        return notifyMessages.male[prayer];\n    }\n};\n\n// === PRAYER NOTIFICATIONS & ROASTS ===\nif (!skipPrayerActions) {\n    const prayers = [\n        { name: 'Fajr', time: user.fajr, nextTime: user.dhuhr, notified: user.fajr_notified, roasted: user.fajr_roasted, prayed: user.fajr_prayed },\n        { name: 'Dhuhr', time: user.dhuhr, nextTime: user.asr, notified: user.dhuhr_notified, roasted: user.dhuhr_roasted, prayed: user.dhuhr_prayed, skipOnFriday: true },\n        { name: 'Asr', time: user.asr, nextTime: user.maghrib, notified: user.asr_notified, roasted: user.asr_roasted, prayed: user.asr_prayed },\n        { name: 'Maghrib', time: user.maghrib, nextTime: user.isha, notified: user.maghrib_notified, roasted: user.maghrib_roasted, prayed: user.maghrib_prayed },\n        { name: 'Isha', time: user.isha, nextTime: null, notified: user.isha_notified, roasted: user.isha_roasted, prayed: user.isha_prayed }\n    ];\n\n    for (const p of prayers) {\n        const prayerMinutes = timeToMinutes(p.time);\n        const nextPrayerMinutes = p.nextTime ? timeToMinutes(p.nextTime) : (24 * 60);\n        const diffMins = localMinutes - prayerMinutes;\n        \n        const hasPrayed = p.prayed !== null && p.prayed !== undefined;\n        \n        // === FRIDAY JUMUAH HANDLING ===\n        if (p.name === 'Dhuhr' && isFriday) {\n            if (diffMins >= 0 && !p.notified) {\n                const msgs = getMessages('Jumuah');\n                actions.push({\n                    type: 'NOTIFY',\n                    prayer: 'Dhuhr',\n                    prayerTime: p.time,\n                    isJumuah: true,\n                    user: {\n                        telegram_id: user.telegram_id,\n                        first_name: user.first_name,\n                        timezone: user.timezone,\n                        gender: user.gender\n                    },\n                    message: msgs[Math.floor(Math.random() * msgs.length)]\n                });\n            }\n            continue;\n        }\n        \n        // === NORMAL PRAYER HANDLING ===\n        if (diffMins >= 0 && !p.notified) {\n            const msgs = getMessages(p.name);\n            actions.push({\n                type: 'NOTIFY',\n                prayer: p.name,\n                prayerTime: p.time,\n                user: {\n                    telegram_id: user.telegram_id,\n                    first_name: user.first_name,\n                    timezone: user.timezone,\n                    gender: user.gender\n                },\n                message: msgs[Math.floor(Math.random() * msgs.length)]\n            });\n        }\n        \n        // === ROAST: 60 min after prayer, before next prayer ===\n        if (diffMins >= 60 && localMinutes < nextPrayerMinutes && !hasPrayed && !p.roasted && p.notified) {\n            actions.push({\n                type: 'ROAST',\n                prayer: p.name,\n                prayerTime: p.time,\n                user: {\n                    telegram_id: user.telegram_id,\n                    first_name: user.first_name,\n                    timezone: user.timezone,\n                    gender: user.gender\n                }\n            });\n        }\n    }\n}\n\n// === AZKAR SABAH (Now 30 min after Fajr) ===\nconst fajrMinutes = timeToMinutes(user.fajr);\nconst dhuhrMinutes = timeToMinutes(user.dhuhr);\nconst azkarSabahStart = fajrMinutes + 30; // 30 minutes after Fajr\n\nif (localMinutes >= azkarSabahStart && localMinutes < dhuhrMinutes && !user.azkar_sabah_sent && user.azkar_enabled) {\n    actions.push({\n        type: 'AZKAR_SABAH',\n        user: {\n            telegram_id: user.telegram_id,\n            first_name: user.first_name,\n            timezone: user.timezone,\n            gender: user.gender\n        }\n    });\n}\n\n// === AZKAR MASA (Between Asr and Maghrib) ===\nconst asrMinutes = timeToMinutes(user.asr);\nconst maghribMinutes = timeToMinutes(user.maghrib);\nif (localMinutes >= asrMinutes && localMinutes < maghribMinutes && !user.azkar_masa_sent && user.azkar_enabled) {\n    actions.push({\n        type: 'AZKAR_MASA',\n        user: {\n            telegram_id: user.telegram_id,\n            first_name: user.first_name,\n            timezone: user.timezone,\n            gender: user.gender\n        }\n    });\n}\n\n// === FEEDBACK ===\nif (!isPeriodMode) {\n    const ishaMinutes = timeToMinutes(user.isha);\n    const ishaDiff = localMinutes - ishaMinutes;\n    const hadAnyNotification = user.fajr_notified || user.dhuhr_notified || user.asr_notified || user.maghrib_notified || user.isha_notified;\n    \n    if (ishaDiff >= 180 && !user.feedback_sent) {\n        if (isFirstDay) {\n            actions.push({\n                type: 'FIRST_DAY_FEEDBACK',\n                user: {\n                    telegram_id: user.telegram_id,\n                    first_name: user.first_name,\n                    timezone: user.timezone,\n                    gender: user.gender\n                }\n            });\n        } else if (hadAnyNotification) {\n            actions.push({\n                type: 'FEEDBACK',\n                user: {\n                    telegram_id: user.telegram_id,\n                    first_name: user.first_name,\n                    timezone: user.timezone,\n                    gender: user.gender\n                }\n            });\n        }\n    }\n}\n\n// Return actions or skip\nif (actions.length > 0) {\n    return actions.map(a => ({ json: a }));\n} else {\n    return [{ json: { \n        type: 'SKIP', \n        user_id: user.telegram_id, \n        reason: isFirstDay ? 'first_day' : (isPeriodMode ? 'period_mode' : 'no_actions')\n    } }];\n}"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -528,
        1520
      ],
      "id": "17cd7da4-f38c-4fb4-9282-14ff548c845d",
      "name": "Brain (Optimized)"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "NOTIFY",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "b9dd3c1d-dc69-416c-9d8f-23d4c8ee02c1"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "NOTIFY"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "ROAST",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "997f28b9-417a-4c7a-9061-d2cc765c2588"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "ROAST"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "FEEDBACK",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "20d8fc02-1f44-459c-9151-d825045bb6bf"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "FEEDBACK"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "28aa0c81-d0df-4b14-a962-830c1ab44ff1",
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "AZKAR_SABAH",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "AZKAR_SABAH"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "d22bcad1-651e-4b58-961f-908bbab7bac5",
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "AZKAR_MASA",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "AZKAR_MASA"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "e2df97aa-47eb-43b0-b5c0-6aa0fb169a6f",
                    "leftValue": "={{ $json.type }}",
                    "rightValue": "FIRST_DAY_FEEDBACK",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "FIRST_DAY_FEEDBACK"
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.3,
      "position": [
        -384,
        1440
      ],
      "id": "1cb321aa-8ff8-4afc-bb75-964656a9eb00",
      "name": "Action Switch"
    },
    {
      "parameters": {
        "jsCode": "const prayerAr = {\n    'Fajr': '\u0627\u0644\u0641\u062c\u0631', 'Dhuhr': '\u0627\u0644\u0638\u0647\u0631', 'Asr': '\u0627\u0644\u0639\u0635\u0631', 'Maghrib': '\u0627\u0644\u0645\u063a\u0631\u0628', 'Isha': '\u0627\u0644\u0639\u0634\u0627\u0621'\n}[$json.prayer];\n\nconst name = $json.user.first_name;\nconst gender = $json.user.gender; // Use gender from database\n\nlet roasts = [];\n\nif (gender === 'female') {\n    // Female-specific messages\n    roasts = [\n        // Direct & Clear\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0642\u0648\u0645\u064a \u0635\u0644\u064a.`,\n        `${name}\u060c \u0633\u0627\u0639\u0629 \u0639\u062f\u062a \u0648${prayerAr} \u0644\u0633\u0647.`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0644\u0633\u0647 \u0641\u064a\u0647 \u0648\u0642\u062a.`,\n        `${name}\u060c \u0641\u064a\u0646 ${prayerAr}\u061f`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0645\u062a\u0623\u062e\u0631\u064a\u0634 \u0623\u0643\u062a\u0631.`,\n        `${name}\u060c \u0644\u0633\u0647 ${prayerAr} \u0645\u062a\u0635\u0644\u062a\u0634.`,\n        \n        // Dunya Reminder\n        `${name}\u060c \u0645\u0641\u064a\u0634 \u062d\u0627\u062c\u0629 \u0641\u064a \u0625\u064a\u062f\u0643 \u062f\u0644\u0648\u0642\u062a\u064a \u0623\u0647\u0645 \u0645\u0646 ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0641\u0627\u0646\u064a\u0629. ${prayerAr} \u0628\u0627\u0642\u064a\u0629. \u0642\u0648\u0645\u064a \u0635\u0644\u064a.`,\n        `${name}\u060c \u0643\u0644 \u062d\u0627\u062c\u0629 \u062a\u0642\u062f\u0631\u064a \u062a\u0623\u062c\u0644\u064a\u0647\u0627 \u0625\u0644\u0627 \u0627\u0644\u0635\u0644\u0627\u0629.`,\n        `${name}\u060c \u0633\u064a\u0628\u064a \u0627\u0644\u062f\u0646\u064a\u0627 \u062f\u0642\u0627\u064a\u0642. ${prayerAr} \u0645\u0633\u062a\u0646\u064a\u0627\u0643\u064a.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0647\u062a\u0641\u0636\u0644 \u0645\u0648\u062c\u0648\u062f\u0629 \u0628\u0639\u062f \u0645\u0627 \u062a\u0635\u0644\u064a. \u0642\u0648\u0645\u064a.`,\n        `${name}\u060c \u0627\u0644\u0644\u064a \u0634\u0627\u063a\u0644\u0643 \u062f\u0644\u0648\u0642\u062a\u064a \u0645\u0634 \u0647\u064a\u0641\u0631\u0642 \u0628\u0643\u0631\u0629. ${prayerAr} \u0647\u062a\u0641\u0631\u0642.`,\n        `${name}\u060c \u0665 \u062f\u0642\u0627\u064a\u0642 \u0644\u0631\u0628\u0646\u0627 \u0645\u0634 \u0647\u062a\u0623\u062e\u0631 \u062d\u0627\u062c\u0629. \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0645\u0647\u0645\u0627 \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u064a\u0647 \u0645\u0647\u0645\u060c ${prayerAr} \u0623\u0647\u0645.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0645\u0634\u063a\u0644\u0627\u0643\u064a \u0639\u0646 \u0625\u064a\u0647\u061f \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n\n        // Mortality Reminder\n        `${name}\u060c \u0627\u0644\u0639\u0645\u0631 \u0628\u064a\u062c\u0631\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0643\u0644 \u0635\u0644\u0627\u0629 \u0628\u062a\u0639\u062f\u064a \u0645\u0646 \u063a\u064a\u0631 \u0645\u0627 \u062a\u062a\u0635\u0644\u064a \u0645\u0634 \u0631\u0627\u062c\u0639\u0629.`,\n        `${name}\u060c \u0645\u064a\u0646 \u0636\u0627\u0645\u0646 \u0628\u0643\u0631\u0629\u061f \u0635\u0644\u064a ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0631\u0627\u062d \u0645\u0634 \u0631\u0627\u062c\u0639. \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0623\u0648\u0644 \u0633\u0624\u0627\u0644 \u0647\u062a\u062a\u0633\u0623\u0644\u064a \u0639\u0646\u0647 \u0627\u0644\u0635\u0644\u0627\u0629. \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0648\u062a \u0645\u0634 \u0628\u064a\u0633\u062a\u0623\u0630\u0646. \u0635\u0644\u064a ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0645\u0634 \u0639\u0627\u0631\u0641\u0629 \u0641\u0627\u0636\u0644\u0643 \u0643\u0627\u0645 \u0635\u0644\u0627\u0629 \u0641\u064a \u062d\u064a\u0627\u062a\u0643. \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0643\u0644 \u0646\u064e\u0641\u064e\u0633 \u0628\u062a\u0627\u062e\u062f\u064a\u0647 \u0645\u0634 \u0645\u0636\u0645\u0648\u0646. \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0644\u0627\u064a\u0643\u0629 \u0628\u062a\u0643\u062a\u0628 \u062f\u0644\u0648\u0642\u062a\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0627\u0644\u0642\u0628\u0631 \u0645\u0641\u064a\u0647\u0648\u0634 \u062a\u0623\u062c\u064a\u0644. \u0635\u0644\u064a ${prayerAr}.`,\n        \n        // Reflective Questions\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0623\u062e\u0631\u0643 \u0639\u0646 ${prayerAr}\u061f`,\n        `${name}\u060c \u0647\u0644 \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u064a\u0647 \u062f\u0644\u0648\u0642\u062a\u064a \u064a\u0633\u062a\u0627\u0647\u0644 \u062a\u0623\u062e\u064a\u0631 ${prayerAr}\u061f`,\n        `${name}\u060c \u0628\u062a\u0623\u062c\u0644\u064a \u0644\u064a\u0647\u061f ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u063a\u064a\u0631 \u062f\u0642\u0627\u064a\u0642.`,\n        `${name}\u060c \u0645\u0633\u062a\u0646\u064a\u0629 \u0625\u064a\u0647\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0627\u0633\u0643\u0643\u061f \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0644\u064a\u0647 \u0628\u062a\u0623\u062e\u0631\u064a \u0639\u0644\u0649 \u0631\u0628\u0646\u0627\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0623\u0647\u0645 \u0645\u0646 ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a\u061f`,\n        \n        // Time & Regret\n        `${name}\u060c \u0643\u0644 \u0645\u0631\u0629 \u0628\u062a\u0623\u062c\u0644\u064a \u0628\u062a\u0628\u0639\u062f\u064a \u0623\u0643\u062a\u0631. \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0646\u0647\u0627\u0631\u062f\u0647 \u0628\u064a\u0639\u062f\u064a. ${prayerAr} \u0644\u0633\u0647 \u0645\u0633\u062a\u0646\u064a\u0627\u0643\u064a.`,\n        `${name}\u060c \u0628\u0643\u0631\u0629 \u0647\u062a\u062a\u0645\u0646\u064a \u0625\u0646\u0643 \u0635\u0644\u064a\u062a\u064a. \u0642\u0648\u0645\u064a \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0628\u064a\u0639\u062f\u064a \u0645\u0634 \u0631\u0627\u062c\u0639. \u0635\u0644\u064a ${prayerAr}.`,\n        \n        // Motivational\n        `${name}\u060c \u0642\u0648\u0645\u064a \u062f\u0644\u0648\u0642\u062a\u064a. \u0645\u0634 \u0645\u062d\u062a\u0627\u062c\u0629 \u063a\u064a\u0631 \u062f\u0642\u0627\u064a\u0642.`,\n        `${name}\u060c ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u0645\u0646 \u0648\u0642\u062a\u0643 \u062d\u0627\u062c\u0629.`,\n        `${name}\u060c \u0644\u0633\u0647 \u0641\u064a\u0647 \u0641\u0631\u0635\u0629. \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0642\u0648\u0645\u064a \u0635\u0644\u064a ${prayerAr} \u0648\u0627\u0631\u062c\u0639\u064a \u0643\u0645\u0644\u064a \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u064a\u0647.`,\n        `${name}\u060c \u0631\u0627\u062d\u0629 \u0628\u0627\u0644\u0643 \u0641\u064a \u0627\u0644\u0635\u0644\u0627\u0629. \u0642\u0648\u0645\u064a \u062c\u0631\u0628\u064a.`,\n        `${name}\u060c \u0642\u0644\u0628\u0643 \u0645\u062d\u062a\u0627\u062c ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a. \u0642\u0648\u0645\u064a.`,\n        \n        // Short & Powerful\n        `${name}\u060c \u0642\u0648\u0645\u064a.`,\n        `${name}\u060c ${prayerAr}. \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a\u0643\u064a.`,\n        `${name}\u060c \u064a\u0644\u0627.`,\n        `${name}\u060c ${prayerAr}. \u0642\u0648\u0645\u064a.`,\n        `${name}\u060c \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a\u0643\u064a.`\n    ];\n} else if (gender === 'male') {\n    // Male-specific messages\n    roasts = [\n        // Direct & Clear\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0642\u0648\u0645 \u0635\u0644\u064a.`,\n        `${name}\u060c \u0633\u0627\u0639\u0629 \u0639\u062f\u062a \u0648${prayerAr} \u0644\u0633\u0647.`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0644\u0633\u0647 \u0641\u064a\u0647 \u0648\u0642\u062a.`,\n        `${name}\u060c \u0641\u064a\u0646 ${prayerAr}\u061f`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0645\u062a\u0623\u062e\u0631\u0634 \u0623\u0643\u062a\u0631.`,\n        `${name}\u060c \u0644\u0633\u0647 ${prayerAr} \u0645\u062a\u0635\u0644\u062a\u0634.`,\n        \n        // Dunya Reminder\n        `${name}\u060c \u0645\u0641\u064a\u0634 \u062d\u0627\u062c\u0629 \u0641\u064a \u0625\u064a\u062f\u0643 \u062f\u0644\u0648\u0642\u062a\u064a \u0623\u0647\u0645 \u0645\u0646 ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0641\u0627\u0646\u064a\u0629. ${prayerAr} \u0628\u0627\u0642\u064a\u0629. \u0642\u0648\u0645 \u0635\u0644\u064a.`,\n        `${name}\u060c \u0643\u0644 \u062d\u0627\u062c\u0629 \u062a\u0642\u062f\u0631 \u062a\u0623\u062c\u0644\u0647\u0627 \u0625\u0644\u0627 \u0627\u0644\u0635\u0644\u0627\u0629.`,\n        `${name}\u060c \u0633\u064a\u0628 \u0627\u0644\u062f\u0646\u064a\u0627 \u062f\u0642\u0627\u064a\u0642. ${prayerAr} \u0645\u0633\u062a\u0646\u064a\u0627\u0643.`,\n        `${name}\u060c \u0627\u0644\u0644\u064a \u0634\u0627\u063a\u0644\u0643 \u062f\u0644\u0648\u0642\u062a\u064a \u0645\u0634 \u0647\u064a\u0641\u0631\u0642 \u0628\u0643\u0631\u0629. ${prayerAr} \u0647\u062a\u0641\u0631\u0642.`,\n        `${name}\u060c \u0665 \u062f\u0642\u0627\u064a\u0642 \u0644\u0631\u0628\u0646\u0627 \u0645\u0634 \u0647\u062a\u0623\u062e\u0631 \u062d\u0627\u062c\u0629. \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0645\u0647\u0645\u0627 \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u0647 \u0645\u0647\u0645\u060c ${prayerAr} \u0623\u0647\u0645.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0645\u0634\u063a\u0644\u0627\u0643 \u0639\u0646 \u0625\u064a\u0647\u061f \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n\n        // Mortality Reminder\n        `${name}\u060c \u0627\u0644\u0639\u0645\u0631 \u0628\u064a\u062c\u0631\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0645\u064a\u0646 \u0636\u0627\u0645\u0646 \u0628\u0643\u0631\u0629\u061f \u0635\u0644\u064a ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0631\u0627\u062d \u0645\u0634 \u0631\u0627\u062c\u0639. \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0623\u0648\u0644 \u0633\u0624\u0627\u0644 \u0647\u062a\u062a\u0633\u0623\u0644\u0647 \u0639\u0646 \u0627\u0644\u0635\u0644\u0627\u0629. \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0648\u062a \u0645\u0634 \u0628\u064a\u0633\u062a\u0623\u0630\u0646. \u0635\u0644\u064a ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0645\u0634 \u0639\u0627\u0631\u0641 \u0641\u0627\u0636\u0644\u0643 \u0643\u0627\u0645 \u0635\u0644\u0627\u0629 \u0641\u064a \u062d\u064a\u0627\u062a\u0643. \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0643\u0644 \u0646\u064e\u0641\u064e\u0633 \u0628\u062a\u0627\u062e\u062f\u0647 \u0645\u0634 \u0645\u0636\u0645\u0648\u0646. \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0644\u0627\u064a\u0643\u0629 \u0628\u062a\u0643\u062a\u0628 \u062f\u0644\u0648\u0642\u062a\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0627\u0644\u0642\u0628\u0631 \u0645\u0641\u064a\u0647\u0648\u0634 \u062a\u0623\u062c\u064a\u0644. \u0635\u0644\u064a ${prayerAr}.`,\n        \n        // Reflective Questions\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0623\u062e\u0631\u0643 \u0639\u0646 ${prayerAr}\u061f`,\n        `${name}\u060c \u0647\u0644 \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u0647 \u062f\u0644\u0648\u0642\u062a\u064a \u064a\u0633\u062a\u0627\u0647\u0644 \u062a\u0623\u062e\u064a\u0631 ${prayerAr}\u061f`,\n        `${name}\u060c \u0628\u062a\u0623\u062c\u0644 \u0644\u064a\u0647\u061f ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u063a\u064a\u0631 \u062f\u0642\u0627\u064a\u0642.`,\n        `${name}\u060c \u0645\u0633\u062a\u0646\u064a \u0625\u064a\u0647\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0627\u0633\u0643\u0643\u061f \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0644\u064a\u0647 \u0628\u062a\u0623\u062e\u0631 \u0639\u0644\u0649 \u0631\u0628\u0646\u0627\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0623\u0647\u0645 \u0645\u0646 ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a\u061f`,\n        \n        // Time & Regret\n        `${name}\u060c \u0643\u0644 \u0645\u0631\u0629 \u0628\u062a\u0623\u062c\u0644 \u0628\u062a\u0628\u0639\u062f \u0623\u0643\u062a\u0631. \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0646\u0647\u0627\u0631\u062f\u0647 \u0628\u064a\u0639\u062f\u064a. ${prayerAr} \u0644\u0633\u0647 \u0645\u0633\u062a\u0646\u064a\u0627\u0643.`,\n        `${name}\u060c \u0628\u0643\u0631\u0629 \u0647\u062a\u062a\u0645\u0646\u0649 \u0625\u0646\u0643 \u0635\u0644\u064a\u062a. \u0642\u0648\u0645 \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0628\u064a\u0639\u062f\u064a \u0645\u0634 \u0631\u0627\u062c\u0639. \u0635\u0644\u064a ${prayerAr}.`,\n        \n        // Motivational\n        `${name}\u060c \u0642\u0648\u0645 \u062f\u0644\u0648\u0642\u062a\u064a. \u0645\u0634 \u0645\u062d\u062a\u0627\u062c \u063a\u064a\u0631 \u062f\u0642\u0627\u064a\u0642.`,\n        `${name}\u060c ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u0645\u0646 \u0648\u0642\u062a\u0643 \u062d\u0627\u062c\u0629.`,\n        `${name}\u060c \u0644\u0633\u0647 \u0641\u064a\u0647 \u0641\u0631\u0635\u0629. \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0642\u0648\u0645 \u0635\u0644\u064a ${prayerAr} \u0648\u0627\u0631\u062c\u0639 \u0643\u0645\u0651\u0644 \u0627\u0644\u0644\u064a \u0628\u062a\u0639\u0645\u0644\u0647.`,\n        `${name}\u060c \u0631\u0627\u062d\u0629 \u0628\u0627\u0644\u0643 \u0641\u064a \u0627\u0644\u0635\u0644\u0627\u0629. \u0642\u0648\u0645 \u062c\u0631\u0628.`,\n        `${name}\u060c \u0642\u0644\u0628\u0643 \u0645\u062d\u062a\u0627\u062c ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a. \u0642\u0648\u0645.`,\n        \n        // Short & Powerful\n        `${name}\u060c \u0642\u0648\u0645.`,\n        `${name}\u060c ${prayerAr}. \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a\u0643.`,\n        `${name}\u060c \u064a\u0644\u0627.`,\n        `${name}\u060c ${prayerAr}. \u0642\u0648\u0645.`,\n        `${name}\u060c \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a\u0643.`\n    ];\n} else {\n    // Gender-neutral messages (for unknown names)\n    roasts = [\n        // Direct & Clear (no gendered verbs)\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u064a\u0644\u0627 \u0635\u0644\u064a.`,\n        `${name}\u060c \u0633\u0627\u0639\u0629 \u0639\u062f\u062a \u0648${prayerAr} \u0644\u0633\u0647.`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0644\u0633\u0647 \u0641\u064a\u0647 \u0648\u0642\u062a.`,\n        `${name}\u060c \u0641\u064a\u0646 ${prayerAr}\u061f`,\n        `${name}\u060c ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a. \u0627\u0644\u0648\u0642\u062a \u0628\u064a\u062c\u0631\u064a.`,\n        `${name}\u060c \u0644\u0633\u0647 ${prayerAr} \u0645\u062a\u0635\u0644\u062a\u0634.`,\n        \n        // Dunya Reminder\n        `${name}\u060c \u0645\u0641\u064a\u0634 \u062d\u0627\u062c\u0629 \u062f\u0644\u0648\u0642\u062a\u064a \u0623\u0647\u0645 \u0645\u0646 ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0641\u0627\u0646\u064a\u0629. ${prayerAr} \u0628\u0627\u0642\u064a\u0629. \u064a\u0644\u0627 \u0635\u0644\u064a.`,\n        `${name}\u060c \u0643\u0644 \u062d\u0627\u062c\u0629 \u0645\u0645\u0643\u0646 \u062a\u062a\u0623\u062c\u0644 \u0625\u0644\u0627 \u0627\u0644\u0635\u0644\u0627\u0629.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u062a\u0633\u062a\u0646\u0649 \u062f\u0642\u0627\u064a\u0642. ${prayerAr} \u0645\u0633\u062a\u0646\u064a\u0629.`,\n        `${name}\u060c \u0627\u0644\u062f\u0646\u064a\u0627 \u0647\u062a\u0641\u0636\u0644 \u0645\u0648\u062c\u0648\u062f\u0629 \u0628\u0639\u062f \u0627\u0644\u0635\u0644\u0627\u0629. \u064a\u0644\u0627.`,\n        `${name}\u060c \u0627\u0644\u0644\u064a \u0634\u0627\u063a\u0644\u0643 \u062f\u0644\u0648\u0642\u062a\u064a \u0645\u0634 \u0647\u064a\u0641\u0631\u0642 \u0628\u0643\u0631\u0629. ${prayerAr} \u0647\u062a\u0641\u0631\u0642.`,\n        `${name}\u060c \u0665 \u062f\u0642\u0627\u064a\u0642 \u0644\u0631\u0628\u0646\u0627 \u0645\u0634 \u0647\u062a\u0623\u062e\u0631 \u062d\u0627\u062c\u0629. \u064a\u0644\u0627 ${prayerAr}.`,\n\n        // Mortality Reminder\n        `${name}\u060c \u0627\u0644\u0639\u0645\u0631 \u0628\u064a\u062c\u0631\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0643\u0644 \u0635\u0644\u0627\u0629 \u0628\u062a\u0639\u062f\u064a \u0645\u0634 \u0631\u0627\u062c\u0639\u0629.`,\n        `${name}\u060c \u0645\u064a\u0646 \u0636\u0627\u0645\u0646 \u0628\u0643\u0631\u0629\u061f \u064a\u0644\u0627 ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0631\u0627\u062d \u0645\u0634 \u0631\u0627\u062c\u0639. \u064a\u0644\u0627 ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0648\u062a \u0645\u0634 \u0628\u064a\u0633\u062a\u0623\u0630\u0646. \u064a\u0644\u0627 ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0643\u0644 \u0646\u064e\u0641\u064e\u0633 \u0645\u0634 \u0645\u0636\u0645\u0648\u0646. \u064a\u0644\u0627 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0645\u0644\u0627\u064a\u0643\u0629 \u0628\u062a\u0643\u062a\u0628 \u062f\u0644\u0648\u0642\u062a\u064a. ${prayerAr} \u0627\u062a\u0623\u062e\u0631\u062a.`,\n        `${name}\u060c \u0627\u0644\u0642\u0628\u0631 \u0645\u0641\u064a\u0647\u0648\u0634 \u062a\u0623\u062c\u064a\u0644. \u064a\u0644\u0627 ${prayerAr}.`,\n        \n        // Reflective Questions\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0623\u062e\u0631 ${prayerAr}\u061f`,\n        `${name}\u060c \u0647\u0644 \u0627\u0644\u0644\u064a \u0628\u064a\u062d\u0635\u0644 \u062f\u0644\u0648\u0642\u062a\u064a \u064a\u0633\u062a\u0627\u0647\u0644 \u062a\u0623\u062e\u064a\u0631 ${prayerAr}\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0623\u0647\u0645\u061f`,\n        `${name}\u060c \u0627\u0644\u062a\u0623\u062c\u064a\u0644 \u0644\u064a\u0647\u061f ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u063a\u064a\u0631 \u062f\u0642\u0627\u064a\u0642.`,\n        `${name}\u060c \u0627\u0644\u0627\u0633\u062a\u0646\u0649 \u0644\u0625\u064a\u0647\u061f`,\n        `${name}\u060c \u0625\u064a\u0647 \u0627\u0644\u0644\u064a \u0645\u0627\u0646\u0639\u061f \u064a\u0644\u0627 \u0635\u0644\u064a ${prayerAr}.`,\n        \n        // Time & Regret\n        `${name}\u060c \u0643\u0644 \u062a\u0623\u062c\u064a\u0644 \u0628\u064a\u0628\u0639\u062f \u0623\u0643\u062a\u0631. \u064a\u0644\u0627 \u0635\u0644\u064a ${prayerAr}.`,\n        `${name}\u060c \u0627\u0644\u0646\u0647\u0627\u0631\u062f\u0647 \u0628\u064a\u0639\u062f\u064a. ${prayerAr} \u0644\u0633\u0647 \u0645\u0633\u062a\u0646\u064a\u0629.`,\n        `${name}\u060c \u0628\u0643\u0631\u0629 \u0627\u0644\u0646\u062f\u0645 \u0645\u0634 \u0647\u064a\u0646\u0641\u0639. \u064a\u0644\u0627 \u062f\u0644\u0648\u0642\u062a\u064a.`,\n        `${name}\u060c \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0644\u064a \u0628\u064a\u0639\u062f\u064a \u0645\u0634 \u0631\u0627\u062c\u0639. \u064a\u0644\u0627 ${prayerAr}.`,\n        \n        // Motivational\n        `${name}\u060c \u064a\u0644\u0627 \u062f\u0644\u0648\u0642\u062a\u064a. \u062f\u0642\u0627\u064a\u0642 \u0628\u0633.`,\n        `${name}\u060c ${prayerAr} \u0645\u0634 \u0647\u062a\u0627\u062e\u062f \u0645\u0646 \u0627\u0644\u0648\u0642\u062a \u062d\u0627\u062c\u0629.`,\n        `${name}\u060c \u0644\u0633\u0647 \u0641\u064a\u0647 \u0641\u0631\u0635\u0629. \u064a\u0644\u0627 ${prayerAr}.`,\n        `${name}\u060c \u0635\u0644\u064a ${prayerAr} \u0648\u0643\u0645\u0644 \u0628\u0639\u062f\u0647\u0627.`,\n        `${name}\u060c \u0631\u0627\u062d\u0629 \u0627\u0644\u0628\u0627\u0644 \u0641\u064a \u0627\u0644\u0635\u0644\u0627\u0629. \u064a\u0644\u0627 \u062c\u0631\u0628.`,\n        `${name}\u060c \u0627\u0644\u0642\u0644\u0628 \u0645\u062d\u062a\u0627\u062c ${prayerAr} \u062f\u0644\u0648\u0642\u062a\u064a. \u064a\u0644\u0627.`,\n        \n        // Short & Powerful\n        `${name}\u060c \u064a\u0644\u0627.`,\n        `${name}\u060c ${prayerAr}. \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a.`,\n        `${name}\u060c ${prayerAr}. \u064a\u0644\u0627.`,\n        `${name}\u060c \u0631\u0628\u0646\u0627 \u0645\u0633\u062a\u0646\u064a.`,\n        `${name}\u060c ${prayerAr} \u0645\u0633\u062a\u0646\u064a\u0629.`\n    ];\n}\n\nreturn {\n    json: {\n        ...$json,\n        text: roasts[Math.floor(Math.random() * roasts.length)],\n        detectedGender: gender\n    }\n};"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -16,
        1344
      ],
      "id": "85869072-2a10-4d86-930c-412df7b7f211",
      "name": "Prepare Roast"
    },
    {
      "parameters": {
        "chatId": "={{ $json.user.telegram_id }}",
        "text": "={{ $json.text }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        176,
        1344
      ],
      "id": "ed63e92a-d722-4f87-899d-7263c52addc8",
      "name": "Send Roast",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "UPDATE prayer_times_cache \nSET {{ $('Brain (Optimized)').item.json.prayer.toLowerCase() }}_roasted = TRUE \nWHERE user_id = {{ $('Brain (Optimized)').item.json.user.telegram_id }} \n  AND date = (NOW() AT TIME ZONE '{{ $('Brain (Optimized)').item.json.user.timezone }}')::date;",
        "options": {}
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        384,
        1344
      ],
      "id": "6a12b15f-ff21-4cae-8812-14f27f076aca",
      "name": "Mark Roasted",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const dbData = $input.first().json;\nconst userInfo = $('Action Switch').item.json.user;\n\nconst prayerMap = {\n    'Fajr': '\u0627\u0644\u0641\u062c\u0631',\n    'Dhuhr': '\u0627\u0644\u0638\u0647\u0631',\n    'Asr': '\u0627\u0644\u0639\u0635\u0631',\n    'Maghrib': '\u0627\u0644\u0645\u063a\u0631\u0628',\n    'Isha': '\u0627\u0644\u0639\u0634\u0627\u0621'\n};\n\nconst formatTime = (timestamp) => {\n    if (!timestamp) return null;\n    const date = new Date(timestamp);\n    const hour = date.getHours();\n    const minutes = date.getMinutes();\n    const displayHour = hour > 12 ? hour - 12 : (hour === 0 ? 12 : hour);\n    const period = hour >= 12 ? '\u0645' : '\u0635';\n    return `${displayHour}:${minutes.toString().padStart(2, '0')}${period}`;\n};\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// PRAYER ANALYSIS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst prayers = ['Fajr', 'Dhuhr', 'Asr', 'Maghrib', 'Isha'];\nlet onTimeCount = 0;\nlet qadaCount = 0;\nlet missedCount = 0;\nlet skippedCount = 0;\n\nlet onTimePrayers = [];\nlet qadaPrayers = [];\nlet missedPrayers = [];\n\nprayers.forEach(prayer => {\n    const loggedTime = dbData[prayer] || dbData[prayer.toLowerCase()];\n    const prayerStatus = dbData[`${prayer.toLowerCase()}_status`];\n    const wasNotified = dbData[`${prayer.toLowerCase()}_notified`];\n    const arabicName = prayerMap[prayer];\n    \n    if (!wasNotified) {\n        skippedCount++;\n        return;\n    }\n    \n    if (!loggedTime) {\n        missedCount++;\n        missedPrayers.push(arabicName);\n    } else if (prayerStatus === 'qada') {\n        qadaCount++;\n        qadaPrayers.push(arabicName);\n    } else {\n        onTimeCount++;\n        onTimePrayers.push(arabicName);\n    }\n});\n\nconst notifiedPrayers = 5 - skippedCount;\nconst totalPrayed = onTimeCount + qadaCount;\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// QUALITY SCORE CALCULATION\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst qualityScore = (onTimeCount * 3) + (qadaCount * 1);\nconst maxPossibleScore = notifiedPrayers * 3;\nconst qualityPercentage = maxPossibleScore > 0 ? Math.round((qualityScore / maxPossibleScore) * 100) : 0;\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// SPECIAL CONDITIONS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst ishaNotified = dbData.isha_notified;\nconst ishaPrayed = dbData.Isha || dbData.isha;\nconst isIshaPending = ishaNotified && !ishaPrayed;\n\nconst currentStreak = dbData.consecutive_perfect_days || 0;\nconst bestStreak = dbData.best_streak || 0;\nconst isNewRecord = currentStreak > bestStreak && currentStreak > 0;\n\nconst daysSinceRegistration = dbData.days_since_registration || 0;\nconst isFirstDay = skippedCount > 0 || daysSinceRegistration === 0;\n\nconst isPerfect = onTimeCount === notifiedPrayers && notifiedPrayers > 0;\nconst isAllQada = qadaCount === notifiedPrayers && notifiedPrayers > 0 && qadaCount > 0;\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// FEATURE STATS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst userName = userInfo.first_name || dbData.first_name;\nconst gender = userInfo.gender || dbData.gender || 'unknown';\nconst isFemale = gender === 'female';\nconst isMale = gender === 'male';\n\n// Sunnah\nconst sunnahEnabled = dbData.sunnah_enabled || false;\nlet sunnahCount = 0;\nif (dbData.fajr_sunnah_2) sunnahCount++;\nif (dbData.dhuhr_sunnah_4_before) sunnahCount++;\nif (dbData.dhuhr_sunnah_2_after) sunnahCount++;\nif (dbData.maghrib_sunnah_2) sunnahCount++;\nif (dbData.isha_sunnah_2) sunnahCount++;\n\n// Masjid (males only)\nconst masjidEnabled = dbData.masjid_prayer_enabled || false;\nlet masjidCount = 0;\nif (dbData.fajr_masjid) masjidCount++;\nif (dbData.dhuhr_masjid) masjidCount++;\nif (dbData.asr_masjid) masjidCount++;\nif (dbData.maghrib_masjid) masjidCount++;\nif (dbData.isha_masjid) masjidCount++;\n\n// Azkar\nconst azkarEnabled = dbData.azkar_enabled !== false; // default true\nconst azkarSabahDone = dbData.azkar_sabah_done || false;\nconst azkarMasaDone = dbData.azkar_masa_done || false;\nconst azkarCount = (azkarSabahDone ? 1 : 0) + (azkarMasaDone ? 1 : 0);\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// GRADUAL IMPROVEMENT GUIDANCE (for enabled features)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nlet featureGuidance = [];\n\n// Sunnah guidance (if enabled)\nif (sunnahEnabled) {\n    if (sunnahCount === 0) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0633\u0646\u0646',\n            status: '\u0644\u0645 \u062a\u0635\u0644\u0650 \u0623\u064a \u0633\u0646\u0629',\n            guidance: '\u062c\u0631\u0628 \u0628\u0643\u0631\u0629 \u062a\u0635\u0644\u064a \u0633\u0646\u0629 \u0627\u0644\u0641\u062c\u0631 - \u0631\u0643\u0639\u062a\u064a\u0646 \u0628\u0633 \u0642\u0628\u0644 \u0627\u0644\u0641\u0631\u0636',\n            tone: 'encourage_start'\n        });\n    } else if (sunnahCount === 1) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0633\u0646\u0646',\n            status: `\u0633\u0646\u0629 \u0648\u0627\u062d\u062f\u0629`,\n            guidance: '\u062d\u0627\u0648\u0644 \u062a\u0636\u064a\u0641 \u0633\u0646\u0629 \u0627\u0644\u0638\u0647\u0631 \u0627\u0644\u0642\u0628\u0644\u064a\u0629 - 4 \u0631\u0643\u0639\u0627\u062a',\n            tone: 'encourage_more'\n        });\n    } else if (sunnahCount === 2) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0633\u0646\u0646',\n            status: `\u0633\u0646\u062a\u064a\u0646`,\n            guidance: '\u0643\u0648\u064a\u0633! \u062d\u0627\u0648\u0644 \u062a\u0648\u0635\u0644 3 \u0628\u0643\u0631\u0629',\n            tone: 'encourage_more'\n        });\n    } else if (sunnahCount >= 3 && sunnahCount < 5) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0633\u0646\u0646',\n            status: `${sunnahCount} \u0633\u0646\u0646`,\n            guidance: '\u0642\u0631\u0628\u062a \u0645\u0646 \u0627\u0644\u062e\u0645\u0633\u0629! \u0643\u0645\u0651\u0644',\n            tone: 'almost_there'\n        });\n    } else if (sunnahCount === 5) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0633\u0646\u0646',\n            status: '\u0643\u0644 \u0627\u0644\u0633\u0646\u0646 \u2713',\n            guidance: null, // Perfect - no guidance needed\n            tone: 'perfect'\n        });\n    }\n}\n\n// Masjid guidance (if enabled - males only)\nif (masjidEnabled && isMale) {\n    if (masjidCount === 0) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u062c\u0645\u0627\u0639\u0629',\n            status: '\u0644\u0645 \u062a\u0635\u0644\u0650 \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f',\n            guidance: '\u062d\u0627\u0648\u0644 \u0628\u0643\u0631\u0629 \u062a\u0635\u0644\u064a \u0635\u0644\u0627\u0629 \u0648\u0627\u062d\u062f\u0629 \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f ',\n            tone: 'encourage_start'\n        });\n    } else if (masjidCount === 1) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u062c\u0645\u0627\u0639\u0629',\n            status: '\u0635\u0644\u0627\u0629 \u0648\u0627\u062d\u062f\u0629 \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f',\n            guidance: '\u062d\u0627\u0648\u0644 \u062a\u0632\u0648\u062f \u0635\u0644\u0627\u0629 \u062a\u0627\u0646\u064a\u0629 - \u0627\u0644\u0645\u063a\u0631\u0628 \u0645\u062b\u0644\u0627\u064b',\n            tone: 'encourage_more'\n        });\n    } else if (masjidCount === 2) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u062c\u0645\u0627\u0639\u0629',\n            status: '\u0635\u0644\u0627\u062a\u064a\u0646 \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f',\n            guidance: '\u0643\u0648\u064a\u0633! \u062d\u0627\u0648\u0644 \u062a\u0648\u0635\u0644 3',\n            tone: 'encourage_more'\n        });\n    } else if (masjidCount >= 3 && masjidCount < 5) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u062c\u0645\u0627\u0639\u0629',\n            status: `${masjidCount} \u0635\u0644\u0648\u0627\u062a \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f`,\n            guidance: '\u0645\u0627\u0634\u0627\u0621 \u0627\u0644\u0644\u0647! \u0642\u0631\u0628\u062a \u0645\u0646 \u0627\u0644\u062e\u0645\u0633\u0629',\n            tone: 'almost_there'\n        });\n    } else if (masjidCount === 5) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u062c\u0645\u0627\u0639\u0629',\n            status: '\u0643\u0644 \u0627\u0644\u0635\u0644\u0648\u0627\u062a \u0641\u064a \u0627\u0644\u0645\u0633\u062c\u062f \u2713',\n            guidance: null,\n            tone: 'perfect'\n        });\n    }\n}\n\n// Azkar guidance (if enabled)\nif (azkarEnabled) {\n    if (azkarCount === 0) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0623\u0630\u0643\u0627\u0631',\n            status: '\u0644\u0645 \u062a\u0642\u0631\u0623 \u0627\u0644\u0623\u0630\u0643\u0627\u0631',\n            guidance: '\u062d\u0627\u0648\u0644 \u0628\u0643\u0631\u0629 \u062a\u0642\u0631\u0623 \u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0635\u0628\u0627\u062d \u0628\u0639\u062f \u0627\u0644\u0641\u062c\u0631 - 5 \u062f\u0642\u0627\u064a\u0642 \u0628\u0633',\n            tone: 'encourage_start'\n        });\n    } else if (azkarCount === 1) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0623\u0630\u0643\u0627\u0631',\n            status: azkarSabahDone ? '\u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0635\u0628\u0627\u062d \u2713' : '\u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0645\u0633\u0627\u0621 \u2713',\n            guidance: azkarSabahDone ? '\u062d\u0627\u0648\u0644 \u062a\u0636\u064a\u0641 \u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0645\u0633\u0627\u0621 \u0628\u0639\u062f \u0627\u0644\u0639\u0635\u0631' : '\u062d\u0627\u0648\u0644 \u062a\u0636\u064a\u0641 \u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0635\u0628\u0627\u062d \u0628\u0639\u062f \u0627\u0644\u0641\u062c\u0631',\n            tone: 'encourage_more'\n        });\n    } else if (azkarCount === 2) {\n        featureGuidance.push({\n            feature: '\u0627\u0644\u0623\u0630\u0643\u0627\u0631',\n            status: '\u0623\u0630\u0643\u0627\u0631 \u0627\u0644\u0635\u0628\u0627\u062d \u0648\u0627\u0644\u0645\u0633\u0627\u0621 \u2713',\n            guidance: null,\n            tone: 'perfect'\n        });\n    }\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// FEATURE SUGGESTION (for users ready for next level)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nlet featureSuggestion = null;\n\n// Only suggest if:\n// 1. Today was good (at least 4 on-time OR perfect)\n// 2. User has been using the app for at least 3 days\n// 3. Don't overwhelm - suggest one thing at a time\n\nconst isReadyForSuggestion = (onTimeCount >= 4 || isPerfect) && daysSinceRegistration >= 3 && !isFirstDay;\n\nif (isReadyForSuggestion) {\n    // Priority 1: Suggest Sunnah if not enabled\n    if (!sunnahEnabled) {\n        featureSuggestion = {\n            feature: '\u0627\u0644\u0633\u0646\u0646 \u0627\u0644\u0631\u0648\u0627\u062a\u0628',\n            reason: '\u0623\u062f\u0627\u0621\u0643 \u0641\u064a \u0627\u0644\u0641\u0631\u0627\u0626\u0636 \u0645\u0645\u062a\u0627\u0632',\n            suggestion: '\u0641\u0639\u0651\u0644 \u0627\u0644\u0633\u0646\u0646 \u0627\u0644\u0631\u0648\u0627\u062a\u0628 \u0645\u0646 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a',\n            benefit: '\u0627\u0644\u0633\u0646\u0646 \u0628\u062a\u0643\u0645\u0651\u0644 \u0623\u064a \u0646\u0642\u0635 \u0641\u064a \u0627\u0644\u0641\u0631\u0636 \u0648\u0628\u062a\u0642\u0631\u0628\u0643 \u0645\u0646 \u0631\u0628\u0646\u0627 \u0623\u0643\u062a\u0631',\n            hadith: '\u0627\u0644\u0646\u0628\u064a \ufdfa \u0642\u0627\u0644: \"\u0645\u0627 \u0645\u0646 \u0639\u0628\u062f \u0645\u0633\u0644\u0645 \u064a\u0635\u0644\u064a \u0644\u0644\u0647 

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

About this workflow

💓 Heartbeat. Uses telegram. Scheduled trigger; 12 nodes.

Source: https://github.com/freddy-schuetz/n8n-claw/blob/1a4991fc541ef5d7ed2654d05ac9ef1241554c5d/workflows/heartbeat.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

Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.

Telegram, Notion
Slack & Telegram

A robust workflow to back up and synchronize your n8n workflows to a GitHub repository, with intelligent change detection and support for file renames.

GitHub, n8n, Telegram +1
Slack & Telegram

With the increasing popularity of stablecoins like USDC, its becoming easier to pay for everyday items with crypto thanks to debit cards from issuers like MetaMask. These solutions work by processing

Telegram, N8N Nodes 1Shot
Slack & Telegram

This workflow continuously monitors the TikTok Ads Library for new creatives from specific advertisers or keyword searches, scrapes them via Apify, logs them into Google Sheets, and sends concise noti

Google Sheets, Slack, Telegram +1
Slack & Telegram

GNCA AI News Pipeline. Uses rssFeedRead, httpRequest, telegram, errorTrigger. Scheduled trigger; 29 nodes.

RSS Feed Read, HTTP Request, Telegram +1