n8n Project Management System for Construction
Build a universal task management and reporting system for construction projects using n8n automation, Telegram bot, and Google Sheets.
Business Case
Problem: Construction managers spend 2-3 hours daily on:
- Distributing tasks to foremen and workers
- Collecting progress updates via calls/messages
- Compiling photo documentation
- Tracking task completion status
Solution: Automated system that:
- Sends task reminders via Telegram at scheduled times
- Collects status reports (text + photos + GPS)
- Auto-saves all data to Google Sheets
- Provides real-time visibility to managers
ROI: 70% reduction in administrative time for task management
Source Repository
https://github.com/datadrivenconstruction/Project-management-n8n-with-task-management-and-photo-reports
System Architecture
┌──────────────────────────────────────────────────────────────────────┐
│ PROJECT MANAGEMENT SYSTEM │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ MANAGER WORKER │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Google │ │ Telegram │ │
│ │ Sheets │ │ Bot │ │
│ │ │ │ │ │
│ │ • Tasks │ n8n │ • /start │ │
│ │ • Schedule │◄──Workflow──────►│ • Tasks │ │
│ │ • Reports │ │ • Photos │ │
│ │ • Photos │ │ • GPS │ │
│ └─────────────┘ └─────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Dashboard │ │ Google │ │
│ │ View │ │ Drive │ │
│ │ │ │ (Photos) │ │
│ └─────────────┘ └─────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────┘
Implementation Guide
Step 1: Create Telegram Bot
# 1. Open @BotFather in Telegram
# 2. Send /newbot
# 3. Name: "YourProject Tasks Bot"
# 4. Username: "YourProjectTasks_bot"
# 5. Save the token: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz
# Test bot connection
import requests
BOT_TOKEN = "YOUR_BOT_TOKEN"
response = requests.get(f"https://api.telegram.org/bot{BOT_TOKEN}/getMe")
print(response.json())
# Expected: {"ok": true, "result": {"id": ..., "first_name": "YourProject Tasks Bot"}}
Step 2: Setup Google Sheets
Create spreadsheet with these sheets:
Sheet 1: Tasks | Column | Type | Description | |--------|------|-------------| | Task_ID | Text | Unique identifier (TASK-001) | | Project | Text | Project name | | Object | Text | Building/area | | Section | Text | Floor/zone | | Task | Text | Task description | | Executor | Text | Assigned worker name | | Executor_ID | Number | Telegram user ID | | Date | Date | Due date (DD.MM.YYYY) | | Send_Time | Time | Reminder time | | Priority | Text | 🔴High / 🟡Medium / 🟢Low | | Status | Text | Pending/Sent/Completed/Partial | | Response | Text | Worker's response | | Response_Time | DateTime | When responded | | Photo_Link | URL | Google Drive link | | GPS_Lat | Number | Latitude | | GPS_Lon | Number | Longitude |
Sheet 2: Workers | Column | Type | Description | |--------|------|-------------| | Name | Text | Worker full name | | Role | Text | Foreman/Worker/Contractor | | Telegram_ID | Number | User ID from /start | | Phone | Text | Phone number | | Registered | DateTime | Registration date |
Sheet 3: Photo Reports | Column | Type | Description | |--------|------|-------------| | Report_ID | Text | Unique ID | | Report_Type | Text | Daily/Safety/Quality | | Executor | Text | Who should submit | | Date | Date | Report date | | Time | Time | Deadline | | Status | Text | Pending/Submitted | | Photo_Link | URL | Drive folder link | | Comment | Text | Worker comment |
Step 3: Import n8n Workflow
// Core workflow structure (simplified)
{
"nodes": [
{
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"parameters": {
"updates": ["message", "callback_query"]
}
},
{
"name": "Route Messages",
"type": "n8n-nodes-base.switch",
"parameters": {
"rules": [
{"value": "/start"},
{"value": "/status"},
{"value": "/help"},
{"value": "text_reply"},
{"value": "photo"},
{"value": "location"}
]
}
},
{
"name": "Check Tasks Schedule",
"type": "n8n-nodes-base.cron",
"parameters": {
"cronExpression": "* * * * *"
}
},
{
"name": "Get Pending Tasks",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "readRows",
"sheetName": "Tasks",
"filters": {
"Status": "Pending",
"Send_Time": "now"
}
}
},
{
"name": "Send Task Reminder",
"type": "n8n-nodes-base.telegram",
"parameters": {
"operation": "sendMessage",
"chatId": "={{$json.Executor_ID}}",
"text": "📋 *Задача: {{$json.Task}}*\n📍 Объект: {{$json.Object}}\n⏰ Срок: {{$json.Date}}\n{{$json.Priority}}"
}
}
]
}
Step 4: Configure Webhook
# Set Telegram webhook to n8n
curl -X POST "https://api.telegram.org/bot${BOT_TOKEN}/setWebhook" \
-d "url=https://your-n8n-instance.com/webhook/telegram-project-manager"
# Verify webhook is set
curl "https://api.telegram.org/bot${BOT_TOKEN}/getWebhookInfo"
Worker Commands
Registration: /start
User: /start
Bot: 👋 Добро пожаловать в систему управления задачами!
Пожалуйста, укажите ваше имя:
User: Иван Петров
Bot: Выберите вашу роль:
[Прораб] [Рабочий] [Субподрядчик]
User: [Прораб]
Bot: ✅ Регистрация завершена!
Имя: Иван Петров
Роль: Прораб
ID: 123456789
Вы будете получать задачи автоматически.
Используйте /help для справки.
Receiving Task
Bot: 📋 *ЗАДАЧА #TASK-047*
━━━━━━━━━━━━━━━━━━━━━
📍 Объект: ЖК Солнечный, Корпус 2
🏗 Секция: 5 этаж, кв. 51-55
📝 Задача: Монтаж электропроводки
⏰ Срок: 24.01.2026
🔴 Приоритет: Высокий
━━━━━━━━━━━━━━━━━━━━━
Ответьте на это сообщение для отчета:
• Текст: статус + комментарий
• Фото: прикрепите фото работ
• GPS: отправьте геолокацию
Task Response
User: (reply to task message)
выполнено
Проводка смонтирована по всем квартирам, ждем приемку
Bot: ✅ Отчет принят!
━━━━━━━━━━━━━━━━━━━━━
📋 Задача: #TASK-047
📊 Статус: Выполнено
💬 Комментарий: Проводка смонтирована...
⏰ Время: 24.01.2026 14:35
━━━━━━━━━━━━━━━━━━━━━
Photo Report
User: (sends photo as reply to task)
[Photo of completed electrical work]
Caption: Монтаж завершен, готово к проверке
Bot: 📷 Фото получено и сохранено!
━━━━━━━━━━━━━━━━━━━━━
📋 Задача: #TASK-047
🔗 Фото: [Ссылка на Google Drive]
💬 Комментарий: Монтаж завершен...
⏰ Время: 24.01.2026 14:38
━━━━━━━━━━━━━━━━━━━━━
GPS Location
User: (sends location)
📍 [Location: 55.7558, 37.6173]
Bot: 📍 Геолокация получена!
━━━━━━━━━━━━━━━━━━━━━
📋 Задача: #TASK-047
🗺 Координаты: 55.7558, 37.6173
🔗 Карта: [Google Maps Link]
⏰ Время: 24.01.2026 14:40
━━━━━━━━━━━━━━━━━━━━━
Manager Dashboard
Google Sheets View
┌─────────────────────────────────────────────────────────────────────