AutomationFlowsData & Sheets › Hour Follow-up

Hour Follow-up

03 - 48-Hour Follow-up. Uses googleSheets, httpRequest. Scheduled trigger; 4 nodes.

Cron / scheduled trigger★★★★☆ complexity4 nodesGoogle SheetsHTTP Request
Data & Sheets Trigger: Cron / scheduled Nodes: 4 Complexity: ★★★★☆ Added:

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "03 - 48-Hour Follow-up",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "minutesInterval": 60
            }
          ]
        }
      },
      "id": "schedule-trigger",
      "name": "Hourly Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "operation": "getAll",
        "documentId": {
          "value": "={{ $env.GOOGLE_SHEETS_ID }}"
        },
        "sheetName": {
          "value": "Leads"
        },
        "filters": {}
      },
      "id": "get-all-leads",
      "name": "Get All Leads",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Filter leads that have been silent for 48 hours and are Warm or Hot\nconst now = Date.now();\nconst fortyEightHours = 48 * 60 * 60 * 1000;\nconst items = $input.all();\n\nconst staleLeads = items.filter(item => {\n  const leadStatus = item.json['Lead Status'];\n  const lastUpdated = item.json['Last Updated'];\n  const phoneNumber = item.json['Phone Number'];\n  const leadScore = item.json['Lead Score'];\n\n  if (!lastUpdated || !phoneNumber) return false;\n  if (leadStatus === 'Enrolled' || leadStatus === 'Lost') return false;\n  if (!['Hot', 'Warm'].includes(leadScore)) return false;\n\n  const lastUpdateTs = new Date(lastUpdated).getTime();\n  const ageMs = now - lastUpdateTs;\n  return ageMs >= fortyEightHours && ageMs < (fortyEightHours + 3600000);\n});\n\nreturn staleLeads;"
      },
      "id": "filter-stale",
      "name": "Filter 48-Hour Silent Leads",
      "type": "n8n-nodes-base.code",
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "url": "=https://graph.facebook.com/v19.0/{{ $env.WHATSAPP_PHONE_NUMBER_ID }}/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.WHATSAPP_ACCESS_TOKEN }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "body": "={\n  \"messaging_product\": \"whatsapp\",\n  \"to\": \"{{ $json['Phone Number'].replace('+','') }}\",\n  \"type\": \"text\",\n  \"text\": {\n    \"body\": \"Hi{{ $json['Student Name'] ? ' ' + $json['Student Name'] : '' }}! \ud83d\udc4b This is AdmitBot from IIST.\\n\\nWe noticed you enquired about admissions recently. Seats are filling up fast! \ud83c\udf93\\n\\nApplication deadline: *June 30, 2026*\\n\\nWould you like to know more or speak with a counsellor? Just reply! \ud83d\ude0a\"\n  }\n}"
      },
      "id": "send-followup",
      "name": "Send Follow-up Message",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        900,
        300
      ]
    }
  ],
  "connections": {
    "Hourly Schedule": {
      "main": [
        [
          {
            "node": "Get All Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get All Leads": {
      "main": [
        [
          {
            "node": "Filter 48-Hour Silent Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter 48-Hour Silent Leads": {
      "main": [
        [
          {
            "node": "Send Follow-up Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "tags": [
    "admitbot",
    "phase-2"
  ]
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

03 - 48-Hour Follow-up. Uses googleSheets, httpRequest. Scheduled trigger; 4 nodes.

Source: https://github.com/anshika-codes-AI/IIST-AdmitBot/blob/d62fdcdd848b062920b1787d81ac106df7797652/n8n-workflows/03-48hr-followup.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Complaint Triage Orchestrator (S2.3). Uses httpRequest, googleSheets. Scheduled trigger; 65 nodes.

HTTP Request, Google Sheets
Data & Sheets

This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo

Google Sheets, HTTP Request, Form Trigger +2
Data & Sheets

YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.

Google Sheets, Google Sheets Tool, HTTP Request +1
Data & Sheets

This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev

Google Calendar, Google Sheets, HTTP Request +1
Data & Sheets

ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.

Start, HTTP Request, Function Item +3