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 →
{
"id": "HFDPolling02",
"name": "HFD Direct Polling - JONI WhatsApp",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 2
}
]
}
},
"id": "node-schedule",
"name": "Every 2 Hours",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
300
]
},
{
"parameters": {
"jsCode": "const MONDAY_TOKEN = 'eyJhbGciOiJIUzI1NiJ9.eyJ0aWQiOjU1OTAyMjM2MiwiYWFpIjoxMSwidWlkIjo2Mzc3NjA5NywiaWFkIjoiMjAyNS0wOS0wN1QxNTowMToxNy4wMDBaIiwicGVyIjoibWU6d3JpdGUiLCJhY3RpZCI6MjQ1MzIyMjcsInJnbiI6ImV1YzEifQ.d86GOnxc-RhtZND7Q7LIoIg3ShFUW0xImLCVjRlzXHQ';\nconst BOARD_ID = 2131896795;\n\nasync function fetchPage(cursor) {\n const cursorPart = cursor ? `, cursor: \"${cursor}\"` : '';\n const query = `{ boards(ids: [${BOARD_ID}]) { items_page(limit: 500${cursorPart}) { cursor items { id name column_values { id text } } } } }`;\n const resp = await fetch('https://api.monday.com/v2', {\n method: 'POST',\n headers: { 'Authorization': MONDAY_TOKEN, 'Content-Type': 'application/json', 'API-Version': '2023-10' },\n body: JSON.stringify({ query })\n });\n return resp.json();\n}\n\nconst page1 = await fetchPage(null);\nconst page1Data = page1.data?.boards?.[0]?.items_page || {};\nconst items1 = page1Data.items || [];\nconst cursor = page1Data.cursor;\n\nlet items2 = [];\nif (cursor) {\n const page2 = await fetchPage(cursor);\n items2 = page2.data?.boards?.[0]?.items_page?.items || [];\n}\n\nreturn [{ json: { items: [...items1, ...items2] } }];"
},
"id": "node-get-monday",
"name": "Get All Monday Orders",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
460,
300
]
},
{
"parameters": {
"jsCode": "const items = $input.first().json.items || [];\nconst now = Date.now();\nconst MS_30_DAYS = 30 * 24 * 60 * 60 * 1000;\nconst MS_24_HOURS = 86400000;\n\nconst parseDate = (dateStr) => {\n if (!dateStr) return null;\n if (dateStr.includes('-') && dateStr.split('-')[0].length === 4) return new Date(dateStr);\n if (dateStr.includes('/')) {\n const [day, month, year] = dateStr.split('/');\n const y = year.length === 2 ? '20' + year : year;\n return new Date(`${y}-${month.padStart(2,'0')}-${day.padStart(2,'0')}`);\n }\n return null;\n};\n\nconst orders = [];\nfor (const item of items) {\n const cols = {};\n (item.column_values || []).forEach(c => { cols[c.id] = (c.text || '').trim(); });\n\n const d = parseDate(cols['date__1']);\n if (!d || isNaN(d.getTime())) continue;\n const age = now - d.getTime();\n if (age > MS_30_DAYS) continue;\n if (age < MS_24_HOURS) continue;\n\n const trackingNumber = (cols['text__1'] || '').replace(/\\s/g, '');\n if (!trackingNumber) continue;\n\n const phone = (cols['phone__1'] || '').replace(/[^0-9]/g, '');\n if (phone.length < 9) continue;\n\n if (item.name.match(/TEST/i)) continue;\n\n orders.push({ item_id: item.id, customer_name: item.name, tracking_number: trackingNumber, phone });\n}\n\nreturn orders.map(o => ({ json: o }));"
},
"id": "node-parse-orders",
"name": "Parse & Filter Orders",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
680,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://ws.hfd.co.il/Epost-Tracking/service.php",
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "client_id",
"value": "8260"
},
{
"name": "tracking_id",
"value": "={{ $json.tracking_number }}"
},
{
"name": "ref",
"value": "ALL"
},
{
"name": "lang",
"value": "he"
}
]
},
"options": {
"response": {
"response": {
"neverError": true,
"responseFormat": "text"
}
}
}
},
"id": "node-hfd-api",
"name": "HFD Status API",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
900,
300
]
},
{
"parameters": {
"jsCode": "const staticData = $getWorkflowStaticData('global');\nconst order = $('Parse & Filter Orders').item.json;\nconst tracking = order.tracking_number;\n\n// [1] TIME: only send 09:00-20:00 Israel time (UTC+3)\nconst israelHour = (new Date().getUTCHours() + 3) % 24;\nif (israelHour < 9 || israelHour >= 20) return [];\n\n// Get XML text\nconst xmlStr = (() => {\n const r = $input.first().json;\n if (typeof r === 'string') return r;\n if (typeof r.data === 'string') return r.data;\n if (typeof r.body === 'string') return r.body;\n return JSON.stringify(r);\n})();\n\nconst getTag = (str, tag) => {\n const m = str.match(new RegExp('<' + tag + '[^>]*>([\\\\s\\\\S]*?)<\\\\/' + tag + '>', 'i'));\n return m ? m[1].trim() : '';\n};\n\nconst note = getTag(xmlStr, 'note');\nif (note && (note.includes('error') || note.includes('Error'))) return [];\n\nconst shipStagesXml = getTag(xmlStr, 'ship_stages');\nif (!shipStagesXml) return [];\n\nconst stageMatches = [...shipStagesXml.matchAll(/<stage>([\\s\\S]*?)<\\/stage>/gi)];\nif (!stageMatches.length) return [];\n\nconst lastStageXml = stageMatches[stageMatches.length - 1][1];\nlet stageCode = getTag(lastStageXml, 'code');\nconst stageDesc = getTag(lastStageXml, 'description');\nconst stageDate = getTag(lastStageXml, 'date');\nconst stageTime = getTag(lastStageXml, 'time');\nconst regDateStr = getTag(xmlStr, 'reg_date');\n\nif (!stageCode) return [];\n\nconst SKIP_CODES = new Set(['4', '5', '6']);\nif (SKIP_CODES.has(stageCode)) return [];\n\n// [4] STUCK: in-transit more than 25 days\nconst TRANSIT_CODES = new Set(['10', '21', '103']);\nif (TRANSIT_CODES.has(stageCode) && regDateStr) {\n try {\n const [d, m, y] = regDateStr.trim().split('/');\n const regD = new Date('20' + y + '-' + m.padStart(2,'0') + '-' + d.padStart(2,'0'));\n const daysSince = Math.floor((Date.now() - regD.getTime()) / 86400000);\n if (daysSince > 25) {\n const stuckKey = tracking + '_stuck';\n if (staticData[stuckKey]) return [];\n staticData[stuckKey] = true;\n stageCode = 'STUCK';\n }\n } catch(e) {}\n}\n\n// [3] ONE MESSAGE PER STAGE\nif (stageCode === (staticData[tracking] || null)) return [];\nstaticData[tracking] = stageCode;\n\nreturn [{ json: {\n phone: order.phone,\n customer_name: order.customer_name,\n tracking_number: tracking,\n stage_code: stageCode,\n stage_date: stageDate,\n stage_time: stageTime\n}}];"
},
"id": "node-check-status",
"name": "Parse HFD & Status Changed?",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1120,
300
]
},
{
"parameters": {
"jsCode": "const { stage_code, stage_date, stage_time, phone, tracking_number, customer_name } = $input.first().json;\n\nconst warNotice = '\u05d1\u05e2\u05e7\u05d1\u05d5\u05ea \u05de\u05d1\u05e6\u05e2 \u05e9\u05d0\u05d2\u05ea \u05d4\u05d0\u05e8\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d9\u05dd \u05e2\u05d9\u05db\u05d5\u05d1\u05d9\u05dd \u05e7\u05dc\u05d9\u05dd \u05d1\u05de\u05e9\u05dc\u05d5\u05d7\u05d9\u05dd, \u05d0\u05e0\u05d7\u05e0\u05d5 \u05e2\u05dd \u05d9\u05d3 \u05e2\u05dc \u05d4\u05d3\u05d5\u05e4\u05e7 \u05d5\u05d1\u05d5\u05d3\u05e7\u05d9\u05dd \u05de\u05d4 \u05e2\u05dd \u05d4\u05de\u05e9\u05dc\u05d5\u05d7 \u05e9\u05dc\u05da \u05d1\u05db\u05dc \u05d9\u05d5\u05dd \u05d5\u05d9\u05d5\u05dd.\\n\u05e0\u05d0 \u05dc\u05d4\u05d9\u05d5\u05ea \u05e1\u05d1\u05dc\u05e0\u05d9\u05d9\u05dd \ud83d\ude4f';\n\nconst stageInfo = {\n '10': {\n headline: '\u05d1\u05d3\u05e8\u05db\u05d4 \u05dc\u05d0\u05e8\u05e5! \u2708\ufe0f',\n detail: '\u05d6\u05de\u05e0\u05d9 \u05d4\u05d0\u05e1\u05e4\u05e7\u05d4 \u05d4\u05dd 7-21 \u05d9\u05de\u05d9 \u05e2\u05e1\u05e7\u05d9\u05dd \u05de\u05e8\u05d2\u05e2 \u05e7\u05d1\u05dc\u05ea \u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e2\u05e7\u05d1, \u05d0\u05e0\u05d5 \u05e0\u05e2\u05d3\u05db\u05df \u05d0\u05d5\u05ea\u05db\u05dd \u05db\u05d0\u05df \u05d1\u05db\u05dc \u05e9\u05dc\u05d1 \u05d5\u05e9\u05dc\u05d1.'\n },\n '21': {\n headline: '\u05d1\u05d3\u05e8\u05db\u05d4 \u05dc\u05d0\u05e8\u05e5! \u2708\ufe0f',\n detail: '\u05d6\u05de\u05e0\u05d9 \u05d4\u05d0\u05e1\u05e4\u05e7\u05d4 \u05d4\u05dd 7-21 \u05d9\u05de\u05d9 \u05e2\u05e1\u05e7\u05d9\u05dd \u05de\u05e8\u05d2\u05e2 \u05e7\u05d1\u05dc\u05ea \u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e2\u05e7\u05d1, \u05d0\u05e0\u05d5 \u05e0\u05e2\u05d3\u05db\u05df \u05d0\u05d5\u05ea\u05db\u05dd \u05db\u05d0\u05df \u05d1\u05db\u05dc \u05e9\u05dc\u05d1 \u05d5\u05e9\u05dc\u05d1.'\n },\n '103': {\n headline: '\u05d1\u05d3\u05e8\u05db\u05d4 \u05dc\u05d0\u05e8\u05e5! \u2708\ufe0f',\n detail: '\u05d6\u05de\u05e0\u05d9 \u05d4\u05d0\u05e1\u05e4\u05e7\u05d4 \u05d4\u05dd 7-21 \u05d9\u05de\u05d9 \u05e2\u05e1\u05e7\u05d9\u05dd \u05de\u05e8\u05d2\u05e2 \u05e7\u05d1\u05dc\u05ea \u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e2\u05e7\u05d1, \u05d0\u05e0\u05d5 \u05e0\u05e2\u05d3\u05db\u05df \u05d0\u05d5\u05ea\u05db\u05dd \u05db\u05d0\u05df \u05d1\u05db\u05dc \u05e9\u05dc\u05d1 \u05d5\u05e9\u05dc\u05d1.'\n },\n '18': {\n headline: '\u05d4\u05d2\u05d9\u05e2\u05d4 \u05dc\u05d9\u05e9\u05e8\u05d0\u05dc! \ud83d\udec3',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05d4\u05d2\u05d9\u05e2\u05d4 \u05dc\u05d9\u05e9\u05e8\u05d0\u05dc \u05d5\u05e2\u05d5\u05d1\u05e8\u05ea \u05d1\u05d3\u05d9\u05e7\u05ea \u05de\u05db\u05e1.\\n\u05d1\u05d3\u05e8\u05da \u05db\u05dc\u05dc \u05dc\u05d5\u05e7\u05d7 2-5 \u05d9\u05de\u05d9 \u05e2\u05e1\u05e7\u05d9\u05dd.'\n },\n '13': {\n headline: '\u05e2\u05d1\u05e8\u05d4 \u05de\u05db\u05e1 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4! \u2705',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05e2\u05d1\u05e8\u05d4 \u05d0\u05ea \u05d4\u05de\u05db\u05e1 \u05d5\u05d1\u05d3\u05e8\u05db\u05d4 \u05dc\u05de\u05e8\u05db\u05d6 \u05de\u05d9\u05d5\u05df.'\n },\n '521': {\n headline: '\u05d1\u05de\u05e8\u05db\u05d6 \u05de\u05d9\u05d5\u05df \u05d1\u05d9\u05e9\u05e8\u05d0\u05dc \ud83d\udce6',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05d4\u05d2\u05d9\u05e2\u05d4 \u05dc\u05de\u05e8\u05db\u05d6 \u05d4\u05de\u05d9\u05d5\u05df \u2014 \u05d1\u05e7\u05e8\u05d5\u05d1 \u05ea\u05d9\u05e9\u05dc\u05d7 \u05dc\u05d0\u05d9\u05d6\u05d5\u05e8\u05da!'\n },\n '23': {\n headline: '\u05d1\u05d3\u05e8\u05da \u05d0\u05dc\u05d9\u05da \ud83d\ude9a',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05d0\u05e8\u05d5\u05d6\u05d4 \u05d5\u05de\u05d5\u05db\u05e0\u05d4 \u05dc\u05de\u05e1\u05d9\u05e8\u05d4.'\n },\n '48': {\n headline: '\u05d1\u05d3\u05e8\u05da \u05d0\u05dc\u05d9\u05da \ud83d\ude9a',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05d1\u05d3\u05e8\u05db\u05d4 \u05d0\u05dc\u05d9\u05da.'\n },\n '27': {\n headline: '\u05d9\u05d5\u05e6\u05d0\u05ea \u05dc\u05de\u05e1\u05d9\u05e8\u05d4 \u05e2\u05db\u05e9\u05d9\u05d5! \ud83d\ude9a',\n detail: '\u05d4\u05e9\u05dc\u05d9\u05d7 \u05d1\u05d3\u05e8\u05db\u05d5 \u05d0\u05dc\u05d9\u05da \u05d4\u05d9\u05d5\u05dd \u2014 \u05e9\u05de\u05d5\u05e8 \u05e2\u05dc \u05d4\u05d8\u05dc\u05e4\u05d5\u05df \u05e4\u05ea\u05d5\u05d7!'\n },\n '29': {\n headline: '\u05de\u05d7\u05db\u05d4 \u05dc\u05da \u05d1\u05e0\u05e7\u05d5\u05d3\u05ea \u05d7\u05dc\u05d5\u05e7\u05d4 \ud83d\udccd',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05de\u05d7\u05db\u05d4 \u05dc\u05d0\u05d9\u05e1\u05d5\u05e3 \u05d1\u05e0\u05e7\u05d5\u05d3\u05ea \u05d4\u05d7\u05dc\u05d5\u05e7\u05d4 \u05d4\u05e7\u05e8\u05d5\u05d1\u05d4 \u05d0\u05dc\u05d9\u05da.'\n },\n '429': {\n headline: '\u05de\u05d7\u05db\u05d4 \u05dc\u05da \u05d1\u05e0\u05e7\u05d5\u05d3\u05ea \u05d7\u05dc\u05d5\u05e7\u05d4 \ud83d\udccd',\n detail: '\u05d4\u05d7\u05d1\u05d9\u05dc\u05d4 \u05e9\u05dc\u05da \u05de\u05d7\u05db\u05d4 \u05dc\u05d0\u05d9\u05e1\u05d5\u05e3 \u05d1\u05e0\u05e7\u05d5\u05d3\u05ea \u05d4\u05d7\u05dc\u05d5\u05e7\u05d4 \u05d4\u05e7\u05e8\u05d5\u05d1\u05d4 \u05d0\u05dc\u05d9\u05da.'\n },\n '19': {\n headline: '\u05e2\u05d3\u05db\u05d5\u05df \u05e4\u05e8\u05d8\u05d9 \u05de\u05e9\u05dc\u05d5\u05d7 \ud83d\udcdd',\n detail: '\u05d1\u05d5\u05e6\u05e2 \u05e2\u05d3\u05db\u05d5\u05df \u05db\u05ea\u05d5\u05d1\u05ea/\u05e4\u05e8\u05d8\u05d9\u05dd \u05dc\u05d4\u05d6\u05de\u05e0\u05d4 \u05e9\u05dc\u05da.'\n },\n '99': {\n headline: '\u05e0\u05de\u05e1\u05e8\u05d4! \ud83c\udf89',\n detail: '\u05d4\u05d4\u05d6\u05de\u05e0\u05d4 \u05e9\u05dc\u05da \u05e0\u05de\u05e1\u05e8\u05d4 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4!\\n\u05e0\u05e9\u05de\u05d7 \u05dc\u05e9\u05de\u05d5\u05e2 \u05e9\u05d4\u05d2\u05d9\u05e2\u05d4 \u2014 \u05ea\u05d4\u05e0\u05d4 \u05de\u05d4\u05de\u05d5\u05e6\u05e8! \u26bd'\n },\n 'STUCK': {\n headline: '\u05e2\u05d3\u05db\u05d5\u05df \u05e2\u05dc \u05d4\u05d4\u05d6\u05de\u05e0\u05d4 \u05e9\u05dc\u05da \u23f3',\n detail: '\u05d4\u05d4\u05d6\u05de\u05e0\u05d4 \u05e9\u05dc\u05da \u05de\u05ea\u05e2\u05db\u05d1\u05ea \u05de\u05e2\u05d8 \u05d9\u05d5\u05ea\u05e8 \u05de\u05d4\u05e6\u05e4\u05d5\u05d9.\\n\u05d0\u05e0\u05d7\u05e0\u05d5 \u05d1\u05d5\u05d3\u05e7\u05d9\u05dd \u05de\u05d4 \u05e7\u05d5\u05e8\u05d4 \u05d5\u05e0\u05d7\u05d6\u05d5\u05e8 \u05d0\u05dc\u05d9\u05da \u05d1\u05d4\u05e7\u05d3\u05dd.\\n\u05de\u05ea\u05e0\u05e6\u05dc\u05d9\u05dd \u05e2\u05dc \u05d4\u05d0\u05d9\u05d7\u05d5\u05e8 \ud83d\ude4f'\n }\n};\n\nconst info = stageInfo[stage_code];\nif (!info) return [];\n\nconst REALTIME_CODES = new Set(['18','13','521','23','27','29','429','48','99','19']);\nlet dateLine = '';\nif (stage_date && REALTIME_CODES.has(stage_code)) {\n dateLine = '\\n\u05e2\u05d3\u05db\u05d5\u05df \u05d0\u05d7\u05e8\u05d5\u05df: ' + stage_date + (stage_time ? ' ' + stage_time : '');\n}\n\nconst firstName = (customer_name || '').split(' ')[0];\nconst greeting = firstName ? '\u05e9\u05dc\u05d5\u05dd ' + firstName + '! \ud83d\udc4b\\n\\n' : '';\n\nconst war = (stage_code !== '99') ? '\\n\\n' + warNotice : '';\nconst trackingLink = '\\n\\n\ud83d\udd0d *\u05dc\u05de\u05e2\u05e7\u05d1 \u05e2\u05e6\u05de\u05d0\u05d9 \u05d1\u05db\u05dc \u05e8\u05d2\u05e2:* https://www.hfd.co.il/\u05d0\u05d9\u05ea\u05d5\u05e8-\u05d7\u05d1\u05d9\u05dc\u05d4/\\n_(\u05d9\u05e9 \u05dc\u05d4\u05e7\u05dc\u05d9\u05d3 \u05d0\u05ea \u05de\u05e1\u05e4\u05e8 \u05d4\u05de\u05e2\u05e7\u05d1 \u05d9\u05d3\u05e0\u05d9\u05ea)_;\n\nconst message = '*\u05e2\u05d3\u05db\u05d5\u05df \u05de\u05e9\u05dc\u05d5\u05d7 | OneZone* \ud83c\udfc6\\n\\n' + greeting + '*\u05e1\u05d8\u05d8\u05d5\u05e1:* ' + info.headline + '\\n\\n' + info.detail + dateLine + war + '\\n\\n*\u05de\u05e1\\u05f3 \u05de\u05e2\u05e7\u05d1:* ' + tracking_number + trackingLink + '\\n\\n_\u05dc\u05d4\u05e4\u05e1\u05e7\u05ea \u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd \u05e9\u05dc\u05d7 STOP_';\n\nreturn [{ json: { phone, message } }];"
},
"id": "node-format-message",
"name": "Format Hebrew Message",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1340,
300
]
},
{
"parameters": {
"amount": 105,
"unit": "seconds"
},
"id": "node-wait",
"name": "Wait 105s",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1560,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://joni-e746b-default-rtdb.europe-west1.firebasedatabase.app//joni/send.json",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "={{ JSON.stringify({ to: $json.phone, text: $json.message }) }}",
"options": {}
},
"id": "node-send-joni",
"name": "Send via JONI",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1780,
300
]
}
],
"connections": {
"Every 2 Hours": {
"main": [
[
{
"node": "Get All Monday Orders",
"type": "main",
"index": 0
}
]
]
},
"Get All Monday Orders": {
"main": [
[
{
"node": "Parse & Filter Orders",
"type": "main",
"index": 0
}
]
]
},
"Parse & Filter Orders": {
"main": [
[
{
"node": "HFD Status API",
"type": "main",
"index": 0
}
]
]
},
"HFD Status API": {
"main": [
[
{
"node": "Parse HFD & Status Changed?",
"type": "main",
"index": 0
}
]
]
},
"Parse HFD & Status Changed?": {
"main": [
[
{
"node": "Format Hebrew Message",
"type": "main",
"index": 0
}
]
]
},
"Format Hebrew Message": {
"main": [
[
{
"node": "Wait 34s",
"type": "main",
"index": 0
}
]
]
},
"Wait 34s": {
"main": [
[
{
"node": "Send via JONI",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveStaticData": true
},
"staticData": null,
"meta": {
"templateCredsSetupCompleted": true
},
"versionId": "1",
"triggerCount": 0,
"active": false
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
HFD Direct Polling - JONI WhatsApp. Uses httpRequest. Scheduled trigger; 8 nodes.
Source: https://github.com/mirrorframestudio/amit-projects/blob/caed3818fa157d3059c4a053cd67b8caa8fb90d2/n8n/hfd-polling.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.
Auto Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.
Auto-Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.
debug. Uses httpRequest, slack, redis, mailgun. Scheduled trigger; 60 nodes.
Seller Follow-Up Engine (Enhanced). Uses httpRequest, slack. Scheduled trigger; 44 nodes.
This workflow runs daily at 9 AM, uses Perplexity to compile vaping industry news, optionally captures article screenshots via Browserless, and generates a HeyGen avatar video from a template. It then