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







