📚 Повна документація системи

Про цю документацію

Це повний технічний опис HR Integration System з деталями реалізації всіх компонентів.

Загальний огляд

HR Integration System - це комплексне рішення для автоматизації HR-процесів, яке об'єднує 4 ключові платформи:

TeamTailor

Applicant Tracking System для управління кандидатами

BambooHR

HR Information System для управління персоналом

Notion

База знань та центр управління HR-процесами

Slack

Миттєві повідомлення про всі важливі події

Ключові проблеми, які вирішує система

  • Було: Потрійне введення однакових даних в різні системи
  • Стало: Єдине джерело правди з автоматичною синхронізацією
  • Було: 45-60 хвилин на один процес найму
  • Стало: 5-7 хвилин завдяки автоматизації
  • Було: Постійні розбіжності між системами
  • Стало: 100% консистентність даних

💰 Бізнес-цінність

Економія часу

Було 45-60 хв
Стало 5-7 хв

Економія 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"
}

🔄 Потік даних

1

Ініціація процесу

Менеджер виконує дію в одній з систем (наприклад, переводить кандидата на статус "Hired")

2

Тригер автоматизації

n8n отримує webhook або запускається по розкладу

3

Збір даних

Система збирає всю необхідну інформацію через API запити

4

Трансформація

Дані перетворюються у формат цільової системи

5

Синхронізація

Оновлення всіх пов'язаних систем

6

Повідомлення

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 повідомлення з посиланням на вакансію
Важливо! Workaround для TeamTailor

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. Результат

Автоматично 2-3 хв
Вручну (документи) 5 хв

💰 Сценарій 4: Повідомлення про зміну зарплати

Мета сценарію

Webhook тригер

Автоматичне повідомлення в Slack при зміні заробітної плати співробітника в BambooHR.

Статус: Працює в продакшені

Webhook успішно налаштовано та протестовано. Система автоматично відправляє повідомлення в Slack при зміні заробітної плати.

Опис функціоналу

Система автоматично відстежує зміни заробітної плати співробітників та надсилає повідомлення в Slack канал hr-legal для інформування відповідальних осіб.

Формат повідомлення

📨 Slack повідомлення:

"Зміна заробітньої плати з [Актуальне число зміни зп] для [Прізвище Ім'я працівника системи] [Посилання на працівника]"

Приклад:
"Зміна заробітньої плати з $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 компоненти:

  1. Webhook Node: Приймає POST запити від BambooHR
  2. Check If Pay Rate Changed: Перевіряє чи змінилась саме зарплата
  3. Get Compensation History: Отримує історію компенсацій
  4. Format Slack Message: Форматує повідомлення українською мовою
  5. Send Slack Notification: Відправляє в канал hr_legal_finance

Приклад Slack повідомлення

🔔 Зміна заробітної плати

У Петренко Іван змінилася заробітна плата

Переглянути профіль працівника

📅 Дата: 2025-02-01 | 💼 Посада: Senior Developer

План впровадження

1

Налаштування webhook

✅ Виконано - webhook створено в BambooHR

2

Створення n8n workflow

✅ Виконано - workflow готовий до роботи

3

Вирішення проблеми з webhook

✅ Виконано - проблему вирішено

4

Тестування

✅ Виконано - workflow протестовано

5

Запуск в 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

AI-Powered Error Processing

Система використовує GPT-4.1 для інтелектуального аналізу помилок та формування читабельних повідомлень.

🤖 Error Handler Workflow (AI Automation Department)

Архітектура Error Handler:

  1. Error Trigger - Автоматично спрацьовує при помилці в будь-якому workflow
  2. AI Agent (GPT-4.1) - Аналізує помилку та генерує структуроване повідомлення
  3. 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:

⚠️ [warning] — Job Create/Update TeamTailor Webhook
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