2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人開発でサービスをリリースした。その後「人が来ない」という最大のバグに遭遇した話

2
Posted at

前回、勢いで

「俺は誰かと飯が食いたい!」

というサービスを作りました。ちなみにサービスはこちら⇨俺は誰かと飯が食いたい!

コンセプトはかなり単純です。

「今日、誰かと飯を食いたい」

と思った人が募集を出して、それを見た誰かが参加する。

マッチングアプリほど重くない。

SNSで「誰か飯行こ」と投稿するより、もう少し具体的。

そんな「飯を食う相手を探す」ことだけに特化したサービスです。

そして、ひとまずサービスとして動くところまで作って、リリースしました。

めでたい。

ここからユーザーが来て、募集が増えて、マッチングが発生して……

と思っていたのですが。

リリースしただけでは、人は来ない

当たり前なんですが、

リリースしただけでは誰も来ません。

コードを書いている間は、

  • 認証を実装する
  • DBを設計する
  • UIを作る
  • APIを作る
  • デプロイする

みたいに、問題がかなり明確です。

エラーが出れば直せばいい。

テストが落ちれば原因を探せばいい。

でもリリース後に出てきた問題は、

「そもそも誰もサービスを知らない」

でした。

しかもこれは、

Error: UserNotFound

みたいに親切にエラーを吐いてくれません。

Google Analyticsを見ても静か。

募集一覧も静か。

通知も静か。

正常に動作しているのに誰もいない。

個人開発で一番怖いタイプの正常系です。


リリース後、まず機能をかなり増やした

とはいえ、最初から集客だけを考えていたわけではありません。

実際にサービスとして運用することを考えると、初期版にはまだ足りないものが大量にありました。

そこでリリース後も、かなり機能を追加しました。

1. 通知基盤

まず手を入れたのが通知です。

募集に参加があった。

マッチングが成立した。

募集内容に変化があった。

こうしたイベントをユーザーが気付かなければ、サービスとして成立しません。

そこで、

  • トランザクション通知
  • 通知カテゴリ別設定
  • 開封計測
  • クリック計測

などを追加しました。

単純に「通知を送る」だけではなく、

通知を送った結果、ユーザーが戻ってきたのか

まで見られるようにしました。


2. 「募集するほどではない」を拾うDemand Intent

サービスを作っていて気付いたことがあります。

「誰かと飯を食べたい」

と思っていても、

わざわざ募集を作るほどではない人

が結構いるはずです。

募集を作るには、

「いつ?」

「どこ?」

「何食べる?」

「予算は?」

などを決める必要があります。

これは意外と重い。

そこで、

「この辺で誰かと焼肉行きたい」くらいの需要だけ先に登録できる仕組み

を作りました。

内部的にはDemand Intentとして扱っています。

似た需要が集まれば、

「この条件なら募集にしてみませんか?」

と募集作成につなげられます。

つまり、

なんとなく飯に行きたい
↓
需要として記録
↓
似た人がいる
↓
募集を作る
↓
マッチング

という導線です。


3. 「この募集、成立しそう?」を数値化した

募集を出しても、

誰も参加しなければ意味がありません。

そこで、過去のデータなどから

募集の成立しやすさを推定する仕組み

も追加しました。

まだ巨大なデータセットがあるわけではないので、現状はルールベースです。

時間帯、エリア、募集条件などを材料にして成立可能性を算出します。

将来的にデータが十分集まれば、ここはもっと高度にできると思っています。

ただ、個人開発でいきなり機械学習を始めても、

そもそも学習させるユーザーがいない

という非常に現実的な問題があります。

まずはデータを貯める。

話はそれからです。


4. Time to First Join / Time to Matchを計測

さらに、

募集してから最初の参加者が来るまで何分かかったのか

募集してから成立するまで何分かかったのか

を計測するようにしました。

具体的には、

  • Time to First Join
  • Time to Match

です。

個人的には、登録者数だけを見るより重要な指標だと思っています。

ユーザーが欲しいのはアカウントではありません。

一緒に飯を食う人です。

登録者が1万人いても、募集して誰も来ないなら意味がない。

逆に登録者が少なくても、募集したら10分で誰か来るならかなり価値があります。

なので、このサービスでは

「どれだけ早く飯相手が見つかるか」

を重要な指標として追うことにしました。


5. 店舗側の機能と収益化も追加

ユーザー同士だけではなく、飲食店側にも参加してもらえる設計にしています。

そこで店舗向けに、

  • Businessアカウント
  • Business Analytics
  • Demand Intelligence
  • スポンサー飯
  • 空席スポンサー
  • エリアスポンサー

などを実装しました。

課金にはStripeを利用しています。

特に面白いと思っているのがDemand Intelligenceです。

ユーザーが

「このエリアで焼肉を食べたい」

「今日この辺で誰かと飲みたい」

といった需要を登録するので、

それを集計すれば店舗側から見ると、

「今どこに食事需要が存在しているのか」

というデータになります。

単なるマッチングサービスではなく、

ユーザーの「飯行きたい」
↓
需要データ
↓
店舗が需要を把握
↓
空席・キャンペーンをぶつける
↓
ユーザーが来店

という構造まで作れないか考えています。


6. Admin Dashboardがどんどん巨大化した

そして、いろいろ計測し始めた結果、

Admin Dashboardもかなり拡張しました。

現在は、

  • ユーザー関連指標
  • 募集関連指標
  • マッチング関連指標
  • Time to First Join
  • Time to Match
  • Business Analytics
  • 収益化ファネル
  • Demand関連データ

などを見るための管理画面になっています。

個人開発を始めた頃の私は、

管理画面なんて後でいいだろ

と思っていました。

今は完全に逆です。

何か施策を打っても、計測できなければ

「なんか良くなった気がする」

で終わります。

それでは改善できません。

なので、新機能を作るときは

機能を作る
↓
イベントを計測する
↓
Adminで確認できるようにする

までをセットで考えるようになりました。


そして気付いた

ここまでかなり作りました。

テストも増やしました。

E2Eは18件。

Unit Testは67件。

TypeScript、ESLint、Production Buildも通る。

課金もある。

Analyticsもある。

通知もある。

需要分析もある。

成立予測まである。

そして私は管理画面を見ました。

人がいません。

そこでようやく理解しました。

次に実装すべき機能は「集客」だった

エンジニアなので、問題があるとコードを書きたくなります。

ユーザーが募集しない。

→ 募集UIを改善しよう。

マッチングしない。

→ 成立予測を作ろう。

リピートしない。

→ 通知を改善しよう。

全部間違いではありません。

でも、その前に、

そもそもサービスを知っている人が少ない。

という問題がありました。

これはコードベースの中だけ見ていても解決しません。

ということで、ここから

SEOと集客

に手を出し始めます。


SEO、何も分からん

まずGoogle検索から人が来る状態を作ろうとしました。

ここで、

「SEOってtitleとdescription入れればいいんでしょ?」

くらいに考えていた自分が死にます。

実際には、

  • title
  • description
  • canonical
  • OGP
  • Twitter Card
  • sitemap.xml
  • robots.txt
  • Google Search Console
  • Google Site Verification
  • 構造化データ
  • インデックス状況
  • 内部リンク
  • コンテンツ
  • エリア別ページ

など、やることが大量にあります。

また知らない世界が始まりました。


Search Consoleを設定

まずGoogle Search Consoleを導入。

サイト所有権を確認して、

sitemap.xml

を送信。

さらに、

  • TOP
  • メディア
  • 主要エリアページ

などについてURL検査を行い、Googleからどう見えているか確認するようにしました。

開発者としては、

npm run build

が通れば完成した気分になります。

しかしGoogle側からすると、

「知らんサイトですね」

で終わります。

デプロイ完了と検索エンジンへの掲載は完全に別物でした。


「検索される理由」を作らないといけない

そして最大の問題。

サービスのトップページだけSEO対策しても、

検索流入する理由がほとんどありません。

例えば、

「一人 飯 寂しい」

「東京 飲み友達」

「今日 飲み 相手」

「焼肉 一人 行きづらい」

みたいな検索をした人に対して、

その悩みに答えるページが必要です。

そこで、

メディア機能

を追加することにしました。

サービス開発者自身が、

  • 一人飯
  • 誰かと食べること
  • 飲み相手
  • 募集の実験
  • サービス開発の裏側

などの記事を書いていきます。


そして自分自身を実験台にした

ここまで作ったので、

当然、自分でも募集してみます。

企画名は、

「アプリ作成者は貧乏飯から回避できるのか!」

です。

サービス上で募集を出して、

誰かが来てくれれば一緒に飯を食べる。

誰も来なかったら……

一人で飯を食べる。

結果。

誰も来ませんでした。

私は一人で卵かけご飯を食べました。

自分で作ったマッチングサービスを使って、

自分で募集して、

誰ともマッチングせず、

一人で卵かけご飯を食べる。

かなり完成度の高い個人開発です。


ただ、これはかなり重要なデータだった

ネタとしては面白いですが、普通に改善点も見えました。

例えば、

  • 募集締切は適切だったか
  • 募集開始から開催までの時間は十分だったか
  • Xでの告知方法は適切だったか
  • 募集ページを見た人は何人いたのか
  • 見たけど参加しなかった人はどこで離脱したのか
  • 初見ユーザーが参加する心理的ハードルは高くないか

などです。

コードを書いているだけでは分からなかった問題が、

実際に自分がユーザーになることで大量に出てきました。

そして、この失敗自体もメディア記事にしました。

SEO用の記事を書くために架空のコンテンツを量産するのではなく、

サービス上で実験する → 結果を記事にする → 記事からサービスに人を呼ぶ

というループを作ろうとしています。


「開発」と「集客」を分けるのをやめた

今回一番考え方が変わったのはここです。

以前は、

開発
↓
完成
↓
リリース
↓
集客

だと思っていました。

今は、

実装
↓
公開
↓
計測
↓
集客
↓
ユーザー行動を見る
↓
改善
↓
記事にする
↓
また集客
↓
実装

だと思っています。

つまり、

集客もプロダクト開発の一部でした。


個人開発、コードを書いている時間だけが開発ではなかった

最初は、

「誰かと飯を食えるサービスを作ろう」

というだけでした。

そこから、

認証を作って、

募集を作って、

通知を作って、

Analyticsを作って、

Stripeを入れて、

店舗機能を作って、

SEOをやって、

Search Consoleを触って、

記事を書いて、

自分で募集して、

誰も来なくて、

卵かけご飯を食べました。

現在地はここです。

でも、個人的にはリリース前より今の方が面白いです。

リリース前は、

「作れるかどうか」

が問題でした。

リリース後は、

「これを本当に使われるサービスにできるか」

が問題になりました。

コードを書けば解決する問題だけではなくなっています。

だからこそ、ここからが個人開発の本番なのかもしれません。

次は、

「実際にどうやって0→1人目のユーザーを獲得するのか」

を試していきます。

卵かけご飯から脱出できたら、また書きます。

ちなみにサービスはこちら⇨俺は誰かと飯が食いたい!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?