Блог · · 7 мин

← Все записи

Скоринг кошелька: двадцать пять секунд против одной

Граф связей транзакций в интерфейсе Bitscore

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

ПРОДУКТГИПОТЕЗЫUXФИНТЕХ

Двадцать пять секунд на чужом ноутбуке

Bitscore мы строили как платформу KYT/AML-аналитики для крипторынка: человек вставляет адрес кошелька, мы обходим граф его связей и говорим, с кем этот кошелёк рядом стоял — санкционные адреса, миксеры, биржи без верификации, 248 категорий риска. Я был кофаундером и отвечал за продукт, то есть в том числе за демонстрации.

Про разрыв я знал с первого дня: у лидеров рынка тот же результат приходил за секунду, 25 против 1, и такое не отыгрывается ни интерфейсом, ни отчётом. На третьей демонстрации я увидел другое — как именно мы теряем этого клиента.

Я смотрел не в экран, а в лицо человеку напротив. Он вставил адрес, нажал кнопку и стал ждать. Через 7 секунд он взял телефон. Через 15 что-то в нём листал. Отчёт вышел хороший, с графом и категориями, но к этому моменту клиент был уже не с нами. Он не считал секунды. Он ушёл вниманием и вернулся с готовым вопросом, почему у нас так долго, если у ребят до нас всё появлялось сразу.

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

Где мы их теряли

К разработчикам я пришёл не с вопросом «почему медленно», а с просьбой разложить эти 25 секунд по шагам. Картина оказалась ровно такой, какой я её и опасался увидеть: на наш собственный код приходилось меньше 3 секунд. Всё остальное уходило в сеть — запрос к внешнему провайдеру данных, ожидание ответа, следующий хоп, снова ожидание, и так по всей глубине обхода.

За счёт чего живут те, у кого секунда, объяснять мне было не нужно: они держат собственные ноды блокчейнов и читают данные у себя, а не ходят наружу на каждом шаге. Я сел считать, во что то же самое обойдётся нам, и смета вышла такая, что её было неловко показывать. Нода — это железо, от 3 до 15 тысяч долларов в месяц за штуку, и нужна она на каждый блокчейн отдельно. Блокчейнов у нас было 6, и на каждый по-хорошему требовалась не одна машина. Около 100 тысяч в месяц, если округлять в нашу пользу.

Разработчики сказали, что в текущей архитектуре задача не решается, и я до сих пор считаю, что они были правы. Ускорять там было нечего: мы могли бы вылизать те самые 3 секунды и не приблизиться ни на шаг.

А через месяц был инвесткомитет. Прийти туда с просьбой о 100 тысячах в месяц означало не получить транш, а услышать вежливое предложение свернуться: инвестор в такой момент считает не технологию, а сколько ещё раундов уйдёт на то, чтобы догнать тех, кто поставил эти ноды три года назад. Я примерно представлял, как пройдёт эта встреча, и мне не нравилось ничего в этой картине.

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

Сорок восемь человек и заранее готовый отчёт

Первое, что я захотел проверить, звучало почти обидно для конкурентов: а нужна ли вообще эта секунда. Проверку кошелька человек интуитивно считает тяжёлой работой — где-то обходится граф, данных много, — и, похоже, готов подождать. Вопрос был не в том, готов ли, а в том, сколько.

Мерить это на живом продукте бессмысленно, поэтому мы отвязались от расчёта совсем. Отчёт был готов заранее и лежал наготове, менялось только время, через которое он появлялся на экране. 6 отметок: 30 секунд, 25, 20, 15, 10 и 5. По 8 человек на каждую, 48 сессий за две недели.

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

Граница нашлась между 15 и 10. Выше начинались раздражение и вопросы, работает ли оно вообще. А ниже не происходило ничего: результат на 5 секундах нравился людям так же, как на 10, и никакого дополнительного восторга мы не покупали.

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

Зато после этого замера задача выглядела совершенно иначе. Догонять лидеров не требовалось. Требовалось дойти с 25 секунд до 10, то есть отыграть 15, и это уже была работа, а не приговор. Забавно, что позже я наткнулся у Нильсена в пределах времени отклика ту же цифру — 10 секунд как границу, за которой внимание уходит. У него она была верхней, у нас оказалась достаточной.

Глубину скоринга отдали пользователю ползунком

Этих 15 секунд взять было неоткуда — если считать так же, как раньше. Но считали мы не одним куском: скоринг у нас идёт волнами. Сначала прямые связи, до 10 хопов, это быстро. Потом непрямые, до 100, и вот они съедают всё время. Внутри продукта это разделение было всегда, наружу его никто не выводил, и я не видел причин, почему бы не вывести.

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

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

Но настоящий фокус был не в ползунке. Полный скан до 100 хопов мы начинали в фоне сразу, не дожидаясь, пока человек до него доберётся. Пока он читал первый результат и тянулся к ползунку, у нас в фоне успевало отработать 5–7 секунд настоящего расчёта. Действие, которое по всем учебникам должно было стоить нам конверсии, стало местом, где мы забирали секунды.

Проверяли мы это тем, чем гипотеза могла провалиться: смотрели долю сессий, доходящих до полного скоринга. Если лишний шаг мешает, она обязана просесть. Она не просела, а ползунок двигали 9 из 10. Пара человек потом сказала: нормально, я же вижу, что там глубже копают.

Вместо лоудера — анимация растущего графа

До десяти секунд мы дошли, но осадок остался — эти 10 всё равно надо было чем-то занять. Стандартный лоудер занимать их отказывался, он умеет сообщать одно слово: подождите.

Я пришёл к Даше, нашему дизайнеру, с задачей, сформулированной от обратного: не занять паузу, а показать в ней работу. Данные для этого у нас были — обход отдаёт промежуточные результаты по ходу, мы их просто выбрасывали по дороге к экрану.

Даша придумала, как это выглядит, и получилось лучше, чем я себе представлял: в центре узел кошелька, от него ветки к найденным адресам, рядом счётчик обойдённых адресов и текущая глубина. Каждая связь появлялась в тот момент, когда обход её действительно находил.

Скажу честно, потому что иначе это будет реклама: смысла в этих промежуточных данных не было никакого. Половина графа не позволяет принять ни одного решения, и мы не делали вид, что позволяет. Работало не содержание, а то, что ящик перестал быть чёрным.

Сравнили в тех же сессиях: одинаковые 10 секунд, у 24 человек старый лоудер, у 24 — анимация. Вопрос «оно вообще работает» на старом лоудере задали 11 человек из 24. На анимации — ни один.

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

На комитет мы пришли с одним слайдом, на котором отказы по причине «медленно» падали с 80 до 20%, то есть на 60 пунктов. Про ноды никто не спросил ни разу. Я готовился объяснять, почему мы не можем позволить себе инфраструктуру, и объяснять не пришлось.

+25 сек → 10 сек — воспринимаемое ожидание | −60 пунктов — отказы «медленно» | $2 000 — весь бюджет решения

Обошлось это в 2000 долларов фонда оплаты труда: Даша и две недели фронтендера. Свои ноды за один месяц съели бы больше, чем всё решение целиком, и требовали полугода на разворачивание.

Продуктовое решение не спорит с техническим ограничением, а меняет задачу так, чтобы ограничение перестало быть на пути. Ноды догоняют конкурента по секундам; гипотезы догоняют его по впечатлению от продукта.

Если убрать отсюда цифры, останется вот что. Считать быстрее мы не могли и перестали пытаться. Вместо этого мы поняли, чего человек ждёт, и дали ему это. Ждать он был готов. Не готов был сидеть перед пустым экраном и гадать.

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

Павел Мальцев, гравюрный портрет

Обсудим задачу?

Роль CPO / Head of Product, партнёрство или консультация по product discovery. Пишите в Telegram — отвечаю быстро.