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 →
{
"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.
telegramApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.
A robust workflow to back up and synchronize your n8n workflows to a GitHub repository, with intelligent change detection and support for file renames.
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
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
GNCA AI News Pipeline. Uses rssFeedRead, httpRequest, telegram, errorTrigger. Scheduled trigger; 29 nodes.