🏠

ソフトが専門じゃない私が、AIと一緒に不動産SaaSを作って本番運用するまで

に公開

この記事は何か

私の本業は再生可能エネルギー発電所の電気設備設計です。ソフトウェアは独学レベルで、情報系の教育を受けたことはありません。

そんな私が、不動産の価格相場を調べられるSaaS 「不動産相場リサーチ」 を個人開発して、いま本番で動かしています。

https://fudosan-research.vercel.app

先に正直に言っておくと、コードはほとんどAIに書いてもらいました。中身も正直、深くは理解していません。

それでも、認証も決済もある実際のSaaSを本番まで持っていくことはできました。この記事は「コードが書けない人間が、AIにかなりの部分を任せて、それでもサービスを一つ本番運用するまで」の記録です。

「AIで誰でも簡単」みたいな景気のいい話ではなく、任せられた所と、任せても解決しなかった所を、正直に書きます。

なぜ作ったか — 自分が家を買おうとしていたから

きれいな起業ストーリーではありません。単純に、自分が中古マンションを買おうとしていたのがきっかけです。

物件を探していて、ずっと引っかかっていたことが2つありました。

  1. この価格は適正なのか? 売り出し価格は分かっても、「実際にこのエリアの似たような物件がいくらで売れているのか(=相場)」が、素人にはよく分からない。
  2. SUUMOを毎日見張るのがしんどい。 良い物件は早い者勝ちなので張り付きたいが、本業もあるし現実的に無理。「条件に合う物件が出たら通知してほしい」と思っていました。

調べると、国土交通省が「不動産情報ライブラリ」というAPIで、実際の取引価格データを無料公開していました。これなら「相場」を自分で集計できる。

「だったら、自分が欲しいものを作ってしまおう」——それがスタートです。

つまりこのサービスは、最初は自分のために作ったものです。相場が分かって、条件に合う物件が出たら通知が来る。自分が欲しかった機能が、そのまま今の「不動産相場リサーチ」の中身になっています。

技術構成

こう書くと分かっている風ですが、構成もほぼAIに選んでもらいました。 私が出した条件はほぼ一つ、「ランニングコストをできるだけかけない」です。個人が趣味の延長で始める以上、毎月お金が出ていく構成は続かないと思ったからです。

その条件でAIが提案してきたのが、この組み合わせです。

役割 使ったもの
フロント・インフラ Next.js + Vercel
DB・認証 Supabase(LINEログイン)
決済 Stripe(月額プラン)
データ源 国交省「不動産情報ライブラリ」API
通知 LINE Messaging API

図にすると、こんな流れです。

いずれも無料枠から始められるものです。私は各選択肢の「無料枠でどこまでいけるか」だけ確認して、あとはAIに任せました。

以下、AIに任せたけど、そのままではうまくいかなかった所を3つ書きます。素人の私がどう判断したか、という話でもあります。

つまずき① 動的OG画像が本番でハングした

SNSでシェアされたときのリンクカード画像(OG画像)を、ページごとに自動生成しようとしました。Next.jsには next/ogImageResponse という、それ用の仕組みがあります。AIもそれを提案してきて、ローカルでは動きました。

ところが本番(Vercel)にデプロイすると、その画像生成が返ってこない(ハングする)。ローカルで動くのに本番で固まる、という状態でした。

AIに聞いても、これは一発では直りませんでした。ここが「丸投げの限界」だと思います。 AIが解けない問題は、コードを理解していない私にはもっと解けない。原因の深掘りは早々に諦めました。

代わりに私が出した判断は、「動的生成そのものをやめて、静的な画像に切り替える」です。凝ったことをやめれば、少なくとも止まらない。AIに頼んで、public/og/ に置いた固定PNGを各ページから参照する形に変えてもらいました。

app/layout.tsx
// 動的生成(next/og)をやめ、固定PNGを参照する形に切り替えてもらった
openGraph: {
  type: "website",
  locale: "ja_JP",
  siteName: "不動産相場リサーチ",
  title,
  description,
  url,
  images: [{ url: "/og/default.png", width: 1200, height: 630 }],
},

理解できない問題を粘って直すより、「そもそも凝らない方向」に倒す

素人がAIと開発する上では、この割り切りがけっこう効きました。直せないなら、直さなくて済む形にする。

つまずき② Vercelの無料枠で定期実行(cron)をどう回すか

「条件に合う物件が出たら通知する」には、定期的に動く処理が要ります。Vercelにはcron(定期実行)があります。

ここで壁になったのが、Vercelの無料(Hobby)プランはcronが1日1回までという制約でした。やりたい定期処理は複数あるのに、cronは1本しか持てない。

「コストをかけたくない」が私の最優先条件なので、有料プランや別サービスの追加はしたくない。AIに「無料枠のままで複数の定期処理を回したい」と相談したところ、出てきたのが「1本の日次cronに全部相乗りさせる」という方法でした。

実際、vercel.json のcronは1本だけです。

vercel.json
{
  "crons": [
    {
      "path": "/api/notify/run",
      "schedule": "0 0 * * *"
    }
  ]
}

そして、その1本の中で「今日は何を動かす日か」を判定して分岐させています。毎日やる通知はそのまま実行し、週2回だけのSNS投稿は「今日が月曜か木曜のときだけ」動かす、という具合です。

app/api/notify/run/route.ts
// 日次cronの中で、週2回だけの処理を「曜日判定」で相乗りさせている
let weeklyPost = { skipped: true };
if (isWeeklyPostDay()) {          // 月・木だけ true
  try {
    weeklyPost = await runWeeklyXPost();
  } catch (err) {
    // SNS投稿が失敗しても、本来の通知処理は止めない
    weeklyPost = { error: String(err) };
  }
}

このコードを私が思いついたわけではありません。AIが書いてくれたものです。

ただ、「制約を回避する(=お金を払う)」のではなく「制約の中に全部押し込む」方向をAIに指示する、という判断は私がしました。素人がAI開発で貢献できるのは、たぶんこういう「どっちに舵を切るか?」の部分なんだと思います。

つまずき③ 検索から人に来てもらう(programmatic SEO)

作ってすぐ気づくのは、誰も来ないことです。当たり前ですが、作っただけでは存在していないのと同じでした。

AIに「お金をかけずに人に見つけてもらうには」と相談して出てきたのが、programmatic SEO — 「データからページを大量に自動生成して、検索の受け皿を増やす」やり方です。

私のサービスは都道府県・市区町村ごとに相場データがあります。それを使って、市区町村ごとのページを自動生成する形にAIが実装してくれました。Next.jsのISR(一定時間ごとに再生成)で、1日1回作り直しています。

app/souba/[prefCode]/[cityId]/page.tsx
export const revalidate = 86400; // 1日1回再生成
export const dynamicParams = true;

これで、「(市区町村名) 中古マンション 相場」のような検索の受け皿が、人力ゼロで大量にできました。

ただ正直に書くと、これで劇的に人が増えたわけではありません。 検索エンジンに評価されて流入が育つには時間がかかるし、そもそもサービスがまだ新しい。ここは今も改善の途中です。

AIをどう使ったか(正直な温度感)

具体的な進め方

ここまで読んで分かる通り、私のやり方は「AIにほぼ丸投げ」です。 具体的にはこんな進め方でした。

  • やりたいこと(相場を出す、通知する、など)をAIに伝える
  • AIが実現方法の選択肢を出してくる
  • 私は主に「どれが一番ランニングコストがかからないか」の観点で選ぶ
  • 選んだ方向で、AIがコードを書く
  • 私はそれをデプロイして、動くか確認する

コードの中身は、正直ほとんど理解していません。 それでも認証・決済・通知のある実サービスが完成したのは、間違いなくAIのおかげです。数年前なら、私のような人間には絶対に作れませんでした。

丸投げの限界

一方で、丸投げにははっきりした限界もあります。

  • AIが解けない問題は、私も解けない。 つまずき①のOG画像がまさにそれで、直せないから「そもそも凝らない」方向に逃げました。
  • 深い保守・デバッグは今の私にはできない。 これは自覚しているリスクです。動いているうちはいいが、複雑な不具合が出たとき、自力でどこまで対応できるかは未知数です。

なので「誰でもAIで簡単に作れる」とは言いません。

「理解していない部分を抱えたまま、それでも本番まで持っていく」ことは、覚悟の上ならできる、というのが正直なところです。

私が実際に価値を出せたのは、コードではなく「コストをどこまで抑えるか」「凝るか諦めるか」といった判断の部分でした。

いま一番の課題は「作ること」ではなかった

作り終えて痛感したのは、「作れた」と「使ってもらえる」はまったく別ということです。むしろ本当の課題は、作った後にありました。

見栄を張っても仕方ないので、今の数字を正直に書きます。リリースしたばかりで、規模はまだ本当に小さいです。

  • 登録ユーザー: 数人
  • 有料契約: 2人
  • 週間アクティブユーザー: 20人強

技術的に動くものはAIと作れても、それを人に届けて、使ってもらうところは、正直まだ全然できていません。

サービスは「作って終わり」ではなく、「使ってもらうまで」がスタート地点だった、というのが今の実感です。

今やっていること(経過観察中)

とはいえ、手をこまねいているわけではなく、いくつか集客の施策を打って、効果を観察している最中です。

  • 検索(SEO): つまずき③のprogrammatic SEOに加えて、相場の見方などの解説記事を書いて、検索から来てもらうことを狙っています。
  • SNS発信: 週次で相場の話題を自動投稿する仕組みを入れています(つまずき②のcron相乗りは、実はこれも兼ねています)。
  • 広告: 検索広告も少額で試しました。ここは学びが多くて、「クリックはされるのに登録につながらない」という壁にぶつかっています。広告の文面より、その先の登録画面(LP)に課題がありそう、という所まで見えてきました。
  • 無料トライアル: 有料プランに無料期間を付けて、まず触ってもらう導線にしています。

ただ、「作る」フェーズが一段落して、今は完全に「どうやって知ってもらい、使ってもらうか」というマーケティング側の課題に軸足が移った、という手応えはあります。

コードが書けない自分が、本業を続けながら、実際に動いて課金もできるSaaSを本番運用できている——これは素直に嬉しい。でも本当の勝負はここから、というのが正直な現在地です。

まとめ

  • コードが書けなくても、AIにかなりの部分を任せれば、実サービスを本番まで持っていくことはできる
  • ただし丸投げには限界がある(AIが解けない問題は自分も解けない、深い保守はできない)。そのリスクを分かった上でやる
  • 素人が価値を出せるのは、コードより「コストをどこに倒すか」「凝るか諦めるか」の判断の部分だった
  • そして「作れた」と「使ってもらえる」は別。今はいくつかの集客施策を試して観察している最中で、勝ち筋はまだ見えていない。本当の勝負はここから

どの施策が効いたのか(あるいは効かなかったのか)は、結果が出たらまた書こうと思います。「専門じゃないけど作ってみたい」人、そして「作ったけど誰にも使われていない」人の、一つの実例になれば嬉しいです。

Discussion