Отметим: когда заказчик размещает проект, а исполнитель берёт его в работу, возникают риски: невыполнение, неоплата, спорные ситуации. Для минимизации нужна сложная архитектура: два типа пользователей, эскроу-платежи, чат с офлайн-режимом и рейтинговая система. Мы создаём такие маркетплейсы с использованием современных мобильных технологий: Swift 5.9, Kotlin, Flutter 3.x, и интеграцией Stripe Connect для защищённых транзакций. За 6 лет на рынке мы реализовали более 20 мобильных бирж, включая проекты с миллионными аудиториями. Средняя биржа обрабатывает до 10 000 заказов в месяц, при среднем чеке $150 комиссия платформы 10–15% приносит $15–22.5 с заказа. 85% заказов завершаются успешно, средний рейтинг фрилансера — 4.7. Свяжитесь с нами для консультации по вашему проекту.
Как построить мобильное приложение для фриланс-биржи?
Выбор между раздельными аккаунтами и единым аккаунтом с переключением ролей определяет архитектуру приложения. Раздельные аккаунты (как 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 часов.







