Неудачный проект: Checkmoney

Каждый разработчик должен написать свою CMS и трекер расходов. В 2019 году я сделал приложение для менеджмента личных финансов и словил несколько инсайтов.

Прелюдия

В начале 2019 года я работал в Breadhead и зарабатывал 130 тысяч рублей в месяц, плюс вел лекции в Нетологии, это приносило какие-то небольшие и нестабильные деньги. В сумме выходило около 2 тысяч евро в месяц по курсу того времени. Я перевёл свой доход в евро не только ради флекса, но и из-за того, что в феврале 2019 вместе с моей девушкой Машенькой и другом Вовой мы уехали из питерской зимы на Кипр.

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

  1. Концентрация на остатке. Сколько денег у меня осталось я представляю в любой момент времени. Мне важнее разобраться, куда они уходят.
  2. Кривая работа с валютами. Тогда я зарабатывал в рублях, тратил в евро. Хотелось чтобы все само собой конвертировалось по актуальным курсам и не требовало ручного управления.
  3. Необходимость заводить категории. Почему-то все приложения рассматривали категории доходов-расходов как отдельные сущности. Мне ближе была идея «комментариев» к транзакциям, которые потом машинным разумом превратятся в категории.
  4. Глупость анализов. Мне хотелось, чтобы приложение само понимало: сколько я могу потратить сегодня, сколько на выходных; предупреждало, если я начинаю тратить слишком много; подсказывало сколько стоит отложить от дохода; и так далее.

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

Почему не приложение банка? Во-первых, у меня несколько карт разных банков. Во-вторых, на Кипре я стал много платить наличными. В-третих, приложения банков не понимают, что одна трата может попасть в разные категории. Например, я потратил в супермаркете 100 евро, и 50 из них ушли на еду, а 50 на кухонную утварь.

Интерлюдия

Пара свободных вечеров, 5 долларов за дроплет на Digital Ocean, 5 долларов за домен и я начал пользоваться приложением. А потом я потратил еще несколько вечеров, чтобы занести туда все доходы за последние 7 лет жизни и расхода за полтора месяца 2019 года.

Внимательный читатель заметит, что в 2019 я жил совсем не по средствам

Немного про технологии

Фронтенд был совсем простым, куча шаблонного кода — взять данные из API, показать их в паре разных представлений, отправить запрос на создание транзакции. Баззворды: react, redux, final-forms, ant-design.

А бекенд делать было интересно.

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

class RemoteRatesRepository {
  _getExchangeRate = async (from, to) => {
    for (const client of this.clients) {
      const rate = client.getExchangeRate(from, to);

      if (rate) {
        return rate;
      }
    }

    return null;
  };
}

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

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

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

Еще там был сервис для определения, насколько пользователь вписывается в бюджет — сколько он может тратить каждый день, сколько потратил за последнее время, как это соотноситься с прошлым периодом.

export class ExtraSpendingAdviser {
  async giveAdvice() {
   // ...
   const [lastMonthStats, currentMonthStats] = await this.stats.fetchAmount(
      new DateRange(
        startOfMonth(subMonths(now, 1)),
        endOfMonth(now)
      ),
    );

    const expectedIncome = /* ... */;
    const expenses = Number(currentMonthStats.expenses);

    if (expenses <= expectedIncome) {
      return [];
    }

    return [
      {
        date: now,
        action: TipAction.ExtraSpending,
        meta: {
          difference: expenses - expectedIncome,
          currency,
        },
      },
    ];
  }
}

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

Дальше

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

Я принял решение прекратить развитие проекта в июле 2020 года. Во-первых, за эти полтора года я стал больше зарабатывать и мне стало не так интересно следить за расходами/доходами. Во-вторых, за это время я понял куда в основном уходят деньги, но менять это не хотел. В-третьих, после переезда на Пхукет я стал так много платить наличными, что записывание расходов превратилось в ад. Это нервировало и в итоге я прекратил пользоваться сервисом.

Я перестал пилить новые фичи, отказался от красивого домена и перевёз сайт на поддомен kamyshev.me, перетащил весь бекенд на самый маленький доступный дроплет. И конечно закрыл проект в Things — это стало для меня формальным завершением проекта.

Инсайты

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

Я же потратил столько сил! Это обязательно кому-нибудь пригодиться.

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

Почему проект не взлетел

Дальше будет мало фактов и много дилетантской аналитики, осторожно.

На мой взгляд, основная причина — непонятно зачем кому-то использовать его.

Дело в том, что основная ценность приложения — классные анализы — требует ручного внесения всех расходов и доходов. А расходов у человека в день десятки. Сложно заставить себя делать это.

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

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

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

Ну и пара мелочей:

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

Как бороться

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

Например, в Checkmoney можно было бы прикрутить распознавание чеков, тогда стало бы проще заносить траты. Или интегрироваться с банками. Но и то и то слишком сложно для небольшого пет-проекта. Я не осилил.

Кстати, мой следующий неудачный пет-проект был как раз про удовольствие и ноль требований. Но он тоже не взлетел.

Ну и из мелочей — стоит научиться немного дизайну и маркетингу.

Непрошеные советы

  • Делайте пет-проекты, это весело и полезно.
  • Не бойтесь закрывать проекты. Если лошадь сдохла — слезайте.
  • Наносите пользу и удовольствие.
  • Учитесь дизайну.
  • Учитесь маркетингу.