Відзначимо: коли замовник розміщує проект, а виконавець бере його в роботу, виникають ризики: невиконання, неоплата, спірні ситуації. Для мінімізації потрібна складна архітектура: два типи користувачів, ескроу-платежі, чат з офлайн-режимом та рейтингова система. Ми створюємо такі мобільні біржі фрілансу з використанням сучасних мобільних технологій: 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 годин.







