Реализация промокодов и скидок в мобильном приложении
Мы разрабатываем систему промокодов и скидок под ключ. Типичная техническая проблема: клиент хочет дать скидку конкретному пользователю, но нативные промокоды App Store не позволяют применять их внутри приложения — они работают только при покупке через App Store вне приложения. Приходится смешивать механизмы, что ведёт к ошибкам валидации и утечке денег. Наш опыт — более 20 проектов с промокодами на iOS и Android — позволил наработать проверенные архитектурные решения. Например, на одном проекте мы реализовали систему скидок с 15% экономией для пользователей, используя серверную логику и Promotional Offers для подписок.
Как настроить промокоды без ограничений App Store?
Нативные промокоды Apple и Google — только для платных приложений или IAP, негибкие. Кастомная серверная логика решает эту проблему: вы создаёте свои коды, управляете скидками через админку и применяете их после покупки. Это позволяет реализовать скидки до 50% без нарушения правил магазинов. Сервер хранит все данные о промокодах, а клиент только отображает результат валидации.
Почему кастомная серверная логика надёжнее?
Схема данных:
promo_codes: id, code, discount_type (percent|fixed|trial_days), value, max_uses, used_count, expires_at, product_ids[], user_id (опционально) promo_redemptions: id, code_id, user_id, created_at, purchase_id Флоу на клиенте:
- Пользователь вводит код → клиент вызывает
POST /api/promo/validateс кодом и product_id - Сервер возвращает тип скидки и применяемую цену
- Клиент показывает итоговую цену
- Покупка через нативный IAP по полной цене → на сервере после верификации транзакции применяем скидку (начисляем разницу валютой, продлеваем trial и т.д.)
Прямое изменение цены IAP на клиенте невозможно — Apple и Google не позволяют динамически менять стоимость продукта. Вся логика скидок реализуется post-purchase на сервере или через отдельные продукты с уже заниженной ценой.
Promotional offers как механизм скидки
Для подписок на iOS — SKPaymentDiscount / SubscriptionOffer в StoreKit 2. Создаём offer в App Store Connect с нужной ценой, сервер генерирует подпись для конкретного пользователя. Это легальный способ предложить скидку без обхода нативного биллинга. Документация Apple: Promotional Offers
// Получаем offer с сервера let offerSignature = await serverAPI.getPromoSignature(userID: user.id, offerID: "discount_50") let product = try await Product.products(for: ["premium_monthly"]).first! let purchaseOption = product.subscriptionOffer( offerID: "discount_50", keyID: offerSignature.keyID, nonce: offerSignature.nonce, signature: offerSignature.signature, timestamp: offerSignature.timestamp ) let result = try await product.purchase(options: [purchaseOption!]) Ввод промокода в UI
Поле ввода промокода — отдельный экран или bottom sheet с debounce-валидацией (запрос к серверу через 300 мс после последнего символа). Важно: показывать загрузку во время валидации и обрабатывать ошибки — «код истёк», «код уже использован», «не применим к выбранному продукту». Для повышения конверсии добавьте кнопку «Применить» и мгновенный отклик — изменение цены в реальном времени.
| Механизм | Где применяется | Гибкость | Срок интеграции | Пример скидки |
|---|---|---|---|---|
| Нативные промокоды | App Store Connect / Google Play Console | Низкая — только для платных приложений и IAP | 1–2 дня | Фиксированная скидка на первый месяц |
| Кастомные (с сервером) | Любое приложение | Высокая — любые условия и скидки | 2–5 дней | 20% скидка при вводе кода |
| Promotional offers | Подписки iOS | Средняя — только подписки, требуется подпись сервера | 2–3 дня | Бесплатный пробный период на 7 дней |
Примеры сценариев промокодов
| Сценарий | Тип скидки | Реализация | Механизм |
|---|---|---|---|
| Приветственный код | Фиксированная сумма | Сервер уменьшает цену при покупке | Кастомный |
| Скидка за репост | Процент | После покупки начисляются баллы | Кастомный |
| Пробный период подписки | Бесплатные дни | Promotional offer | iOS |
Типичные ошибки при реализации промокодов
- Отсутствие защиты от дублирования — пользователь может активировать один код несколько раз, если не проверять привязку к аккаунту.
- Игнорирование лимита по времени — код должен проверять срок действия на сервере, а не на клиенте.
- Неправильная обработка ошибок — сообщение «неверный код» вместо конкретной причины.
Что входит в работу
- Проектирование схемы данных промокодов и скидок
- Разработка REST API для валидации и применения
- UI-компонент ввода кода с обработкой ошибок
- Интеграция с нативным биллингом (StoreKit, Billing Library)
- Административная панель для управления кодами и статистикой
- Документация по API и инструкция по эксплуатации
Сроки ориентировочно
Базовая система промокодов — от 2 до 5 рабочих дней. Проект с promotional offers или сложной многоуровневой скидкой — до 2 недель. Время зависит от количества платформ и требований к админке.
Почему выбирают нас
Мы работаем с мобильными скидками более 5 лет. Гарантируем корректную обработку транзакций и соответствие правилам магазинов. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Закажите разработку системы промокодов уже сегодня.







