📚 Повна документація системи
Це повний технічний опис HR Integration System з деталями реалізації всіх компонентів.
Загальний огляд
HR Integration System - це комплексне рішення для автоматизації HR-процесів, яке об'єднує 4 ключові платформи:
TeamTailor
Applicant Tracking System для управління кандидатами
BambooHR
HR Information System для управління персоналом
Notion
База знань та центр управління HR-процесами
Slack
Миттєві повідомлення про всі важливі події
Ключові проблеми, які вирішує система
- ❌ Було: Потрійне введення однакових даних в різні системи
- ✅ Стало: Єдине джерело правди з автоматичною синхронізацією
- ❌ Було: 45-60 хвилин на один процес найму
- ✅ Стало: 5-7 хвилин завдяки автоматизації
- ❌ Було: Постійні розбіжності між системами
- ✅ Стало: 100% консистентність даних
💰 Бізнес-цінність
Економія часу
Економія 85% часу HR-менеджера на кожному процесі
Зменшення помилок
На 80% менше помилок при введенні даних
ROI проекту
- 20+ годин економії щотижня
- Онбординг з 3 днів до 1 дня
- Усунення дублювання даних
🏗️ Архітектура системи
Компоненти системи
n8n - Серце автоматизації
Платформа workflow автоматизації, яка керує всіма інтеграціями:
- Виконує API запити між системами
- Трансформує дані між різними форматами
- Обробляє webhook події
- Керує розкладом синхронізацій
Технічний стек
{
"automation": "n8n Cloud",
"languages": ["JavaScript", "Python"],
"apis": {
"teamtailor": "REST API (JSON:API spec)",
"bamboohr": "REST API (XML/JSON)",
"notion": "REST API v2",
"slack": "Webhook API"
},
"hosting": "viragamesinc.app.n8n.cloud",
"version": "1.0.0"
}
🔄 Потік даних
Ініціація процесу
Менеджер виконує дію в одній з систем (наприклад, переводить кандидата на статус "Hired")
Тригер автоматизації
n8n отримує webhook або запускається по розкладу
Збір даних
Система збирає всю необхідну інформацію через API запити
Трансформація
Дані перетворюються у формат цільової системи
Синхронізація
Оновлення всіх пов'язаних систем
Повідомлення
Slack notification про успішне виконання або помилки
📋 Сценарій 1: Синхронізація департаментів та ролей
Мета сценарію
Ручний запуск / РозкладЗабезпечити однакову організаційну структуру в Notion та TeamTailor для уникнення розбіжностей.
Детальний процес
1. Завантаження даних
Паралельне завантаження з двох систем:
- TeamTailor: Всі департаменти через пагіновані запити (30 записів/сторінка)
- Notion: Тільки верифіковані департаменти зі статусом "Verified"
n8n автоматично обробляє всі сторінки пагінації до повного завантаження
2. Порівняння та аналіз
Інтелектуальне порівняння структур:
- Департаменти тільки в Notion → потребують створення в TeamTailor
- Департаменти тільки в TeamTailor → додаються до Notion
- Спільні департаменти → синхронізація ID між системами
3. Синхронізація
Автоматичне створення та оновлення:
- Створення відсутніх департаментів в TeamTailor через API
- Збереження TeamTailor ID в Notion для майбутніх операцій
- Оновлення метаданих та timestamp останньої синхронізації
Процес повністю автоматичний, втручання не потрібне
Результати
- Повна синхронізація організаційної структури
- Збереження TeamTailor ID в Notion
- Slack повідомлення про результати
📝 Сценарій 2: Створення вакансій (Job Requisitions)
Мета сценарію
Автоматичний тригерАвтоматичне створення requisition в TeamTailor при створенні запиту в Notion.
Процес створення вакансії
1. Тригер з Notion
Менеджер створює новий запис в таблиці "Job Requisitions" в Notion з усіма необхідними полями:
- Назва позиції
- Департамент (верифікований)
- Hiring Manager
- Зарплатна вилка
- Опис вакансії
2. Валідація даних
Автоматична перевірка:
- Наявність всіх обов'язкових полів
- Верифікація департаменту в системі
- Перевірка існування hiring manager в TeamTailor
- Валідація зарплатної вилки
При невідповідності - процес зупиняється з повідомленням про помилку
3. Створення requisition
API endpoint: /api/v1/job-requisitions
n8n формує та відправляє структурований запит з:
- Повною інформацією про позицію
- Зарплатною вилкою та умовами
- Прив'язкою до департаменту та hiring manager
- Статусом "open" для активації вакансії
TeamTailor повертає унікальний requisition ID для подальшого трекінгу
4. Оновлення статусу
- Збереження TeamTailor requisition ID в Notion
- Зміна статусу на "Synced"
- Додавання timestamp синхронізації
- Slack повідомлення з посиланням на вакансію
API-створені requisitions не проходять через approval flow (TeamTailor каже це "expected behavior").
Як це вирішено:
- ✅ n8n створює requisition через API
- 📱 Автоматично відправляється Slack повідомлення рекрутеру
- 👤 Рекрутер заходить в TeamTailor та вручну встановлює approval flow
- ⏱️ Займає додаткові 2-3 хвилини
👤 Сценарій 3: Створення співробітника при наймі
Мета сценарію
Webhook тригерАвтоматичне створення профілю співробітника в BambooHR при наймі кандидата в TeamTailor.
Еволюція рішення
Спроба 1: /uploads endpoint
❌ API не дає доступ до файлів
15+ годин дослідженьСпроба 2: Resume атрибути
⚠️ S3 URLs діють лише 1 хвилину
10+ годин дослідженьФінальне рішення
✅ Автоматизація даних + ручні документи
Оптимальний балансРобочий процес
1. Webhook від TeamTailor
Event trigger: candidate.hired
Webhook автоматично активується при переведенні кандидата на статус "Hired"
Містить candidate ID для подальшого збору даних
2. Збір даних з offer
API endpoint: /api/v1/job-offers з пагінацією (30 записів/сторінка)
Витягуються критичні дані:
- Зарплата та період оплати
- Дата початку роботи
- Позиція та департамент
3. Створення в BambooHR
API endpoint: /api/gateway.php/{subdomain}/v1/employees
Автоматично створюється профіль співробітника з:
- Персональними даними з TeamTailor
- Фінансовою інформацією з offer
- Організаційною структурою (департамент, позиція)
- Статусом "Active" для негайного онбордингу
4. Результат
💰 Сценарій 4: Повідомлення про зміну зарплати
Мета сценарію
Webhook тригерАвтоматичне повідомлення в Slack при зміні заробітної плати співробітника в BambooHR.
Webhook успішно налаштовано та протестовано. Система автоматично відправляє повідомлення в Slack при зміні заробітної плати.
Опис функціоналу
Система автоматично відстежує зміни заробітної плати співробітників та надсилає повідомлення в Slack канал hr-legal для інформування відповідальних осіб.
Формат повідомлення
"Зміна заробітньої плати з [Актуальне число зміни зп] для [Прізвище Ім'я працівника системи] [Посилання на працівника]"
Приклад:
"Зміна заробітньої плати з $5000 для Петренко Іван Переглянути профіль"
Технічна реалізація
1. Налаштування BambooHR Webhook
Webhook endpoint: https://viragamesinc.app.n8n.cloud/webhook/bamboohr-pay-rate
Події для відстеження:
- employee.pay_rate.changed
- employee.compensation.updated
Статус: ✅ Працює в продакшені
2. Обробка в n8n
Workflow компоненти:
- Webhook Node: Приймає події від BambooHR
- Data Transform: Форматує дані для повідомлення
- BambooHR API: Отримує додаткові дані співробітника
- Slack Node: Відправляє форматоване повідомлення
3. Дані що передаються
{
"event": "pay_rate_change",
"employee": {
"id": "123",
"name": "Іван Петренко",
"department": "Engineering",
"position": "Senior Developer"
},
"changes": {
"previous_rate": 4500,
"new_rate": 5000,
"effective_date": "2025-02-01",
"currency": "USD"
}
}
Реалізована архітектура
Workflow компоненти:
- Webhook Node: Приймає POST запити від BambooHR
- Check If Pay Rate Changed: Перевіряє чи змінилась саме зарплата
- Get Compensation History: Отримує історію компенсацій
- Format Slack Message: Форматує повідомлення українською мовою
- Send Slack Notification: Відправляє в канал hr_legal_finance
Приклад Slack повідомлення
🔔 Зміна заробітної плати
У Петренко Іван змінилася заробітна плата
Переглянути профіль працівника
📅 Дата: 2025-02-01 | 💼 Посада: Senior Developer
План впровадження
Налаштування webhook
✅ Виконано - webhook створено в BambooHR
Створення n8n workflow
✅ Виконано - workflow готовий до роботи
Вирішення проблеми з webhook
✅ Виконано - проблему вирішено
Тестування
✅ Виконано - workflow протестовано
Запуск в production
✅ Запущено в продакшені
Очікувані результати
- Миттєві повідомлення про зміни зарплати
- Прозорість змін компенсації
- Автоматичний аудит змін
- Зменшення часу на комунікацію
🔌 TeamTailor API
Особливості роботи
- JSON:API специфікація (складна структура)
- Обов'язкова пагінація (макс 30 записів)
- Rate limit: 1000 запитів/година
- Недокументовані endpoints (offers, uploads)
Приклад пагінації
async function fetchAllPages(baseUrl, apiKey) {
let allData = [];
let nextUrl = baseUrl;
while (nextUrl) {
const response = await fetch(nextUrl, {
headers: {
'Authorization': `Bearer ${apiKey}`,
'X-Api-Version': '20210218'
}
});
const data = await response.json();
allData = allData.concat(data.data);
nextUrl = data.links?.next; // Наступна сторінка
}
return allData;
}
🎋 BambooHR API
Особливості роботи
- Власний формат даних (не стандартний REST)
- Помилки без опису (тільки код 400)
- Немає документації для file upload
- Soft rate limiting (throttling)
Автентифікація
// Basic Auth з API key як username
const auth = Buffer.from(`${apiKey}:x`).toString('base64');
fetch(url, {
headers: {
'Authorization': `Basic ${auth}`,
'Accept': 'application/json'
}
});
📝 Notion API
Структура баз даних
Job Requisitions
- 20+ кастомних полів
- Relations з іншими таблицями
- Формули для валідації
- Автоматичні статуси
Приклад створення запису
POST /v1/pages
{
"parent": { "database_id": "abc123" },
"properties": {
"Name": {
"title": [{ "text": { "content": "Senior Developer" } }]
},
"Department": {
"relation": [{ "id": "dept-123" }]
},
"Status": {
"select": { "name": "Open" }
},
"Salary Range": {
"rich_text": [{ "text": { "content": "$5000-$7000" } }]
}
}
}
🔔 Webhooks
Налаштування TeamTailor webhook
{
"url": "https://viragamesinc.app.n8n.cloud/webhook/teamtailor-hired",
"events": [
"candidate.hired",
"candidate.changed"
],
"secret": "your-webhook-secret"
}
Обробка в n8n
- Валідація signature для безпеки
- Фільтрація тільки потрібних подій
- Deduplicate для уникнення повторів
- Error handling з retry логікою
⚙️ n8n Workflows
Workflow | Nodes | Тригер | Час виконання |
---|---|---|---|
Department Sync | 12 nodes | Cron / Manual | 1-2 хв |
Job Requisition | 8 nodes | HTTP Request | 30 сек |
Employee Creation | 15 nodes | Webhook | 2-3 хв |
Pay Rate Change | 5 nodes | Webhook | Миттєво |
Error Handler | 4 nodes (AI Agent) | Error Trigger | 5-10 сек |
Версії workflows
- v1: Базова версія без offers
- v2: Додано інтеграцію з job offers
- v3: Webhook підтримка
- v4: Повна пагінація для великих датасетів
⚠️ Обробка помилок та AI Error Handler
Система використовує GPT-4.1 для інтелектуального аналізу помилок та формування читабельних повідомлень.
🤖 Error Handler Workflow (AI Automation Department)
Архітектура Error Handler:
- Error Trigger - Автоматично спрацьовує при помилці в будь-якому workflow
- AI Agent (GPT-4.1) - Аналізує помилку та генерує структуроване повідомлення
- Slack Notification - Відправляє в канал #automation-errors-notification
Як працює AI Error Handler:
Автоматичний pipeline обробки помилок:
- Error Trigger → перехоплює всі помилки з execution context
- AI Agent (GPT-4.1) → семантичний аналіз та генерація рекомендацій
- Slack Integration → структуроване повідомлення з actionable insights
Час обробки: 5-10 секунд від помилки до повідомлення
Приклад повідомлення в Slack:
When: 2025-01-28 16:48:42 (Europe/Kyiv)
Execution: ID 3262 • Open execution
Node: HTTP Request to TeamTailor
HTTP: 404 GET https://api.teamtailor.com/v1/jobs//requisition
Message: The resource could not be found
Human explanation:
• Missing job_id in URL (/jobs//requisition)
• The job might have been deleted
Possible solutions:
• Verify job_id exists before API call
• Add validation node
• Check if job was recently deleted
Стратегія обробки (Retry Logic)
Автоматична retry стратегія з exponential backoff:
- Максимум 3 спроби для кожного API запиту
- Прогресивна затримка: 1с → 2с → 4с
- При фінальній невдачі → Error Handler з AI аналізом
- Розумне розрізнення між transient та permanent помилками
Retry застосовується тільки для мережевих помилок та timeout, не для бізнес-логіки
Типові помилки та рішення
400 Bad Request (BambooHR)
Перевірте формат даних та обов'язкові поля
Rate Limit (TeamTailor)
Додайте delay між запитами
Timeout (Notion)
Розбийте великі запити на менші
✨ Best Practices
Рекомендації для підтримки
Щоденно:
- Перевіряйте Slack канал на помилки
- Моніторте failed executions в n8n
Щотижня:
- Запускайте синхронізацію департаментів
- Перевіряйте дублікати в Notion
- Аналізуйте логи помилок
Щомісяця:
- Backup workflows в n8n
- Оновлення API ключів (якщо потрібно)
- Аналіз метрик продуктивності
Оптимізація продуктивності
- Використовуйте batch операції де можливо
- Кешуйте часто використовувані дані
- Мінімізуйте кількість API запитів
- Використовуйте паралельну обробку в n8n
📊 Підсумок
Всі три сценарії протестовані та працюють в production середовищі.
Ключові досягнення
- ✅ Економія 85% часу HR-менеджера
- ✅ Повна автоматизація критичних процесів
- ✅ Усунення помилок ручного введення
- ✅ Єдине джерело правди для всіх систем
- ✅ Реальні повідомлення про всі події
Контакти для підтримки
Департамент: AI Automation Department
n8n instance: viragamesinc.app.n8n.cloud
Slack канал: #hr-automation-notifications
Error канал: #automation-errors-notification
GitHub: Repository
Автор: Дубовик Кирило
Компанія: Vira Games