Мобильное приложение для «Амурфармации»
Предложения 90+ аптек амурской области — в одном приложении
Мобильное приложение для «Амурфармации»
Предложения 90+ аптек амурской области — в одном приложении
«Амурфармация» — одна из крупнейших и старейших аптечных сетей в Амурской области и на Дальнем Востоке России. Кроме 90+ офлайн аптек в 34 городах у сети также есть сайт, где можно заказывать медикаменты с быстрой доставкой по региону — его мы разработали в 2022 году.
За это время мы успели сделать несколько глобальных доработок:
В далеком 2022-м заказчик решил отложить создание мобильного приложения, чтобы сосредоточиться на запуске сайта и обкатке соответствующих бизнес-процессов — тогда мы обошлись адаптивной версией. Но когда доля заказов с мобильных устройств перевалила за 80%, ждать больше было нельзя. Так началась разработка приложения, чтобы закрыть сразу несколько задач:
За это время мы успели сделать несколько глобальных доработок:
- Например, появился функционал «удаленных складов». Теперь у товара две цены: одна, если заказать сегодня в ближайшую аптеку, другая — если немного подождать и забрать позже (и тогда будет дешевле) — похожая история есть на сайте сети «Читай город».
- Мы пересмотрели логику корзины и оформления заказа и сделали их редизайн.
- Добавили AnyQuery в поиск, чтобы повысить релевантность результатов и увеличить конверсию.
В далеком 2022-м заказчик решил отложить создание мобильного приложения, чтобы сосредоточиться на запуске сайта и обкатке соответствующих бизнес-процессов — тогда мы обошлись адаптивной версией. Но когда доля заказов с мобильных устройств перевалила за 80%, ждать больше было нельзя. Так началась разработка приложения, чтобы закрыть сразу несколько задач:
- облегчить процесс заказа для пользователей, которым привычнее и удобнее пользоваться смартфоном;
- соответствовать трендам рынка и не отставать от конкурентов: в регион уже зашли федеральные сети вроде «Аптека.ру» и «ЕАптека», поэтому было важно не отставать от них (и даже — их превзойти).
Аналитика
Хотя перед созданием сайта для заказчика мы уже проводили аналитику, здесь без нее тоже не обошлось. Мы выяснили, что целевая аудитория приложения — пользователи 25−55 лет, совершающие регулярные заказы медикаментов. Для них особенно важны простой поиск и заказ лекарства, удобный выбор аптеки и получение уведомлений.
Поэтому при разработке в приоритете должны быть три вещи:
Кроме этого, заказчику были важны:
Чтобы всё это реализовать, мы приняли решение перенести ключевые блоки сайта в мобильное приложение.
Поэтому при разработке в приоритете должны быть три вещи:
- простота интерфейса — чтобы пользователь независимо от возраста одинаково легко мог найти нужное и сделать заказ;
- логичная структура каталога, которая учитывает все нюансы работы аптечной сети в онлайне и офлайне;
- скорость работы — ключевой параметр в век, когда люди привыкли получать искомое за доли секунды или уходить к конкуренту.
Кроме этого, заказчику были важны:
- преемственность дизайна: визуал должен быть узнаваем, как на уже привычном для пользователей сайте сети;
- синхронность с ERP-системами, сайтом, 1С и внешними сервисами (MindBox);
- кроссплатформенность (Android, iOS, Huawei) и выкладка в RuStore.
Чтобы всё это реализовать, мы приняли решение перенести ключевые блоки сайта в мобильное приложение.
Прототипы и дизайн
Самое важное в хорошем приложении — его структура: четкая, понятная и абсолютно логичная с точки зрения пользователя. Поэтому мы начали именно с нее:
- продумали логику работы главного экрана и всех разделов;
- проработали карточки товара с дополнительными блоками «Вместе покупают» и «Похожие товары» — эти блоки здорово влияют на итоговый чек;
- отшлифовали путь пользователя в корзине и при оформлении заказа.

Игорь
Руководитель проекта
— На этапе прототипирования нам удалось убедить заказчика отказаться от отображения двух цен в каталоге (купить сейчас или позже, но дешевле) — мы унесли это внутрь карточки товара. Тем самым нам удалось сократить путь оформления заказа в мобильном приложении до 2 шагов, не потеряв при этом функциональности.
Дизайн сделали чистым, понятным и не перегруженным: лишь добавили немного «волнистых» форм на главном экране как отсылку к морю и волнам по просьбе заказчика. UI сделали минималистичным и функциональным: без «галерей товаров», акций и лишнего визуального шума — оставили только то, только то, что нужно пользователю. Вишенка на торте — удобный выбор города, аптек и доступ к каталогу из любого места приложения.

Николай
Гребенников
Гребенников
Заместитель генерального директора ОАО «Амурфармация»
— Волнистые линии, которые используются в дизайне приложения, мы перенесли в офлайн и теперь используем эти элементы в оформлении вывесок и внутренних пространств аптек.


Алексей
Дизайнер
— Заказчик утвердил дизайн практически без правок, особенно высоко оценив корзину и карточку товара. Фишкой дизайна стало отображение штрих-кода бонусной программы на экране загрузки приложения: с ним легко предъявить карту в аптеке, даже если есть проблемы с мобильным интернетом.
Стек технологий
Для разработки мы выбрали React Native, потому что он позволяет создавать сборки для и для iOS и для Android, поддерживая одну актуальную кодовую базу мобильного приложения. Это экономит время и бюджет заказчика, ведь альтернативная такому подходу разработка нативных приложений (когда код пишется отдельно для iOS и для Android) в два раза удорожает процесс и поддержку проекта, ведь нужно поддерживать каждую ветку приложения.

Игорь
Руководитель проекта
— Вся логика ключевых блоков «Амурфармации» уже была обкатана на сайте — нам лишь оставалось аккуратно перенести её в мобильное приложение с учетом специфики проекта и самого приложения. А специфики на проекте хватает — даже Ozon подсматривает за нами и копирует нашу логику удаленных складов :)
Чтобы заново не разрабатывать логику, уже реализованную на сайте, мы использовали его бэкенд и для мобильного приложения. Таким образом у сайта и приложения общая админ-панель и единые интеграции с внешними системами. А чтобы «сшить» уже готовый бэкенд с фронтендом, приложения мы написали более 120 методов restAPI.

Роман
Разработчик
— Мы заранее разбили всю логику интернет-магазина на REST-эндпоинты (URL-адреса, к которым отправляются HTTP-запросы на сайт) по контроллерам: главная страница, каталог, корзина, оформление заказа, личный кабинет и т. д.
При таком подходе каждый экран мобильного приложения получает только необходимые данные, легко кешируется и масштабируется без лишней нагрузки на приложение. Это позволило меньше отвлекаться на бэкенд во время разработки и значительно ускорить интеграцию дизайна с бизнес-логикой.
При таком подходе каждый экран мобильного приложения получает только необходимые данные, легко кешируется и масштабируется без лишней нагрузки на приложение. Это позволило меньше отвлекаться на бэкенд во время разработки и значительно ускорить интеграцию дизайна с бизнес-логикой.
Корзина и оформление заказа
Это самое сложное место приложения за счет разных цен (при покупке в моменте или с ожиданием, но дешевле), товарами-аналогами и удаленными складами. Сложность ещё и в том, что в 90+ аптеках сети по четыре цены на каждый товар — суммируя, мы получаем около 3 миллионов цен, которые «крутятся» на сайте ежесекундно. Но мы пошли дальше и для мобильного приложения сделали отдельные цены — это было важно для заказчика с точки зрения продвижения.

Роман
Разработчик
— В приложении предусмотрены шесть цен: четыре базовые (обычная и акционная на сайте, цена в аптеке и с удалённого склада) и две эксклюзивные для мобильного приложения — обычная и акционная. Дополнительные мобильные цены мы внедрили для стимулирования установки и регулярного использования приложения пользователями, при этом вся остальная логика формирования цен и расчёта скидок совпадает с веб-версией.
Чтобы уместить столь мощный объем данных внутри корзины, потребовался продуманный интерфейс. Мы перебрали несколько вариантов дизайна и расположения блоков, чтобы получилось действительно удобно и при этом не пострадала логика удаленных складов, начисления скидок и бонусов, выбора аптек и прочих нюансов.

Алексей
Дизайнер
— Из-за бизнес-логики с двумя ценами на один товар (а вместе с ними и удвоенными «старыми» ценами, бонусами и сроками ожидания) пришлось решать задачу повышенной плотности данных. На экран приходилось в два раза больше информации, чем в любом привычном интернет-магазине, поэтому важно было не просто её уместить, но и сохранить внимание пользователя, направляя его в нужную сторону.
Решение — минимализм. Мы убрали лишние пояснения, заменили текст иконками, аккуратно поработали с цветом и типографикой. Главным было не допустить превращения карточки товара в бухгалтерскую таблицу.
Через акценты и ритм удалось сохранить визуальную логику: карточка остаётся читаемой, а интерфейс — понятным, несмотря на усложнённые вводные.
Решение — минимализм. Мы убрали лишние пояснения, заменили текст иконками, аккуратно поработали с цветом и типографикой. Главным было не допустить превращения карточки товара в бухгалтерскую таблицу.
Через акценты и ритм удалось сохранить визуальную логику: карточка остаётся читаемой, а интерфейс — понятным, несмотря на усложнённые вводные.

Игорь
Руководитель проекта
— Сказать что корзина и оформление заказа «Амурфармации» — это «космос» — это ничего не сказать… Пожалуй, даже панель управления «Сокола тысячелетия» меркнет перед возможностями простого покупателя в нашем приложении :)
Поиск
Поиск — ключевой элемент взаимодействия с приложением, который принципиально важен потенциальному пользователю (сами попробуйте найти выписанный доктором препарат просто через каталог — сразу поймете — почему). Поэтому уже на этапе дизайна мы постарались сделать его максимально функциональным. А интеграция с AnyQuery, которую мы реализовали ещё на сайте, помогла сделать его ультрапродвинутым.

Кроме того, для удобства пользователя мы сделали поиск по заказам, реализовав его на базе Elasticsearch. Для этого создали отдельный индекс заказов и настроили многоступенчатый поиск — сначала по дате, затем — по полному номеру заказа, а в завершение — по наименованиям товаров и аптеке оформления, чтобы пользователь мог быстро найти любой свой заказ по любому из этих параметров. Решение оказалось настолько удачным, что позже мы перенесли этот функционал и на веб-версию сайта.
Авторизация
Самое бесящее для пользователя в любом сервисе — это авторизация. Особенно, когда после обновления приложения тебя разлогинивает, и её приходится проходить снова. А ещё — помнить наизусть все эти логины, почты, пароли. Брр! Мы сделали авторизацию по телефону, а также через соцсети с помощью «умных» диплинков.


Роман
Разработчик
— «Умные» диплинки для авторизации — специальные ссылки, которые вместо веб-страницы сразу открывают приложение. При входе через соцсеть пользователь в приложении переходит на сайт в браузере, где проходит привычный процесс авторизации. По его завершении сайт формирует диплинк с токеном и автоматически возвращает пользователя в приложение «Амурфармации» уже авторизованным — таким образом мы повторно используем уже существующий на сайте механизм.
Интеграция промокодов и систем скидок
Заказчику приходится создавать большое количество одноразовых промокодов для пользователей, поэтому мы предусмотрели функционал генерации промокодов по шаблону в админ-панели сайта. Заказчику он так понравился, что он попросил реализовать такой же для мобильного приложения. Сказано — сделано.

Кроме того, мы расширили логику работы корзины, добавив учёт источника заказа — из мобильного приложения, локального или удалённого склада — и прописали собственные правила применения акционных цен. Плюс реализовали гибкую бонусную систему с операциями увеличения, уменьшения, умножения и прочими «фишками», чтобы точно следовать бизнес-логике и сохранять прозрачность расчетов.
Оптимизация
По ходу разработки выяснилось, что битриксовый смарт-фильтр, который отвечал за фильтрацию на сайте, не вывезет нагрузку приложения: результаты он выдаёт слишком медленно. Поэтому потребовался «переезд» фильтра на ElasticSearch.
Ещё одна всплывшая проблема фильтра — тысячи значений: одних только дозировок там было больше 1000 вариантов. В итоге работали параллельно: с нас — переход на ElasticSearch, с заказчика — «чистка» и унификация значений фильтра.
За счет этого удалось значительно ускорить загрузку каталога. А работа самого фильтра стала быстрее в 6 раз.
Ещё одна всплывшая проблема фильтра — тысячи значений: одних только дозировок там было больше 1000 вариантов. В итоге работали параллельно: с нас — переход на ElasticSearch, с заказчика — «чистка» и унификация значений фильтра.
За счет этого удалось значительно ускорить загрузку каталога. А работа самого фильтра стала быстрее в 6 раз.

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

Роман
Разработчик
— Также в каталоге мы реализовали «быстрые» фильтры — интерактивные плашки на экране каталога, которые одним нажатием открывают нужный экран фильтра. Так пользователь сразу видит самые важные параметры (например, «Наличие в аптеке») без необходимости пролистывать весь список фильтров.
Оплата
Для оплаты внутри приложения решили интегрироваться с сервисом ЮKassa, но оказалось, что у него нет модуля для React Native. Поэтому нам пришлось собственноручно собрать рабочий SDK под неё, куда мы также добавили сканирование карт и запоминание платёжных данных.

Роман
Разработчик
— Мы нашли и скопировали себе устаревшую библиотеку ЮKassa для React Native — оригинального решения не было, а код библиотеки не работал на современной SDK платежного сервиса.
Я взял ее за основу и полностью адаптировал библиотеку под актуальные версии с поддержкой карт МИР и СберПэй. При этом доработки для Android были выполнены на Kotlin, а для iOS — на Swift и Objective-C.
Я взял ее за основу и полностью адаптировал библиотеку под актуальные версии с поддержкой карт МИР и СберПэй. При этом доработки для Android были выполнены на Kotlin, а для iOS — на Swift и Objective-C.
Пуш-уведомления
Пуши — крайне важная штука для е-коммерс: в мире, где потенциального покупателя атакует информация со всех сторон, вовремя и грамотно составленное пуш-уведомление может «приземлить» его именно в ваш интернет-магазин и заставить что-нибудь купить на выгодных условиях.
Для «Амурфармации» пуши тоже оказались крайне важными, поэтому мы сделали их настройки максимально тонкими: уведомления могут быть сервисными, рекламными, с текстом, с кнопкой и так далее. Кроме того, пуши можно отправлять из админ-панели Битрикса (куда они приходят из 1С): сразу всем или выбранным пользователям.
Для «Амурфармации» пуши тоже оказались крайне важными, поэтому мы сделали их настройки максимально тонкими: уведомления могут быть сервисными, рекламными, с текстом, с кнопкой и так далее. Кроме того, пуши можно отправлять из админ-панели Битрикса (куда они приходят из 1С): сразу всем или выбранным пользователям.

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

Игорь
Руководитель проекта
— Полезной оказалась возможность управлять настройками получения уведомлений для пользователя: есть важные пуши, которые пользователь может разрешить всегда, а остальные — отключить. Ну и главная их фишка: если пуш по какой-то причине не дошел до устройства, то сообщение продублируется в СМС.
Публикация в сторах
В ситуации, когда из популярных сторов то и дело удаляют приложения российских разработчиков (особенно из банковского сектора), загрузить туда своё становится задачкой со звездочкой.
В процессе публикации нас ждали длинные и долгие переписки с Google и Apple, в которых мы убеждали, что:
В итоге квест был пройден, и через три недели переписок приложение появилось в Google Play, App Store и RuStore.
В процессе публикации нас ждали длинные и долгие переписки с Google и Apple, в которых мы убеждали, что:
- мы предостерегаем пользователей от самолечения,
- у нас есть лицензии и разрешения на торговлю лекарствами,
- приложение не нарушает требований законодательства по продаже медикаментов,
- авторизация через Яндекс — работает (для этого даже пришлось прикладывать скриншоты).
В итоге квест был пройден, и через три недели переписок приложение появилось в Google Play, App Store и RuStore.


Игорь
Руководитель проекта
— Как итог мы реализовали функционально насыщенное, стабильное и удобное мобильное приложение. Этот кейс стал примером технической изобретательности, высокой слаженности команды и внимательного отношения к потребностям пользователя и клиента.