Месяц Кубыша в App Store: 4 тысячи показов, 155 установок и 52 товарища из Шанхая

от автора

В прошлый раз я рассказывал, как продакт без привлечения разработчиков, собрал приложение для личных финансов и довел его до публикации в App Store. Та статья заканчивалась на самом интересном месте, надо было понять, нужно ли это приложение кому-то кроме меня.

Прошел месяц. Докладываю обстановку)

Сначала цифры, они оказались неоднозначными

9 июля приложение появилось в сторе. И я никому не сказал: ни поста, ни рекламы, ни рассылки друзьям. Хотелось посмотреть, что произойдет само.

За месяц: 4 тысячи показов в поиске App Store и 155 установок при нуле рублей на продвижение. Люди просто искали что-то про бюджет и цели и находили в том числе меня. Честно говоря, я такого не ждал. И думаю что принял верное решение делать iOS приложение, а не миниапп в тг/web версию.

Дальше интереснее. Apple говорит 155 установок, а моя самописная аналитика показывает 212 человек. Разрыв в 57

Сначала я списал это на разницу подсчета: Apple считает уникальные Apple ID, я считаю устройства. Потом посмотрел, подробнее что это за люди. Оказалось за месяц бэкенд зарегистрировал 229 установок, и 52 из них пришли с локалью en_CN и таймзоной Asia/Shanghai

Похоже Китай не перестает искать «что переизобрести», хотя из 52 китайских товарищей до конца онбординга не дошел ни один.

212 минус 52 это 160. У Apple 155. +-Сходится идем дальше.

Кстати, про Хабр. Первая статья вышла 5 августа и за 2 часа собрала 3100 просмотров — приятно) Хотя установок в тот день было 16 при обычных 5-8, то есть статья принесла примерно 5-10 человек — вывод: охват и трафик это разные вещи -_-

Что успели сделать за месяц

Эта часть мне самому нравится больше всего. За месяц вышло 5 версий в App Store, с 1.1 одиннадцатого июля до 1.4 третьего августа, и 2-3 десятка сборок в TestFlight. Внутри 297 коммитов, 339 измененных файлов и плюс 32 тысячи строк.
Нас при этом трое: 2 IC и дизайнер.

Что появилось у людей:

Внесение трат скриншотом из банка. Кидаешь скриншот с операциями из своих банков, приложение само: вытаскивает операции, раскидывает по категориям и выбирает источник списания(плановые траты или кошелек) + позже научились разбирать и фото экрана кассы самообслуживания, прямо в магазине.

«Могу ли я себе это позволить?» Моя любимая фича. Вводишь сумму покупки и сразу видишь: хватает ли денег, откуда они возьмутся и что будет с целями, если сумма крупная. Мелкая покупка при этом больше не пугает разговорами про отпуск, а если денег не хватает, приложение показывает, когда хватит, и предлагает альтернативу.

Агент в чате, поумнел. Кубыш отвечает не общими словами про финансовую грамотность, а по твоему конкретному плану, тратам и целям — ошибок еще много, но пользовательская активность говорит, что как таковой чат не особо популярен.

«Загляни в будущее» Выбираешь дату и видишь, сколько накопишь к ней по текущему плану.

Математика подушки с премиями. Оказалось, самое муторное и гемморойное во всем проекте: приоритеты целей, желаемые даты и прогнозные даты долго не хотели жить вместе. А когда я решил, что закончил решил, что премии тоже важны и это прям редбосс. Наверно неделю мучал учет разовых и регулярных премий — как итог пришлось переделывать мат модель.

Короче, работы было вагон и маленькая тележка. Дошло до смешного. Файл с описанием изменений разросся до 194 тысяч символов, а накопительное «Что нового» для карточки App Store перестало влезать в лимит Apple в 4 тысячи символов, и перед публикацией приходится выкидывать пункты, чтобы уместиться.

Если интересно подробнее глянуть состав релизов или вам интересно развитие проекта подписывайтесь в тг: @kubyshka_user
Канал новый и сейчас там всего 26 человек — рекламы и маркетинга нет, поэтому будет интересно, что даст Хабр.

Мякушка — ранее я писал, что мне интересно до какого момента смогу дойти без привлечения разработки. Так вот с кодингом пока проблем нет, но вот по части DevOps/etc

есть проблема которую не смогли решить ни Claude ни Codex 0_о

TLS с SNI не проходит с мобильных сетей, а по IP проходит. Что это?

Это уже вышло за рамки первого месяца, но началось там же, и до сих пор не закрыто. Тут мне очень нужен совет, потому что спрашивать особо не у кого: знакомые разработчики, к которым я приходил, отвечают примерно одинаково, мол если ИИ не решил, то дальше вилы. А ИИ пока не решил.

Что есть. iOS-приложение со своим API. Бэкенд: FastAPI за nginx, VPS в Петербурге, сертификат Let’s Encrypt, TLS 1.2 и 1.3, домен в зоне .com, DNS на Cloudflare без проксирования.

Симптом. С российских мобильных операторов (Мегафон, МТС, Билайн, Москва) приложение не может достучаться до своего API. На проводных каналах все работает.

Замеры с физического устройства, ВПН и Private Relay выключены:

  • https://<домен>/v1/health с мобильной не открывается, с Wi-Fi работает

  • https://<второй-домен>/v1/health то же самое

  • https://<IP>/v1/health открывается с мобильной. Сертификат не совпадает, но соединение устанавливается

  • http://<IP>/v1/health открывается, отвечает nginx

Второй домен я завел за час до проверки, он физически не мог заранее попасть ни в какие списки. Блокируется так же.

С внешних узлов в России (check-host, Москва и Петербург) домен отвечает 200 за 0,07-0,33 секунды. DNS исключен: 4 публичных резолвера отдают верный адрес, 20 запросов из 20. DNSSEC на зоне не включен.

Главное наблюдение. Соединение к тому же серверу, на тот же порт, с тем же сертификатом проходит, когда имя не передается в рукопожатии, и не проходит, когда передается. Причем блокируется любое наше имя, включая только что созданное.

Что пробовали, и не помогло:

  • переезд с зарубежного хостинга (Амстердам, через туннель Cloudflare) на VPS в России со своим TLS

  • 2 смены IP сервера. Первый адрес действительно был недоступен у части операторов, замена помогла на проводных каналах, на мобильных нет

  • смена доменной зоны. Прежняя зона .app блокировалась целиком: не открывались ни поддомены, ни корень, при этом чужие сайты в .app открывались. После переезда в .com картина повторилась

  • перенос DNS с хостера на Cloudflare. У прежних NS ловил провал, когда все 4 публичных резолвера разом отдавали пустой ответ. Резолв стал стабильным, доступность не изменилась

  • запасной путь в приложении: при отказе связи ходить на IP вместо имени, с проверкой сертификата против нашего домена, доверие при этом не ослаблено. Работает, но нестабильно, и это очевидно лечение симптома

Со стороны сервера. В nginx включен лог с именем виртуального хоста. С мобильных адресов приходят фоновая синхронизация и события, все 200, а запросов от экранов, где проблема, нет вообще, ни с каким кодом. До сервера они не доезжают.

Вопросы, ради которых я это все и пишу:

  1. Что вызывает такую реакцию? Похоже на фильтрацию по SNI, но блокируется имя, созданное час назад. Реагируют на сочетание имени с конкретным адресом? На параметры рукопожатия?

  2. Есть ли смысл менять площадку хостинга, или адрес тут не главное?

  3. Работает ли российский CDN перед API мобильного приложения как решение? У кого держится?

  4. Есть ли способ надежнее клиентского костыля, такой, что не развалится от следующего изменения у оператора?

  5. Расскажите как вы решали проблему доступности для пользователей LLM API OpenAI/Antropic из Российских адресов?

Готов дать дополнительные замеры: трассировки, дампы рукопожатия, проверки с конкретных операторов. Буду благодарен за любой практический опыт, даже за «мы пробовали, не сработало».

В общем, месяц вышел прикольный. Приложение живет, люди приходят сами, продукт меняется каждую неделю, а про свои цифры я узнал больше, чем за все время до релиза.

Приложение: https://apps.apple.com/us/app/кубыш-личные-финансы-бюджет/id6778792103?ppid=d792ffaa-fc24-40f0-a39c-89ea82995646

ссылка на оригинал статьи https://habr.com/ru/articles/1078768/