AutomationFlowsGeneral › Automated Work Attendance via Webhook

Automated Work Attendance via Webhook

Original n8n title: Automated Work Attendance with Location Triggers

Automated Work Attendance with Location Triggers. Uses stickyNote, googleDrive, googleSheets. Webhook trigger; 10 nodes.

Webhook trigger★★★★☆ complexity10 nodesGoogle DriveGoogle Sheets
General Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ Added:

This workflow follows the Google Drive → Google Sheets 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
{
  "id": "x2kgOnBLtqAjqUVS",
  "name": "Automated Work Attendance with Location Triggers",
  "tags": [],
  "nodes": [
    {
      "id": "b2cba308-6d47-432b-9296-58f233f15565",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        0
      ],
      "parameters": {
        "path": "time-track",
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "67354f1c-9dac-4edd-b07d-f1b0dbd80159",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -260
      ],
      "parameters": {
        "width": 1120,
        "height": 180,
        "content": "## Check if the Worksheet Exists"
      },
      "typeVersion": 1
    },
    {
      "id": "5fc5a1a6-f18d-4ee0-a70b-30de48a45dc7",
      "name": "Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        220,
        -220
      ],
      "parameters": {
        "filter": {},
        "options": {},
        "resource": "fileFolder",
        "returnAll": true,
        "queryString": "WorkTimeTracking"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "typeVersion": 3,
      "alwaysOutputData": true
    },
    {
      "id": "a0b63be4-fa46-413f-82fe-42e6edc24f29",
      "name": "Create Worksheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        800,
        -240
      ],
      "parameters": {
        "title": "WorkTimeTracking",
        "options": {
          "locale": ""
        },
        "resource": "spreadsheet",
        "sheetsUi": {
          "sheetValues": [
            {
              "title": "Worklog"
            }
          ]
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "796e3ef6-3002-493e-8d89-10cba2d8026d",
      "name": "Return if Null",
      "type": "n8n-nodes-base.code",
      "position": [
        400,
        -220
      ],
      "parameters": {
        "jsCode": "return [{json: {empty: items.length == 1 && Object.keys(items[0].json).length == 0}}];"
      },
      "typeVersion": 2
    },
    {
      "id": "7af7ce4b-93e0-4058-8a45-9fd8269ddc77",
      "name": "Doesn't exist?",
      "type": "n8n-nodes-base.if",
      "position": [
        580,
        -220
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "215b8ced-c6f5-4cf2-8755-9bba928dbe84",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{$json[\"empty\"]}}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f2bc21c6-805b-49e7-b026-a4de56dce1fa",
      "name": "Set Logging Details",
      "type": "n8n-nodes-base.set",
      "position": [
        780,
        20
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"Date\": \"{{ $now.format('yyyy-MM-dd') }}\",\n  \"Time\": \"{{ $now.format('hh:mm') }}\",\n  \"Direction\":\"Check-In\"\n}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "64bc8b93-a925-49d6-9e52-3f30f0c9e5a8",
      "name": "Create Log",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1000,
        20
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.Date }}",
            "Time": "={{ $json.Time }}",
            "Direction": "={{ $('Webhook').item.json.headers.direction ? $('Webhook').item.json.headers.direction : \"\"}}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Time",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Direction",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Direction",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 308318361,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1P7-Uqa4SPA6keujkkOTru1wdS2qDryJVkz0Nz_sFp7A/edit#gid=308318361",
          "cachedResultName": "Worklog"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Google Drive').item.json.id }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "cabca7d5-b4ae-45db-904d-f8efb37c4ab2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        660,
        -40
      ],
      "parameters": {
        "width": 600,
        "height": 280,
        "content": "## Log Check-In or Check-Out"
      },
      "typeVersion": 1
    },
    {
      "id": "5b9505fc-71a4-42c1-805f-c363384b4c8a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -440,
        -320
      ],
      "parameters": {
        "color": 3,
        "width": 380,
        "height": 640,
        "content": "## Location-Based Time Tracking\n\nThis automation streamlines your time tracking by using location triggers. Here's how it works:\n\nCreate two shortcuts in the iPhone Shortcuts app:\n\nName one \"Check-In\" and the other \"Check-Out.\"\nWithin each shortcut, use the \"Get Content from URL\" action to call the Webhook. Set the Header Direction for \"Check-In\" or \"Check-Out\"\n\n\nNow, whenever you enter or exit the specified location, your iPhone will automatically record the time in your Google Sheet. This creates a seamless and accurate log of your work hours or time spent at a particular place."
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "timezone": "Europe/Lisbon",
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1",
    "executionTimeout": -1,
    "saveManualExecutions": true
  },
  "versionId": "2de5264f-eb68-4919-a3f3-133a8ceb45bb",
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive": {
      "main": [
        [
          {
            "node": "Return if Null",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Doesn't exist?": {
      "main": [
        [
          {
            "node": "Create Worksheet",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Logging Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Return if Null": {
      "main": [
        [
          {
            "node": "Doesn't exist?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Worksheet": {
      "main": [
        [
          {
            "node": "Set Logging Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Logging Details": {
      "main": [
        [
          {
            "node": "Create Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

How this works

This workflow automates work attendance logging by triggering entries whenever an employee enters or leaves the office, using location-based signals to ensure accurate records without manual input. It's ideal for team leads or HR managers in small to medium businesses seeking to streamline compliance and productivity tracking, saving hours on administrative tasks each week. The key step involves a webhook capturing location data, which then populates a Google Sheet via Google Drive integration for real-time updates and easy reporting.

Use this workflow for routine office attendance in hybrid teams where geofencing via mobile apps provides reliable triggers, or to monitor remote workers' site visits. Avoid it for fully remote setups without location hardware, as false positives from imprecise signals could skew data. Common variations include adding email notifications for absences or integrating with Slack for instant alerts on late arrivals.

About this workflow

Automated Work Attendance with Location Triggers. Uses stickyNote, googleDrive, googleSheets. Webhook trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

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

General

Line Save File to Google Drive and Log File's URL. Uses googleSheets, googleDrive, httpRequest, stickyNote. Webhook trigger; 27 nodes.

Google Sheets, Google Drive, HTTP Request
General

LINE BOT - Google Sheets Record Receipt. Uses stickyNote, httpRequest, googleDrive, googleSheets. Webhook trigger; 12 nodes.

HTTP Request, Google Drive, Google Sheets
General

Unique QRcode coupon assignment and validation for Lead Generation system. Uses httpRequest, formTrigger, googleSheets, stickyNote. Webhook trigger; 29 nodes.

HTTP Request, Form Trigger, Google Sheets +1
General

AutoQoutesV2_template. Uses manualTrigger, httpRequest, stickyNote, googleSheets. Event-driven trigger; 28 nodes.

HTTP Request, Google Sheets, Google Drive +2
General

AutoClip – Automatically Generate Video Clips and Upload to YouTube. Uses manualTrigger, googleSheets, googleDrive, stickyNote. Event-driven trigger; 23 nodes.

Google Sheets, Google Drive, Read Write File +2