Рубрика развивается при поддержке

Стоит ли делать мобильное приложение

Часто заказывают мобильные приложения, даже не проверив, что этот бизнес-процесс нужен будущим клиентам. Как результат — работал в мусорку.

В закладки

А так как я занимаюсь именно заказной разработкой мобильных приложений, в портфолио остаются лишь картинки.

Есть куча способов проверить свою бизнес идею, от просто объявления и подачи телефона, например в авито, до лендингов и групповых чатов. Если у вас клиентская модель сервиса, достаточно лендинга по приемке заявки, а дальше ручками поработать 10-20 заявок. Если у вас раздача группе лиц, например курьерских заданий, групповой чат с публикацией туда заданий.

И вот вы проверили на 10-20 заявках, получили прибыль и бежите сломя голову тратить 300 - 500 тысяч рублей, чтобы проверенную модель реализовать уже в мобильном приложении, ведь 2-3 продажи, это доказательство, все 100% гарантия же.

Я бы не делал на 2-3 продажах какие-то выводы, это крайне мало, вдруг их всего возможно только 5 в месяц.

Дальше само собой руками уже будет накладно обрабатывать, ведь мы идем в масштабирование, надо немного автоматизировать. И тут я советую бот, например ВКонтакте, который будет автоматизировать те или иные процессы.

Разберем на примере

Разберем на часто встречаемой задаче: раздаче заявок курьерам. Тут есть 2-е подзадачи: проводить анкетирование и прием на работу и рассылка заданий прошедшим прием на работу.

Итак с рекламы пользователь переходит в сообщения сообществу по работе курьером и рассказывает что за работа, какие условия, как все будет происходить, что возить и прочее. Бот предлагает написать «Да», если пользователя все устраивает и заполнить небольшую анкету. Отлично у нас есть новая заявка приема на работу, уведомим администратора, так же сообщением из группы. Администратор просматривает профиль и анкету нового сотрудника и пропускает или утверждает его командой «утвердить и id пользователя». После этого бот уведомит новоиспеченного курьера что он принят на работу и скоро появятся новые заявки.

Администратор постит новые задания командой боту «задание и далее его текст» и все прошедшие утверждение получают его. Дальше само собой можно и нужно додумывать логику приемки в работу этого задания…

Так вот для реализации такого тестирования я реализовал небольшую заготовку, которую легко запустить и просто писать алгоритм действия на команды пользователя.

В роли серверной части я использую Firebase (облачный PaaS сервис от Google, который берет деньги по факту потребления услуги).

Мы будем использовать Cloud Functions для ответа серверу ВК, что же ответить пользователя и Realtime Database для хранения данных.

Считаем затраты

За Realtime Database с нас берут за скачиваемый трафик за каждый гигабайт 1$ и 5$ за хранение каждых 5Гб в базе данных. За Cloud Functions 0,4$ за 1 миллион вызовов функции.

Ну и давайте прикинем сколько 1 000 пользователей нам даст в затратах. Допустим анкету на 1000 символов он оставит и будет 300 (10 в день) команд в месяц писать. Администратор будет раздавать 100 заданий в день (3000 команд в месяц).

Итого на 1000 пользователей:

  • 1 Мб в хранилище, а у нас 1$ за 1 Гб
  • трафик вообще будет смешным, т.к. это максимум статусы текущего состояния пользователя, учитывать не стоит
  • 303 000 вызовов функции, при этом оплата 0,4$ за миллион

Следовательно заплатили бы вы меньше 1$, но Firebase предоставляет еще и бесплатный лимит на месяц, за который платить не нужно:

  • Cloud Functions 2 млн. вызовов в месяц бесплатно
  • Realtime Database 1 Гб хранилища и 10 Гб трафика бесплатно

Именно поэтому на мой взгляд Firebase идеален для стартапов, он берет деньги исключительно за потребление ресурсов, вы всегда можете вывести сумму, которую тратите на каждого пользователя и учитывать это в вашей Unit-экономике.

Кстати говоря мобильные приложения так же можно реализовывать с Firebase, поэтому протестировав на чат боте свою бизнес-логику можно продолжать и в мобильном приложении все с той же базой данных.

Ну и на финал немного о коде, который получился у меня в заготовке, я всю закулисную историю вынес в отдельный модуль, а в функционале оставил только самое нужное, тем нагляднее стала логика бота, посмотрите сами:

// событие входящего сообщения // message - ключ-значение входящего сообщения // session - ключ-значение хранилища пользователя // по результату необходимо вернуть объект // actionMessage - ответное сообщение пользователю // newSession - новые ключ-значения хранилища пользователя // userAction - событие для другого пользователя // user_id - id пользователя события // userAction - сообщение пользователю события // newSession - ключ-значение хранилища пользователя события // job - сообщение активным пользователям onAction(message: { [key: string]: any }, session: { [key: string]: any }): Promise<Core.ActionPromise> { const messageText = message.text; const messageTextUpperCase = message.text.toUpperCase(); const user_id = message.from_id; const isAdmin = (user_id === ChatBotComponent.adminID); const commands = messageText.toUpperCase().split(' '); const command = commands[0].toUpperCase(); const param = commands[1] && commands[1].toUpperCase(); return new Promise((resolve, reject) => { if (isAdmin && command === 'УТВЕРДИТЬ') { const actionMessage = `Сотрудник утвержден.`; const userAction: Core.UserAction = { user_id: param, actionMessage: `Вы приняты на работу, ожидайте новых заданий.`, newSession: { state: 4, active: true } }; resolve({ actionMessage, userAction }); } else if (isAdmin && command === 'ЗАДАНИЕ') { const actionMessage = `Задание отправлено.`; const job = param; resolve({ actionMessage, job }); } else if (!session.state) { // Стартовое сообщение от бота if (messageTextUpperCase === 'ДА') { // После команды Да ждем анкету сотрудника const actionMessage = `✏ Опишите ваш опыт работы курьером.`; const newSession = { state: 2 }; resolve({ actionMessage, newSession }); } else { // Приветствие нового сотрудника const actionMessage = `Добрый день.\nМы набираем исполнителей на работу курьером. Если вы хотите работать у нас, напишите "да" и мы предложим вам заполнить анкету.`; resolve({ actionMessage }); } } else if (session.state === 2) { // Принимаем анкету и уведомляем админа const actionMessage = `Ваша анкета принята, ожидайте результата.`; const newSession = { anketa: messageText, state: 3 }; const userAction: Core.UserAction = { user_id: ChatBotComponent.adminID, actionMessage: `✉ Новая анкета: ${messageText}\nДля приема на работу отправьте утвердить ${user_id}` }; resolve({ actionMessage, newSession, userAction }); } else if (session.state === 3) { // Анкета принята, ждите const actionMessage = `Ваша анкета уже была принята, ожидайте результата.`; resolve({ actionMessage }); } else if (session.state === 4) { // Ожидание новый заданий const actionMessage = `⏳ Новых заданий пока для вас нет.`; resolve({ actionMessage }); } }); }

Самое главное на мой взгляд это ряд преимуществ:

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

Исходники описанного сценария в статье прилагаю.

Тестируйте, запускайте, успехов Вам!

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Евгений Малаховский", "author_type": "self", "tags": [], "comments": 31, "likes": 17, "favorites": 121, "is_advertisement": false, "subsite_label": "services", "id": 84126, "is_wide": false, "is_ugc": true, "date": "Sun, 22 Sep 2019 11:31:08 +0300", "is_special": false }
Облачная платформа
Основа для цифровизации бизнеса
0
{ "id": 84126, "author_id": 53577, "diff_limit": 1000, "urls": {"diff":"\/comments\/84126\/get","add":"\/comments\/84126\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/84126"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 200396, "last_count_and_date": null }
31 комментарий
Популярные
По порядку
Написать комментарий...
34

Пойду посмотрю на сварку, чтоб глаза не так болели после просмотра кода.

Ответить
2

Ладно на хабре, но стартаперы то должны знать что говнокод - это последняя проблема (если вообще проблема 🙄).

Ответить
0

Согласен, но автор себя позиционирует не как стартапер, а как контрактер.

Ответить
0

такого уровня код долны учить писать в школах :(

Ответить
9

Все эти тарифы за потребление ресурсов могут влететь в копеечку. Будет у вас ошибка в коде или курьеры начнут раз в секунду обновлять данные и получите в конце месяца счет на $$$$. Проще сначала свой сервер за фиксированные $5 в месяц поднять на VPS

Ответить
0

Проще сначала свой сервер за фиксированные $5

В том и дело, что не проще, особенно если ты лишь мобильный разработчик. Ну а если дойдет до того, что приложение будет расти и пользоваться спросом, то как минимум нужна дополнительная пара рук, чтобы пилить бэкенд, заниматься бд и админить этот самый сервак. Даже если найти человека который будет заниматься всем этим за 1500$ в месяц, использовать готовый baas по типу firebase, думаю, выйдет если не дешевле, то не сильно дороже. Firebase не очень выгоден только когда речь о реально больших количествах данных, хотя есть много сервисов с миллионной аудиторией, которые будучи стартапами запускались на firebase, но так и не слезли с него, потому что выгода от своих серваков не столь значительна.

Ответить
2

MySQL поставьте бесплатный и забудьте на время про администрирование базы данных.

Ответить
1

Вам его всё равно придётся пилить. На модели старт-апа нужно уметь всё, а дальше, если выстрелит, то делегировать и расти

Ответить
2

На модели старт-апа нужно уметь всё

Нельзя все уметь, а уж тем более успевать. Если бы так просто было в одиночку пилить бэк, заниматься базой, админить, да еще и клиент делать мобильный, то всем этим не занимались бы отдельные люди. Да, на старте можно и самому все сделать, лишь бы работало, но более менее нормальный рабочий продакшн одна пара рук не потянет этого всего, даже если будет уметь. Вот в таких случаях и выручает firebase - не нужно париться о том, что не важно на первых порах. В конце концов ничто не мешает делать проект и расти на том же firebase, а как только проект окрепнет и будет понятно что он не мертворожденный, то в случае необходимости можно съезжать на свое железо. Но опять же, в очень редких случаях проект будет настолько большим, что будет выгода от использования своего железа с бэком и найма разработчиков перед firebase, который заменяет на первых порах минимум полторы а то и две пары рук, а если учесть и возможности легкого масштабирования, которые могут пригодиться в будущем, то заменяет еще две дополнительные и в том числе сильного инженера, которые в итоге ежемесячно будут обходиться в 10к долларов только по зарплатам, не говоря о прочих расходах.

Ответить
0

Вот в таких случаях и выручает firebase - не нужно париться о том, что не важно на первых порах.

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

Ответить
2

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

Ответить
1

Есть книга "Спроси маму" - про то, как проводить customer development интервью.  

Можно как угодно прототипировать, замерять интерес, хоть экраны нарисованные показывать и собирать заявки на "попробовать приложение",

Firebase, авторизация - это все сильно позже.

Ответить
0

Нет, не стоит. Куда удобнее нормальная мобильная версия в браузере.
Зачем плодить приложения, если можно пользоваться одним?

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

Ответить
1

Хз что они там допилили. С озоном сравните, как надо делать - все красиво и удобно.

Ответить
0

До некоторых вещей веб не дотянуть

Ответить
1

Таких вещей 0,1%. Остальное - типовуха. Но все прыгают по граблям, в итоге сторы забиты мертворожденными приложениями.

Ответить
0

А вот ситилинку приложение бы крайне не помешало

Ответить
0

Мобильное приложение нужно строго в одном случае - когда им удобнее пользоваться чем браузером.
Например, данному ресурсу нужно мобильное приложение? На мой взгляд абсолютно ненужно. Всё можно делать в браузере.

Ответить
0

Тогда вообще никакие приложения не нужны, кроме браузера? Ведь на html5 все что угодно можно сделать, что будет работать в браузере, но будет жрать трафик и при медленном интернете загружаться в 10 раз медленнее, чем мобильное приложение.

VC приложение как раз нужно, т.к. иконка на рабочем столе - это халявная реклама и постоянное напоминание + пуши можно слать. А от посещаемости напрямую зависит доход СМИ.

Ответить
1

Иконку любого сайта можно добавить на главный экран (пункт в браузере "Добавить на главный экран"). Пуши веб сайты тоже могут присылать в смартфон.

Ответить
0

На iOS сайты не могут пуши присылать (и очень хорошо). Много вы иконок сайтов на рабочий стол добавили?)

Ответить
0

Вы абсолютно правильно поняли посыл моего комментария. В большинстве случаев мобильное приложение не нужно.

Ответить
0

Я бы сказал наоборот.  Сайт не нужен.  Достаточно мобильного приложения.

Ответить
2

Спасибо. А десктопным пользователям что делать? Бибу полировать? Поколение смартфонных зомби, блин...

Ответить
0

Мы же не с точки зрения пользователей, а с точки зрения стартапа.

Вам не нужны все пользователи.  Вначале вам нужны те, которых получить наиболее дёшево, и с которых можно снять больше денег.

У Uber'а и Яндекс.Такси нет сайта (на самом деле есть, но он совсем не про то) — и никто не страдает.

У Facebook сайт есть, но если бы они были стартапом, сейчас они могли бы его не делать – 92% прибыли у них от приложения.

Да, потом, когда появятся ресурсы, можно и сайт запилить.

Ответить
0

Если вы о Яндекс-такси, то да. Если об vc, то нет. 

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

Ответить
0

Главное преимущество приложения — стоимость удержания пользователей.

Привлечь пользователя на сайт первый раз стоит примерно столько же, сколько заставить его установить приложение.

Но зато второй раз и дальше перевес в сторону приложения – снести установленное приложение морально тяжелее, чем просто не зайти ещё раз на сайт.

Ответить
0

Так и есть. Но мы же говорили о пользователях, об их потребностях.

Ответить
0

Ясно.  Нет, я говорил с точки зрения бизнеса, как и автор статьи.

Ответить
0

Ещё и на Яве свою годноту написали, автор ну зачем так некрофилить

Ответить
0

Это же TypeScript, а не Java.

И с каких пор её использование считается некрофилией?

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }