Реализация промо-предложений в iOS. Как зарабатывать на подписках больше?
В iOS 12.2 Apple добавила новую классную фичу — промо-предложения. Теперь приложения с авто-возобновляемыми подписками могут предлагать нынешним или бывшим клиентам персональные скидки или дополнительный бесплатный период. Промо-предложения распространяются на платящих, плативших, находящихся в триале и отменивших триал пользователей. В отличие от вводного предложения, промо-предложение можно купить сколько угодно раз по усмотрению разработчика. Но реализация требует наличия сервера для генерации цифровой подписи.
Чтобы создать новое промо-предложение, перейдите в App Store Connect и откройте страницу с вашей подпиской. Нажмите »+» в разделе цен на подписку и выберите «Создать промо-предложение»:
Укажите оригинальное название промо-предложения и его идентификатор — Product Code:
Укажите стоимость и тип промо-предложения:
- оплата по факту использования;
- предоплата;
- бесплатный период.
Сохраните изменения.
Ключ подписки
Для использования промо-предложений нужно сгенерировать цифровую подпись используя ключ подписки. Его нужно создать в App Store Connect.
Перейдите в раздел «Пользователи и Доступ», далее во вкладку «Ключи». Создайте новый Ключ подписки, указав его имя.
После создания ключа нажмите «Загрузить ключ API» и сохраните файл в безопасном месте.
Ключ подписки, скачанный с App Store Connect, имеет следующий формат названия: SubscriptionKey_[KEY_ID].p8, где KEY_ID — идентификатор ключа.
Генерация подписи
Здесь начинается самое сложное и, на мой взгляд, ненужное. Apple перестраховались, добавив генерацию подписи, чтобы пользователь не мог взломать StoreKit и оформить промо-предложение без ведома разработчика. Напомню, что эти скидки доступны только платящим пользователям. Разве будут текущие клиенты пытаться взломать систему ради скидки?
С точки зрения мобильного клиента, генерация подписи нужна, чтобы, имея класс SKProductDiscount
, создать класс SKPaymentDiscount
, который будет добавлен в SKMutablePayment
для совершения покупки. Рассмотрим подробнее.
SKProductDiscount
Объекты этого класса хранятся в массиве discounts
у SKProduct
. Все созданные промо-предложения являются объектами класса SKProductDiscount
. Как и в случае вводных предложений, вы можете получить длительность, цену и количество промо-периодов. Получается, этот класс нужен для отображения условий покупки в интерфейсе приложения.
SKPaymentDiscount
Этот класс создает разработчик с помощью данных, полученных от вашего сервера. Взглянем на исходные файлы и увидим единственный метод инициализации:
public init(identifier: String, keyIdentifier: String, nonce: UUID, signature: String, timestamp: NSNumber)
identifier
— идентификатор промо-предложения. Берется изSKProductDiscount
.keyIdentifier
— идентификатор ключа подписки.nonce
— произвольная строка, сгенерированная на сервере для большей защиты подписи, или соль. В iOS необходимо будет создать класс UUID, используя эту соль.signature
— цифровая подпись, полученная от вашего сервера в виде base64-строки.timestamp
— дата создания подписи в миллисекундах. Она нужна, чтобы сравнивать время создания подписи и время самой покупки, ведь подпись действительна только 24 часа.
Сам код для генерации подписи на сервере является задачей не из легких, но Apple предоставила пример кода на Node.js. Ключ подписи должен быть загружен на ваш сервер и вы должны вернуть все указанные выше данные на мобильный клиент.
Более подробно о генерации подписи читайте здесь.
Оформление покупки
Промо-предложение покупается так же, как и обычная покупка. Единственное отличие — добавление объекта класса SKPaymentDiscount
.
let payment = SKMutablePayment(product: product)
payment.paymentDiscount = discount
SKPaymentQueue.default().add(payment)
Что дальше?
Вам удалось успешно сгенерировать подпись и оформить первую покупку в Sandbox. Это замечательно! Но сами промо-предложения не решат проблему увеличения прибыли и возврата пользователей. Ваша задача — показать их пользователю в нужный момент. В какой? Например, можно попытаться вернуть пользователей, отменивших подписку, отправив им уведомление.
Возврат отвалившихся клиентов
С помощью промо-предложений вы можете попытаться вернуть ушедших клиентов. Для этого нужно реализовать целый комплекс функций: промо-предложения, серверные уведомления о статусах подписок, пуш уведомления, хранение чеков пользователей на сервере и поиск пользователя по номеру транзакции. Это непросто.
Опрос отвалившихся клиентов
Привлечение нового пользователя обходится в разы дороже, чем удержание действующего клиента. Поэтому особенно важно понимать мотивы, заставляющие пользователей отменять триалы и подписки.
Многие пользователи отписываются, потому что больше не нуждаются в приложении, и ваша скидка может не сработать. В данном случае вместо того, чтобы предлагать скидку, стоит выяснить, что ему не нравится и что может повлиять на его решение вернуться в приложение.
Предлагать скидки в обмен на действие
Чаще всего — это приглашение друга в обмен на скидку или бесплатное пользование. Это действительно может сработать, однако на реализацию реферральной системы у вас уйдет немало времени.
Как это реализовано в Apphud
Apphud отслеживает отписки, опрашивает ушедших пользователей и предлагает скидки без необходимости написания кода. Экраны скидок создаются в конструкторе в личном кабинете. Для пользователя это выглядит так:
Apphud показывает экран опроса при отмене триала или подписки и, если нужно, сразу предлагает скидку.
Мы назвали каждую отдельную механику по возврату пользователя Правилом. Подробнее о том, как настроить правила, читайте здесь.
Заключение
Подписочная бизнес-модель уже стала стандартом в неигровых мобильных приложениях. Удержание пользователя и понимание причин их ухода — важная задача, которую нужно решать уже на этапе запуска мобильного проекта. Apphud поможет с этим. Попробуйте, это бесплатно.