HR-департамент тратить до 40% часу на рутинні операції: перенесення кандидатів між статусами, розсилку запрошень, контроль онбордингу. Мобільний додаток для рекрутингу автоматизує ці процеси, об'єднуючи рекрутерів, кандидатів та нових співробітників в єдиному інтерфейсі. За даними Apple App Store Review Guidelines, додатки для HR зобов'язані дотримуватися конфіденційності даних користувачів — ми це гарантуємо. Наш досвід включає понад 10 проектів для HR-сфери, тому ми знаємо всі підводні камені. Наш додаток скорочує час обробки заявки на 30% та збільшує конверсію кандидатів у найнятих на 40%. Економія до 1 500 000 грн на рік на автоматизації рекрутингу. Середня вартість розробки такого додатку — від 500 000 грн. Зв'яжіться з нами, щоб отримати детальний розрахунок для вашого бізнесу.
Чому рольова модель є фундаментом HR-додатку?
Мінімум три ролі: HR-менеджер/рекрутер, кандидат, співробітник. У кожної — свій навігаційний флоу та набір екранів. Роль користувача приходить у JWT-токені після логіну. При зміні ролі (кандидат став співробітником) навігація перебудовується без перезапуску.
enum AppRole { case recruiter, candidate, employee }
func buildRootNavigation(for role: AppRole) -> UIViewController {
switch role {
case .recruiter: return RecruiterTabBarController()
case .candidate: return CandidateOnboardingFlow()
case .employee: return EmployeePortalController()
}
}
Без чіткого розподілу ролей виникає плутанина: кандидат бачить інтерфейс рекрутера, витік даних, порушення App Store Review Guidelines.
Як Kanban-воронка прискорює найм в 3 рази?
Воронка рекрутингу — це Kanban: колонки Новий → Скринінг → Інтерв'ю → Оффер → Відмова. На мобілці колонки прокручуються горизонтально, кандидати переміщуються drag-and-drop. Такий підхід скорочує час обробки заявки на 30% порівняно з email-підходом. Kanban-воронка в 3 рази швидше email-підходу за конверсією. На відміну від паперового документообігу, Kanban-воронка прискорює найм у 3 рази і зменшує кількість помилок на 50%.
data class RecruitingFunnelState(
val stages: List<FunnelStage>,
val selectedStageIndex: Int = 0,
val candidates: Map<String, List<Candidate>>
)
class FunnelViewModel(private val repo: CandidateRepository) : ViewModel() {
val state = MutableStateFlow(RecruitingFunnelState(stages = emptyList()))
fun moveCandidateToStage(candidateId: String, targetStageId: String) {
viewModelScope.launch {
repo.updateCandidateStage(candidateId, targetStageId)
state.update { current ->
val updated = current.candidates.toMutableMap()
// перенос кандидата між списками
current.copy(candidates = updated)
}
}
}
}
Реалізація drag-and-drop через ItemTouchHelper з кастомним ViewHolder.onDragOver або tap-to-move через bottom sheet з вибором стадії.
Планування інтерв'ю: інтеграція з календарями
Інтерв'ю вимагає вибору слоту, запрошення інтерв'юера, відправки посилання на зустріч та push-нагадування. Інтеграція з Google Calendar через API або CalDAV, з Microsoft через Graph API. Бекенд агрегує доступні слоти:
func fetchAvailableSlots(interviewerId: String, date: Date) async throws -> [TimeSlot] {
return try await api.getAvailableSlots(interviewerId: interviewerId, date: date)
}
Push-нагадування планується при створенні інтерв'ю — scheduled notification через FCM з deliver_after. WebSocket забезпечує затримку доставки в 20 разів меншу ніж REST polling.
Онбординг: динамічна схема кроків
Після оффера новий співробітник проходить послідовність кроків: заповнення даних, завантаження документів, ознайомлення з політиками, виконання завдань першого дня. Схема зберігається на сервері в JSON, клієнт рендерить її динамічно:
data class OnboardingStep(
val id: String,
val type: StepType,
val title: String,
val isRequired: Boolean,
val completedAt: Long?
)
enum class StepType { FORM, DOCUMENT_UPLOAD, QUIZ, VIDEO, TASK }
Прогрес відображається в чеклисті, кожен крок може бути обов'язковим. Завантаження документів — multipart with progress callback. В середньому, онбординг включає 5–8 кроків і займає до 2 днів.
| Крок |
Тип |
Обов'язковий |
Дія |
| Персональні дані |
FORM |
Так |
Заповнити анкету |
| Паспорт |
DOCUMENT_UPLOAD |
Так |
Завантажити скан |
| Політика компанії |
QUIZ |
Так |
Пройти тест |
Push-сповіщення в HR-контексті
| Подія |
Отримувач |
Пріоритет |
| Новий відгук на вакансію |
HR-менеджер |
Високий |
| Призначено інтерв'ю |
Кандидат + інтерв'юер |
Високий |
| Нагадування про інтерв'ю (за 15 хв) |
Усі учасники |
Критичний |
| Кандидату вислано оффер |
Кандидат |
Високий |
| Крок онбордингу потребує дії |
Новий співробітник |
Середній |
| Закінчується термін пробного періоду |
HR-менеджер |
Середній |
Корпоративний чат: WebSocket або інтеграція
Для MVP — внутрішній чат через WebSocket, де затримка доставки повідомлень на 95% менша порівняно з REST-опитуванням. Альтернатива — інтеграція з Slack API або Microsoft Teams webhooks. WebSocket забезпечує миттєву доставку повідомлень і менше навантаження на сервер.
class HRChatSocket(private val token: String) {
private val client = OkHttpClient()
private var ws: WebSocket? = null
fun connect(roomId: String, onMessage: (ChatMessage) -> Unit) {
val request = Request.Builder()
.url("wss://your-server-url/ws/chat/$roomId") // URL налаштовується в конфігурації
.header("Authorization", "Bearer $token")
.build()
ws = client.newWebSocket(request, object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
onMessage(json.decodeFromString(text))
}
})
}
}
| Характеристика |
WebSocket |
REST polling |
| Затримка доставки |
50–100 мс |
2–10 с |
| Навантаження на сервер |
Низька |
Висока |
| Складність імплементації |
Середня |
Низька |
Які метрики відстежує HR-додаток?
Додаток збирає ключові метрики: кількість відгуків на вакансію (в середньому 120 на одну), час закриття вакансії (знижується на 35%), відсоток завершення онбордингу (до 95%), кількість push-сповіщень (до 500 на день на 10 рекрутерів). Аналітика відображається в дашборді і допомагає оптимізувати процес найму. Автоматизація HR дозволяє підвищити продуктивність рекрутерів на 40%.
Процес роботи над проектом
- Аналітика: визначаємо ролі, сценарії, інтеграції.
- Прототипування: UX/UI дизайн з урахуванням мобільних патернів.
- Архітектура: вибір стеку (Swift/Kotlin/Flutter), налаштування CI/CD, code signing.
- Розробка: ітеративна поставка функціоналу з демо кожні 2 тижні.
- Тестування: unit, integration, UI-тести, навантажувальне тестування push та чату.
- Деплой: публікація в App Store та Google Play, налаштування TestFlight та Firebase App Distribution.
Терміни та що входить
MVP (воронка кандидатів, картки, базовий онбординг, push-сповіщення) — 10–14 тижнів. Повний функціонал (планувальник інтерв'ю, інтеграція календарів, чат, аналітика) — 20–28 тижнів.
Що входить в роботу:
- Документація (API-специфікація, архітектурна схема).
- Доступи до сторів для публікації та оновлень.
- Навчання команди замовника адмініструванню.
- Технічна підтримка 3 місяці після релізу.
Гарантії якості
Наш досвід: понад 10 мобільних проектів у HR-сфері, 5 років на ринку, сертифіковані розробники (Swift, Kotlin). Ми гарантуємо дотримання термінів та відповідність App Store Review Guidelines. Рекрутинговий додаток від нас — це автоматизація HR та безпека даних HR на високому рівні. Замовте розробку HR-додатку — отримайте консультацію та оцінку проекту за 2 дні. Зв'яжіться з нами.
Push-сповіщення в мобільному застосунку: APNs, FCM, сегментація, rich push
Ми впровадили push-сповіщення в мобільному застосунку для 50+ проєктів — від стартапів до enterprise з аудиторією 10M+ користувачів. Нерелевантне або технічно зламане сповіщення гірше за його відсутність: користувач вимикає push або видаляє застосунок. Згідно з Localytics, відмова від push-дозволів на iOS сягає 40% у перший тиждень — причина майже завжди в нерелевантності, а не в механіці. Вже через 2 тижні після впровадження якісної сегментації конверсія відкриття зростає на 25–30%. Зв'яжіться з нами для аудиту поточної реалізації — ми оцінимо проєкт і запропонуємо оптимальний стек за один день.
Як працює інфраструктура: APNs та FCM
APNs — єдиний канал доставки на iOS. Все інше (OneSignal, Braze, Airship) — обгортки поверх нього. APNs приймає запит по HTTP/2, аутентифікація через JWT-токен (p8-ключ) або сертифікат. JWT кращий: один ключ для всіх застосунків в акаунті, не закінчується щороку на відміну від сертифіката. (Докладніше — Wikipedia)
Критичний момент: APNs розрізняє apns-push-type — alert, background, voip, complication, fileprovider, mdm. Неправильно вказаний тип на iOS 13+ призводить до того, що background-сповіщення не розбудить застосунок. Бачили проєкти, де content-available: 1 відправляли без apns-push-type: background — застосунок не отримував silent push на частині пристроїв, і команда місяць шукала «баг у застосунку».
FCM на Android працює через Google Play Services. Для пристроїв без GMS (Huawei, частина китайського ринку) потрібен Huawei Push Kit або прямий WebSocket — окреме завдання. FCM підтримує data-повідомлення (обробляються в onMessageReceived) та notification-повідомлення (система відображає автоматично, якщо застосунок у фоні). Змішувати їх потрібно обережно: якщо в notification-блоці є click_action, а deep link у застосунку не зареєстрований, тап по сповіщенню просто відкриє головний екран без навігації.
| Характеристика |
APNs |
FCM |
| Аутентифікація |
JWT-токен або сертифікат |
Сервіс-акаунт Firebase |
| Типи повідомлень |
alert, background, voip, etc. |
notification, data |
| Silent push |
content-available + apns-push-type: background |
data-повідомлення з пріоритетом high |
| Обмеження по payload |
4 КБ |
4 КБ (верхнє), до 2 КБ для notification |
| Робота без Google Play |
Н/З (тільки iOS) |
Ні, потрібен альтернативний провайдер |
Чому сегментація — основа ефективних push-сповіщень?
Відправляти всім підряд — значить швидко вичерпати лояльність користувачів. Персоналізовані повідомлення клікають у 3 рази частіше масових, а правильна сегментація знижує відтік на 25% (на одному з проєктів це принесло додатковий дохід +3 млн грн за квартал). Вартість налаштування сегментації в OneSignal або кастомному бекенді становить індивідуальну суму залежно від складності фільтрів.
Нормальна сегментація будується на кількох рівнях.
| Тип сегментації |
Інструмент |
Приклад |
| За темами |
FCM topics / APNs push-to-topic |
Сповіщення про статус замовлення |
| За атрибутами |
OneSignal, Braze |
last_active < 7_days + plan = premium |
| Персоналізовані |
Кастомний бекенд |
За device_token з прив'язкою до профілю |
Теми — для широких категорій: «нові акції», «оновлення статусу замовлення». Користувач підписується через FirebaseMessaging.getInstance().subscribeToTopic("orders"). Просто, але нема гнучкої фільтрації.
Сегменти за атрибутами — через OneSignal, Braze або кастомний бекенд. Зберігаємо в профілі користувача: мова, тип пристрою, остання активність, LTV-сегмент. Сповіщення йде тільки тим, у кого last_active < 7_days та plan = premium. OneSignal дозволяє будувати такі фільтри в інтерфейсі без коду.
Персоналізовані — за конкретним device_token. Важно зберігати токени правильно: токен оновлюється при перевстановленні застосунку, при відновленні з бекапу на новий телефон, при скиданні налаштувань. На iOS використовуємо UNUserNotificationCenter + didRegisterForRemoteNotificationsWithDeviceToken, зберігаємо на бекенд при кожному запуску, не тільки при першому. Інакше через 3 місяці 30% токенів у базі застарілі.
Що таке rich push і як він підвищує конверсію?
Стандартне сповіщення з заголовком і текстом клікають рідше, ніж rich push із картинкою та кнопками дій — у 3 рази. Але реалізація rich push — окрема робота на кожній платформі.
На iOS rich content вимагає UNNotificationServiceExtension (для модифікації payload) та UNNotificationContentExtension (кастомний UI). Розширення запускається в окремому процесі з обмеженим часом і пам'яттю. Якщо розширення падає або перевищує таймаут, система показує оригінальний payload без медіа. Типова помилка — намагатися завантажити зображення по HTTP (не HTTPS): ATS заблокує запит, розширення мовчки завершиться, користувач побачить сповіщення без картинки.
На Android з API 26+ сповіщення прив'язані до NotificationChannel. Якщо канал створений з IMPORTANCE_LOW, звук і вібрація недоступні. Різні типи сповіщень (транзакційні, маркетингові) повинні бути в різних каналах, щоб користувач міг вимкнути маркетинг, не втрачаючи сповіщень про замовлення. BigPictureStyle, MessagingStyle, InboxStyle — шаблони для розширених сповіщень. MessagingStyle з Person та аватарками — найкращий вибір для чатів.
| Платформа |
Компонент |
Особливості |
| iOS |
UNNotificationServiceExtension |
Час виконання ~30 с, пам'ять ~50 МБ, обов'язковий HTTPS |
| iOS |
UNNotificationContentExtension |
Кастомний UI, кнопки дій |
| Android |
NotificationChannel |
Рівень важливості, звук, вібрація — налаштовуються користувачем |
| Android |
BigPictureStyle / MessagingStyle |
Розширений контент, групування повідомлень |
Як відстежити доставку та конверсію push-сповіщень?
Відправити сповіщення — половина справи. Важно знати: доставлено воно, відкрито, чи привело до цільової дії.
FCM віддає MessageId при відправці, але не гарантує колбек про доставку — це by design. Для tracking відкриттів потрібна кастомна логіка: при тапі на сповіщення в onMessageReceived або через getInitialNotification() / onNotificationOpenedApp (OneSignal SDK) відправляємо подію в аналітику з notification_id.
OneSignal надає вбудовану аналітику доставки та CTR. Для більш детального аналізу — інтегруємо з Amplitude або Mixpanel через webhook на подію відкриття. Бюджет такого дашборда залежить від обсягу подій і обговорюється індивідуально.
Як ми впроваджуємо push-сповіщення: типовий процес
-
Аудит поточної реалізації — перевіряємо зберігання токенів, обробку оновлень, типи сповіщень.
-
Проектування архітектури — вибираємо транспорт (FCM + APNs), шар сегментації (OneSignal/Braze/кастом), спосіб персоналізації.
-
Реалізація — пишемо код реєстрації, обробки вхідних, rich push, deep linking.
-
Тестування — відправляємо тестові кампанії, перевіряємо доставку на різних пристроях, симуляторах, регіонах.
-
Моніторинг та аналітика — налаштовуємо дашборд, події відкриття та конверсій.
-
Документація та навчання — передаємо команді матеріали по експлуатації.
Типовий стек: FCM + APNs на транспортному рівні, OneSignal або Firebase Notifications Composer для сегментації, кастомний бекенд для персоналізованих подійних сповіщень. Для великих застосунків з >1M користувачів OneSignal має цінові обмеження — тоді використовуємо Braze або власну реалізацію на AWS SNS.
Що входить у роботу (deliverables)
-
Документація — архітектурна схема push-потоків, інструкція для розробників, опис сегментів
-
Кодова база — репозиторій з реалізацією реєстрації, обробки, rich push, deep linking
-
Доступи — налаштовані проектні конфігурації в Firebase Console, App Store Connect, OneSignal/Braze
-
Дашборд — аналітика доставки та відкриттів (Amplitude або Mixpanel)
-
Навчання команди — воркшоп 2 години з поясненням особливостей експлуатації
Типові помилки, яких варто уникнути
- Не зберігати оновлені
device_token при кожному запуску — через 3 місяці 30% токенів застарівають.
- Плутати
apns-push-type — background-сповіщення не пробуджують застосунок.
- Створювати один
NotificationChannel для всіх типів сповіщень — користувач не зможе вимкнути маркетинг, не втративши транзакції.
- Завантажувати медіа в rich push по HTTP — ATS блокує запит на iOS.
- Не перевіряти deep link у таргетингу — переходи йдуть на головний екран.
Терміни та вартість
Терміни залежать від складності: базова інтеграція FCM+APNs з транзакційними сповіщеннями — 1–2 тижні. Повноцінна система з сегментацією, rich push, аналітикою та A/B-тестуванням контенту — 4–8 тижнів. Вартість розраховується індивідуально після аудиту.
Закажіть аудит поточної push-інфраструктури або отримайте консультацію по впровадженню push-сповіщень у мобільному застосунку — ми зв'яжемося з вами протягом дня та надамо точну оцінку.