OneSignal вводит жёсткий потолок на бесплатный план. Скоро мобильный push и in-app сообщения перестанут быть бесплатными выше 1000 MAU. Новые аккаунты упрутся в лимит 1 сентября 2026, существующие — 1 октября. Если в вашем приложении больше тысячи активных пользователей в месяц, у вас есть три варианта: остаться и платить, урезать аудиторию или переехать.
Что меняется и когда
- Бесплатный план продолжает работать ниже 1000 MAU. Выше этой отметки мобильный push и in-app переходят на платный тариф.
- Даты: лимит вступает в силу для новых аккаунтов с 1 сентября 2026 и для существующих — с 1 октября 2026, согласно billing FAQ OneSignal.
- Порог: менее 1000 MAU для мобильного push и in-app. При превышении эти каналы перестают отправлять сообщения до апгрейда.
- Что не тронули: web push, email и SMS продолжают работать в рамках тех же лимитов плана, что и раньше. Изменение касается только мобильных каналов.
- Journeys тоже затрагиваются: любой шаг journey, который отправляет push или in-app сообщение, просто пропускает мобильные подписки.
- Удаление подписчиков не выход. Если вы удалите мобильные подписки, которые были активны за последние 30 дней, план сможет заново включить отправку только через 30 дней после удаления — и только если весь этот период вы остаётесь под лимитом.
Как работает миграция
Если вы решили переехать, вот главное, что меняет весь план: миграцию проводим мы. Ваша часть работы — три пункта: файл экспорта, ваши push-credentials и замена SDK в следующем релизе приложения. Всё остальное (очистка данных, маппинг платформ, восстановление тегов, импорт аудитории, проверка доставляемости) — на нашей стороне.
Переход идёт по двум трекам одновременно. Разовый импорт переносит вашу существующую базу, так что аудитория остаётся доступной с первого дня — ещё до того, как хоть один пользователь обновит приложение. Дальше SDK берёт на себя каждое устройство по мере того, как его владелец устанавливает новую сборку. Нужны оба трека, и ни один не блокирует другой.
1. Что мы можем и не можем перенести
Вам не нужно проводить этот аудит самостоятельно. Вот полная картина заранее, чтобы ничего не удивило вас в середине миграции.
| Канал | Переносится? | Как |
|---|---|---|
| iOS push (APNs) | Да | Мы импортируем ваши существующие device tokens. Они продолжают работать, потому что токен принадлежит вашему приложению и вашему APNs-ключу, а не OneSignal. |
| Android push (FCM) | Да | Так же: токены принадлежат вашему проекту Firebase. |
| Huawei push (HMS) | Да | Так же, с использованием ваших HMS-credentials. |
| Подписчики email и SMS | Да, с настройкой канала | Адреса и номера телефонов импортируются. Для отправки также нужно настроить канал на нашей стороне: верифицированный домен отправки с DKIM для email, отправителя или провайдера для SMS. Мы настраиваем это вместе с вами до первой отправки. |
| Web push | Нет, вместо этого — повторная подписка | Браузерные подписки криптографически привязаны к ключам OneSignal и не могут быть перенесены ни одним провайдером. Ваши подписчики возвращаются незаметно для них самих: см. раздел про web push. |
| История сообщений, статистика доставки, journeys | Нет | Исторические данные остаются в OneSignal. Экспортируйте все отчёты, которые хотите сохранить, до закрытия аккаунта. |
| Определения сегментов | Пересобираются, а не импортируются | API OneSignal возвращает названия и размеры сегментов, но не их фильтры, так что импортировать нечего. Мы воссоздаём их в Pushwoosh. |
Сколько это занимает по времени
Замена SDK и чистая тестовая отправка — работа на день для одного разработчика. Импорт идёт параллельно на нашей стороне, и именно он сохраняет ваш охват нетронутым с первого дня: импортированные устройства доступны для отправки ещё до того, как кто-то обновит приложение. Дальше аудитория вашего приложения переходит на Pushwoosh SDK в темпе, с которым пользователи устанавливают новую сборку, — это вопрос недель, и он никогда не охватывает буквально каждое устройство. Именно поэтому и существует импорт.
Порядок важен:
- Экспортируйте вашу аудиторию. Пришлите нам ваш OneSignal app_id и App API key — и мы сами вытянем экспорт, либо экспортируйте CSV самостоятельно. Подробности ниже.
- Пришлите нам ваши push-credentials. Те же ключи, с которыми уже отправляет OneSignal. Мы загружаем их до начала импорта, чтобы каждое импортированное устройство было доступно для отправки.
- Замените SDK. Удалите OneSignal SDK, добавьте Pushwoosh SDK, инициализируйте его с вашим application code Pushwoosh и device API token. Шаги по платформам — в разделах «Вариант A–C».
- Проверьте доставку. Зарегистрируйте тестовое устройство и отправьте себе push, прежде чем трогать продакшн-трафик.
- Утвердите таблицу тегов. Мы строим её на основе вашего экспорта; вы вычёркиваете неиспользуемые теги и отмечаете те, что могут содержать несколько значений. Мы импортируем и воссоздаём ваши сегменты.
- Переключите отправку. Как только тестовая доставка чистая, а импорт подтверждён, направьте кампании на Pushwoosh и остановите отправку из OneSignal.
2. Экспортируйте вашу аудиторию
Вариант A (рекомендуем): мы делаем это за вас. Пришлите нам ваш OneSignal app_id и App API key — и мы сами вытянем экспорт. На этом ваша часть заканчивается.
Вариант B: делаете сами. В OneSignal перейдите в Audience > Subscriptions и экспортируйте CSV, либо вызовите export endpoint:
curl -X POST 'https://api.onesignal.com/players/csv_export?app_id=YOUR_APP_ID' \ -H 'Authorization: Key YOUR_APP_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"extra_fields":["external_user_id","timezone_id","notification_types"]}'В ответе возвращается csv_file_url — gzip-сжатый CSV, доступный для скачивания в течение трёх дней.
Эти столбцы обязательно должны быть в файле. Всё остальное — опционально, мы это игнорируем.
| Столбец | Зачем он нужен |
|---|---|
identifier | Сам push-токен. Строку без него перенести нельзя. |
id | ID подписки OneSignal. На нашей стороне становится идентификатором устройства. |
device_type | Сообщает нам платформу: iOS, Android, Huawei, email, SMS. |
invalid_identifier | Помечает строки отписавшихся, чтобы мы их пропустили. |
tags | Ваши кастомные теги. Мы воссоздаём их в Pushwoosh. |
external_user_id | Ваш собственный user id. Не даёт устройству задублироваться, когда его зарегистрирует наш SDK. |
timezone_id | Включает Send by Timezone в Pushwoosh. |
identifieriddevice_typeinvalid_identifiertagsexternal_user_idtimezone_idОбратите внимание: external_user_id и timezone_id не входят в экспорт по умолчанию. Запросите их явно через параметр extra_fields выше или через column picker в дашборде.
3. Пришлите нам ваши push-credentials
Это те же credentials, которые OneSignal уже использует для отправки от вашего имени, так что создавать ничего нового не нужно. Мы не можем вытащить их из OneSignal сами: загруженный ключ больше никогда не скачивается обратно, поэтому этот шаг — только ваш.
| Платформа | Что нам нужно | Где это взять |
|---|---|---|
| iOS | APNs Auth Key (.p8), Key ID, Team ID, app bundle id | Apple Developer > Certificates, Identifiers & Profiles > Keys. Не отзывайте ключ, который использует OneSignal — один ключ может обслуживать оба сервиса. |
| Android | Firebase service account JSON (FCM v1) | Firebase Console > Project settings > Service accounts. Это должен быть тот же проект Firebase, который уже использует ваше приложение. |
| Huawei | App ID и App Secret | AppGallery Connect > your project > App information. |
Мы загружаем credentials в ваше приложение Pushwoosh до начала импорта. Этот порядок важен: импорт без credentials даёт базу, полную устройств, которым ничего нельзя доставить.
4. Проверьте теги и сегменты
Теги переносятся, и вам не нужно инвентаризировать их самостоятельно. В OneSignal тег — это обычная строка key/value без объявленного типа. В Pushwoosh каждый тег объявляется один раз для приложения с типом (String, Integer, Boolean, Date, List или Price), и только после этого хранит значения.
Как только у нас есть ваш экспорт, мы присылаем вам таблицу для проверки тегов, построенную прямо из файла. В ней перечислен каждый найденный тег с заполненными данными: примеры значений, сколько устройств несут значение, и предлагаемый тип. Ваша часть — две колонки: вычеркнуть теги, которыми вы больше не пользуетесь, и отметить те, что могут содержать несколько значений сразу. Всё остальное — предложение, которое можно утвердить как есть.
Почему мы спрашиваем, а не угадываем: тип тега фиксируется в момент создания, поэтому многозначный тег, который мы создадим как обычный String, придётся удалять и импортировать заново. Тег, который в экспорте выглядит однозначным, — это именно тот случай, который мы не можем определить по данным. Если ответа нет, мы импортируем каждый тег с тем типом, который вывели сами, и сообщаем, где именно догадывались.
Сегменты пересобираются. API OneSignal умеет фильтровать экспорт по сегменту и перечислять названия ваших сегментов, но не возвращает фильтры, которые за ними стоят, — поэтому импортировать нечего. Два пути:
- Пересобрать условия (рекомендуем). Пришлите нам список сегментов с их фильтрами — скриншоты подойдут. Мы воссоздаём их поверх импортированных тегов. Пересобранные сегменты динамические: они продолжают обновляться по мере изменения аудитории.
- Заморозить состав. Мы делаем один экспорт на каждый сегмент и помечаем каждый файл тегом-маркером, например
os_segment = vip_users. Быстро, но результат — снимок, который сам себя не обновляет.
Сегменты, построенные на собственных поведенческих данных OneSignal (количество сессий, время в приложении, «Active Users», «Engaged Users»), нельзя воспроизвести в момент импорта, потому что эта история остаётся в OneSignal. Их аналоги в Pushwoosh начинают наполняться, как только наш SDK попадает в ваше приложение.
5. Что делаем мы со своей стороны
- Создаём и настраиваем ваше приложение Pushwoosh, загружаем credentials из шага 3.
- Чистим экспорт: убираем строки отписавшихся и строки с пустым токеном, мапим коды платформ OneSignal на наши, конвертируем теги, мапим ваш
external_user_idна наш User ID. - Создаём схему тегов, затем импортируем аудиторию батчами, проверяя каждый батч.
- Отправляем тестовый push небольшой контрольной группе и сверяем результат с ожидаемым.
- Отчитываемся: сколько подписок было в файле, сколько импортировано и причина для каждой пропущенной строки.
6. Выпустите Pushwoosh SDK в следующем релизе приложения
Импорт делает существующую аудиторию доступной сразу, но это мост, а не конечная точка. Только Pushwoosh SDK внутри вашего приложения может подхватить новый токен, когда ОС его ротирует (переустановка, восстановление, апгрейд ОС), регистрировать пользователей, которые устанавливают приложение после миграции, и репортить открытия, in-app сообщения и удаления приложения.
Удалите OneSignal SDK в том же релизе. Два push SDK в одной сборке конкурируют за одни и те же notification callbacks, и мы не тестируем такую комбинацию. Пока OneSignal продолжает отправлять сообщения во время раскатки новой сборки — это нормально и ожидаемо; держать оба SDK внутри одной сборки — нет. Шаги по конкретным платформам — в разделах «Вариант A–C» ниже.
7. Web push: как возвращаются ваши подписчики
Web push не импортируется, и это жёсткое техническое ограничение, а не решение Pushwoosh. Подписка web push подписана парой VAPID-ключей того, кто её создал, а приватный ключ OneSignal никогда не покидает OneSignal — в их собственной документации ключи web-подписки помечены как доступные только SDK OneSignal. Ни один провайдер не может импортировать web-подписки другого провайдера. Вместо этого работает незаметная повторная подписка:
- Удалите сниппет OneSignal и явно отмените регистрацию его service worker. Если оставить старый worker на месте, два worker’а начнут конкурировать на одном домене.
- Установите Pushwoosh Web Push SDK с нашим service worker в корне вашего домена.
- Инициализируйте его с вашим application code и вашим device API token (
apiToken), затем включите автоматическую подписку (autoSubscribe: true, либо вызовитеPushwoosh.subscribe()). Без токена вызовы SDK будут возвращать 401.
Вернувшийся посетитель после этого подписывается заново незаметно для себя. Разрешение на уведомления, которое хранит браузер, принадлежит вашему домену, а не предыдущему провайдеру, так что второй запрос не появляется, и пользователь ничего не замечает. Скорость восстановления базы зависит от того, как быстро люди возвращаются: обычно основная часть аудитории возвращается в течение недели, с хвостом в течение следующего месяца.
Три случая, о которых стоит знать:
- Посетители, заблокировавшие уведомления, не могут быть подписаны заново. Браузер отказывает и больше не будет их спрашивать. Они остаются вне базы — и это правильный итог.
- Посетители, которые отписались на вашем сайте, но при этом разрешение браузера осталось выданным, будут подписаны заново незаметно для себя. Технически всё корректно, но это возвращает людей, которые ушли осознанно. Если у вас есть suppression-лист (по вашему user id или email), пришлите его нам — мы исключим этих пользователей из каждой кампании. Если списка нет, рекомендуем подписывать по явному клику (колокольчик или запрос), а не автоматически.
- Если ваш web push работал на поддомене, предоставленном предыдущим вендором, а не на вашем собственном домене, разрешение принадлежит этому поддомену. Таких подписчиков вернуть нельзя — им придётся подписаться заново на вашем сайте. Проверьте, какая у вас настройка, прежде чем планировать переход.
8. Чего ожидать после импорта
- Устройство может ненадолго появиться дважды. Импортированная запись несёт идентификатор OneSignal; когда на том же устройстве запускается наш SDK, оно регистрируется под собственным идентификатором. Устаревшая запись удаляется отслеживанием удаления приложения или автоматической очисткой неактивности через 90 дней. Указание
external_user_idтем временем удерживает обе записи в рамках одного профиля пользователя. - Мёртвые токены уходят на первой же кампании. Apple и Google раскрывают, что токен недействителен, только когда сообщение реально отправлено, так что первая отправка после миграции заодно чистит вашу базу.
- Импортированное число будет меньше, чем счётчик в OneSignal. Строки отписавшихся, строки с пустым токеном и строки web push исключаются намеренно. Наш отчёт точно показывает, сколько попало в каждую группу.
9. Куда кликать
Точные пути для пунктов на вашей стороне, чтобы никому не пришлось искать их по дашбордам.
| Задача | Путь клика |
|---|---|
| OneSignal: экспортировать аудиторию | Audience > Subscriptions > опциональный фильтр по сегменту > column picker > Export |
| OneSignal: App ID и API key | Settings > Keys & IDs. Возьмите App ID и App API key; в запросе экспорта он передаётся как Authorization: Key <App API key> |
| Apple: APNs Auth Key | developer.apple.com > Certificates, Identifiers & Profiles > Keys > + > Apple Push Notification service (APNs) > Continue > Register > Download. Файл .p8 скачивается только один раз; Key ID — на том же экране, а Team ID находится в Membership details. |
| Firebase: service account JSON | console.firebase.google.com > your project > иконка шестерёнки > Project settings > Service accounts > Generate new private key |
| Huawei: App ID и App Secret | AppGallery Connect > My projects > your project > your app > Project settings > App information |
| Pushwoosh: application code и device API token | Control Panel > your application > Settings > API Access. Токен должен иметь права для этого приложения. |
| Ваш сайт: удалите старый worker | Удалите файлы service worker OneSignal из корня сайта и отмените регистрацию запущенного worker'а: navigator.serviceWorker.getRegistrations().then(rs => rs.forEach(r => r.unregister())) |
Authorization: Key <App API key>navigator.serviceWorker.getRegistrations().then(rs => rs.forEach(r => r.unregister()))Чек-лист до 1 октября
Держите это открытым по ходу дела. Ничего здесь не требует скачивания форм.
- Экспорт отправлен нам, либо переданы app_id и App API key, чтобы мы вытянули его сами
- Push-credentials отправлены: APNs key, FCM service account JSON, HMS-ключи, если используются
- Каналы email и SMS настроены с нами, если вы переносите этих подписчиков
- Таблица проверки тегов возвращена, неиспользуемые теги удалены, многозначные — отмечены
- Фильтры сегментов отправлены нам (скриншоты подойдут) для пересборки
- Pushwoosh SDK интегрирован в тестовую сборку, тестовый push получен
- Импорт завершён, отчёт об импортированных и пропущенных проверен
- Web Push SDK работает, старый service worker деактивирован — если вы используете web push
- Тестовая доставка чистая на продакшн-сборке
- Отправка переключена на Pushwoosh, отправка из OneSignal остановлена
Вариант A: нативные iOS и Android
iOS. Добавьте Pushwoosh iOS SDK, затем задайте два ключа в Info.plist: Pushwoosh_APPID с вашим application code Pushwoosh и PW_API_TOKEN с вашим device API token. Вызовите registerForPushNotifications() там, где сейчас вызывается запрос разрешения OneSignal, и сверьтесь с iOS quick start за точным сниппетом инициализации для вашей версии SDK. Удалите OneSignal SDK и его вызов регистрации, чтобы оба SDK не запрашивали токены одновременно.
Android. Добавьте зависимость com.pushwoosh:pushwoosh-firebase, затем добавьте две записи meta-data внутри тега <application> в AndroidManifest.xml: com.pushwoosh.appid с вашим application code и com.pushwoosh.apitoken с вашим device API token. Вызовите Pushwoosh.getInstance().registerForPushNotifications() из вашей логики инициализации. Конфигурация Firebase остаётся как есть, с google-services.json в проекте; FCM-credentials идут в Control Panel в настройках вашей Android-платформы.
Задавайте теги через setTags(), а идентификатор пользователя — через setUserId() в тех же местах, где вызывали аналоги OneSignal, чтобы сегментация продолжала работать после замены.
Вариант B: Flutter и FlutterFlow
FlutterFlow оборачивает Pushwoosh Flutter SDK, так что миграция — это в основном конфигурация, а не код.
- Добавьте пакет Pushwoosh Flutter как кастомную зависимость в проект.
- В кастомном action инициализируйте SDK с вашим application code и зарегистрируйтесь на push-уведомления, следуя Flutter quick start для текущего API инициализации.
- Задайте нативные credentials так же, как в любом Flutter-приложении:
Pushwoosh_APPIDиPW_API_TOKENвInfo.plistдля iOS,com.pushwoosh.appidиcom.pushwoosh.apitokenвAndroidManifest.xmlдля Android. - Удалите интеграцию OneSignal, чтобы оба SDK не регистрировались одновременно.
- Мапите теги и user id через
setTags()иsetUserId()в ваших custom actions.
Вариант C: React Native
- Установите плагин:
npm install pushwoosh-react-native-plugin --save, затемpod installдля iOS. - Инициализируйте и зарегистрируйтесь в корневом компоненте:
import Pushwoosh from 'pushwoosh-react-native-plugin';
Pushwoosh.init({ pw_appid: "YOUR_APPLICATION_CODE" });Pushwoosh.register();- Добавьте device API token нативно:
PW_API_TOKENвInfo.plistдля iOS,com.pushwoosh.apitokenкак meta-data вAndroidManifest.xmlдля Android. На Android оставьтеgoogle-services.jsonв проекте — сами FCM-credentials хранятся в Control Panel. - Удалите пакет OneSignal React Native и его вызов инициализации.
- Перенесите теги и user id через
setTags()иsetUserId()из API плагина.
Свяжитесь с нашей командой — поможем с переходом.
FAQ
Вопросы на любом этапе — к вашему onboarding-контакту в Pushwoosh. Мы предпочитаем ответить до импорта, чем сверять цифры после него.