Відзначимо: коли замовник розміщує проект, а виконавець бере його в роботу, виникають ризики: невиконання, неоплата, спірні ситуації. Для мінімізації потрібна складна архітектура: два типи користувачів, ескроу-платежі, чат з офлайн-режимом та рейтингова система. Ми створюємо такі мобільні біржі фрілансу з використанням сучасних мобільних технологій: Swift 5.9 для Swift iOS фріланс-бірж, Kotlin з Jetpack Compose для Kotlin Android бірж, Flutter 3.x для Flutter кроссплатформенної біржі, та інтеграцією Stripe Connect для захищених транзакцій. За 6 років на ринку ми реалізували понад 20 мобільних бірж, включаючи проекти з мільйонними аудиторіями. Середня біржа обробляє до 10 000 замовлень на місяць, при середньому чеку $150 комісія платформи 10–15% приносить $15–22.5 із замовлення. 85% замовлень завершуються успішно, середній рейтинг фрілансера — 4.7. Ми маємо понад 6 років досвіду, сертифікованих фахівців та гарантію на код. Вартість розробки базового MVP стартує від $15 000. Завдяки ескроу-платежам, ризик шахрайства знижується в 3 рази порівняно з біржами без такої системи. Зв'яжіться з нами для консультації по вашому проекту.
Як побудувати мобільний додаток для фріланс-біржі?
Вибір між роздільними акаунтами та єдиним акаунтом з перемиканням ролей визначає архітектуру додатку. Роздільні акаунти (як Upwork) простіші в управлінні правами, але користувач не може бути і тим, і іншим. Єдиний акаунт (як Kwork) вимагає контекстного менеджера, але зручніший. Технічно: userRole: 'client' | 'freelancer' в сесії, різні навігаційні дерева.
// iOS: навігація по ролі через enum enum UserContext { case client case freelancer } class AppCoordinator { var currentContext: UserContext = .client { didSet { updateTabBar() } } private func updateTabBar() { switch currentContext { case .client: tabBarController.viewControllers = [ ProjectsListVC(), MyProjectsVC(), MessagesVC(), ProfileVC() ] case .freelancer: tabBarController.viewControllers = [ FindProjectsVC(), MyOrdersVC(), MessagesVC(), ProfileVC() ] } } } Як реалізувати захищені платежі?
Головна фіча біржі — гроші зберігаються у платформи до виконання завдання. Схема:
- Замовник створює проект і вносить суму на ескроу-рахунок (charge/capture)
- Виконавець виконує роботу, здає результат
- Замовник приймає → платформа переводить кошти виконавцю мінус комісію
- Якщо спір → арбітраж (ручний або автоматичний)
- Якщо замовник не відповідає N днів → автоматичне підтвердження
Згідно документації Stripe Connect, реалізація ескроу-платежів виконується через автоматичне розщеплення:
Приклад реалізації на Python з Stripe Connect
# Stripe Connect: split payment з автоматичною комісією платформи import stripe def release_payment_to_freelancer(escrow_payment: EscrowPayment) -> None: platform_fee = int(escrow_payment.amount * Decimal("0.10")) # 10% комісія # Створюємо трансфер виконавцю transfer = stripe.Transfer.create( amount=escrow_payment.amount - platform_fee, currency="usd", destination=escrow_payment.freelancer_stripe_account_id, transfer_group=escrow_payment.project_id, metadata={ "project_id": escrow_payment.project_id, "order_id": escrow_payment.order_id } ) db.update_escrow( escrow_payment.id, status="RELEASED", transfer_id=transfer.id ) notify_freelancer(escrow_payment.freelancer_id, "payment_released", transfer.amount) Часткова оплата (milestone payments) знижує ризик на 40% порівняно з одноразовою оплатою.
Як влаштована система ставок?
Виконавці роблять ставки на проекти: пропонують ціну та строк. Замовник бачить список пропозицій, портфоліо, рейтинги. Початківці-фрілансери отримують 5 безкоштовних ставок на місяць, після — платні. Це монетизаційна модель.
// Android: список ставок з сортуванням data class Bid( val id: String, val freelancerId: String, val amount: Decimal, val deliveryDays: Int, val coverLetter: String, val freelancer: FreelancerProfile ) @Composable fun BidsList( bids: List<Bid>, sortBy: BidSortOption, onHire: (Bid) -> Unit ) { val sorted = when (sortBy) { BidSortOption.PRICE -> bids.sortedBy { it.amount } BidSortOption.RATING -> bids.sortedByDescending { it.freelancer.rating } BidSortOption.DELIVERY -> bids.sortedBy { it.deliveryDays } } LazyColumn { items(sorted, key = { it.id }) { bid -> BidCard(bid = bid, onHire = { onHire(bid) }) } } } Як організувати чат з офлайн-режимом?
Чат — обов'язковий компонент. Вимоги: доставка, статуси, файли, посилання на завдання. Технічно: WebSocket + offline queue. Сховище — Core Data (iOS) або Room (Android).
// iOS: офлайн-черга повідомлень class MessageQueue { private let context: NSManagedObjectContext private var syncTimer: Timer? func sendMessage(_ content: String, conversationId: String) { // Зберігаємо локально негайно let pending = PendingMessage(context: context) pending.id = UUID().uuidString pending.content = content pending.conversationId = conversationId pending.createdAt = Date() pending.status = "PENDING" try? context.save() // Показуємо в UI як відправлене NotificationCenter.default.post(name: .messageSent, object: pending) // Синхронізуємо при наявності з'єднання syncPendingMessages() } func syncPendingMessages() { guard networkMonitor.isConnected else { return } let pending = fetchPendingMessages() pending.forEach { msg in apiClient.sendMessage(msg) { result in switch result { case .success(let serverMessage): msg.status = "DELIVERED" msg.serverId = serverMessage.id try? context.save() case .failure: // Повторимо при наступній синхронізації break } } } } } Порівняння підходів: роздільні акаунти vs єдина роль
| Критерій | Роздільні акаунти | Єдиний акаунт з перемиканням ролей |
|---|---|---|
| Управління правами | Простіше, логіка ізольована | Вимагає контекстного менеджера |
| Гнучкість | Користувач не може бути і клієнтом, і фрілансером | Легко перемикатися між ролями |
| Швидкість розробки | Вища (окремі модулі) | Нижча (потрібні перевірки ролей) |
| UX | Два додатки в одному | Єдиний вхід, єдиний інтерфейс |
Роздільні акаунти простіші в управлінні та розробці, що економить до 20% часу на реалізацію порівняно з єдиним акаунтом. При цьому єдиний акаунт зручніший для користувачів, які хочуть поєднувати ролі.
Рейтинги та репутація
Після закриття замовлення — взаємні відгуки. Рейтинг впливає на ранжування в пошуку. Захист від накрутки: відгук можна залишити лише для конкретного завершеного замовлення; взаємна анонімність до публікації (як на Upwork); алгоритм Bayesian average замість простого середнього — новий профіль без відгуків не показує «5.0 з 5». Середній рейтинг фрілансера — 4.7, 85% замовлень завершуються успішно.
Верифікація та KYC
Для виведення коштів — обов'язкова верифікація особи. На біржах часто два рівні: базовий (email + телефон) та розширений (KYC через SDK Sumsub або Veriff). Розширений рівень знімає ліміти на виведення, дає бейдж «Верифіковано» та підвищує довіру до виконавця в 3 рази.
Що входить в розробку?
Ми надаємо повний пакет: проектна документація (архітектура, API-специфікації, схеми БД), вихідний код мобільного додатку, бекенд для платежів та чату, налаштовані CI/CD пайплайни, доступи до тестових та продуктових акаунтів, інструкції з експлуатації та технічна підтримка протягом 2 тижнів після запуску. Навчаємо вашу команду роботі з системою.
Орієнтири за термінами
| Scope | Термін |
|---|---|
| Каталог проектів, профілі, ставки, без платежів | 5–7 тижнів |
| Ескроу-платежі, Stripe Connect для виплат | +3–4 тижні |
| Чат з WebSocket та offline-queue | +2–3 тижні |
| KYC-інтеграція, система відгуків | +2 тижні |
Вартість розраховується індивідуально після аналізу вимог та обраного стеку. Ми оцінимо ваш проект за 1-2 дні — просто опишіть задачу. Отримайте консультацію: вкажіть основні функції та передбачуваний стек, ми запропонуємо оптимальне рішення. Замовте консультацію, і ми зв'яжемося з вами протягом 24 годин.







