Leave requests approved on Telegram
Employees fill in a leave form; the manager approves or rejects it with one tap on Telegram, and the employee gets an email.
How it works
Trigger: Google Sheets — a new leave form response
- An employee submits the Google Form (name, email, dates, type, reason).
- The manager gets a Telegram message with Approve and Reject buttons.
- The decision is written back to the sheet.
- The employee gets an email with the decision.
Diagram
Trigger App Logic
Build it
Pick your tool — same automation, step by step.
Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder.
Show code (240 lines)
{
"name": "Leave requests approved on Telegram (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## Leave requests approved on Telegram\nEmployees fill in a leave form; the manager approves or rejects it with one tap on Telegram, and the employee gets an email.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Form Responses 1",
"mode": "name"
},
"event": "rowAdded",
"options": {}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "New leave request",
"type": "n8n-nodes-base.googleSheetsTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"operation": "sendAndWait",
"chatId": "YOUR_MANAGER_CHAT_ID",
"message": "=Leave request from {{ $json.Name }}\nType: {{ $json.Type }}\nFrom {{ $json.From }} to {{ $json.To }}\nReason: {{ $json.Reason || '-' }}",
"approvalOptions": {
"values": {
"approvalType": "double",
"approveLabel": "Approve",
"disapproveLabel": "Reject"
}
},
"options": {}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Ask manager",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
300,
0
]
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Form Responses 1",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Timestamp": "={{ $('New leave request').item.json.Timestamp }}",
"Status": "={{ $json.data.approved ? 'Approved' : 'Rejected' }}"
},
"matchingColumns": [
"Timestamp"
]
},
"options": {}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Save decision",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
600,
0
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $('Ask manager').item.json.data.approved }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Approved?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
900,
0
]
},
{
"parameters": {
"sendTo": "={{ $('New leave request').item.json.Email }}",
"subject": "Your leave request is approved",
"emailType": "text",
"message": "=Hi {{ $('New leave request').item.json.Name }},\n\nYour {{ $('New leave request').item.json.Type }} leave from {{ $('New leave request').item.json.From }} to {{ $('New leave request').item.json.To }} is approved.\n\nYOUR_COMPANY HR",
"options": {
"appendAttribution": false
}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Email: approved",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1200,
0
]
},
{
"parameters": {
"sendTo": "={{ $('New leave request').item.json.Email }}",
"subject": "About your leave request",
"emailType": "text",
"message": "=Hi {{ $('New leave request').item.json.Name }},\n\nYour leave request from {{ $('New leave request').item.json.From }} to {{ $('New leave request').item.json.To }} wasn't approved this time. Your manager will talk to you about other dates.\n\nYOUR_COMPANY HR",
"options": {
"appendAttribution": false
}
},
"id": "310bce97-ca1c-4cff-a022-99304c58f5dc",
"name": "Email: not approved",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1200,
220
]
}
],
"connections": {
"New leave request": {
"main": [
[
{
"node": "Ask manager",
"type": "main",
"index": 0
}
]
]
},
"Ask manager": {
"main": [
[
{
"node": "Save decision",
"type": "main",
"index": 0
}
]
]
},
"Save decision": {
"main": [
[
{
"node": "Approved?",
"type": "main",
"index": 0
}
]
]
},
"Approved?": {
"main": [
[
{
"node": "Email: approved",
"type": "main",
"index": 0
}
],
[
{
"node": "Email: not approved",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}In Make, create a new scenario and add these modules in order:
- Google Sheets › Watch New Rows
- Telegram Bot › Send a Text Message with Approve / Reject buttons, then Watch Updates (callback query) in a second scenario
- Google Sheets › Update a Row
- Router with two routes: “Approved?” (yes / no filters)
- If yesGmail › Send an Email
- If noGmail › Send an Email
- Every module run uses Make operations — the free plan includes a monthly quota.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Google Sheets — New Spreadsheet Row
- Human in the Loop by Zapier — Request Approval (then Telegram — Send Message)
- Google Sheets — Update Spreadsheet Row
- Paths by Zapier: “Approved?” (yes / no)
- If yesGmail — Send Email
- If noGmail — Send Email
- Zaps with more than two steps need a paid Zapier plan.
- Webhooks, Filters/Paths and Code by Zapier are premium features on some Zapier plans.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Add a Google Calendar step on the approved branch to put the leave on the team calendar.
Related flows
ProductivityEasy
Email me when a Google Sheet gets a new row
Get an email with the details every time a new row is added to a sheet.
Google Sheets → Gmail2h/mo
ProductivityEasy
Evening digest of unread emails on Telegram
Every evening, get a list of today's unread emails (sender and subject) on Telegram, so nothing important is missed.
Gmail → Telegram2h/mo
ProductivityEasy
Your daily agenda on Telegram
Every morning, today's calendar events arrive as one neat Telegram message.
Google Calendar → Telegram2h/mo