バディ / 通知 / 収益化 / ログ設計案

SQL 作成前の設計メモ。まず MVP で必要な保存対象を絞り、既存の学習履歴テーブルに乗せるものと、新規テーブルに分けるものを明確にする。

MVP は小さく 既存学習テーブル優先 Webhook 書き込みは service role 全文ログは原則保存しない
今やる

ユーザー状態の保存

バディ種別、バディ名、好きなもの、現在の見た目はユーザー体験に直結するため、まず保存対象にする。

今やる

重要イベントだけ記録

バディコメント表示、学習完了、30 秒授業生成、記述模試、サブスク購入など、後で意思決定に使うイベントを優先する。

後でよい

詳細な分析基盤

すべての UI 操作ログや全文プロンプト保存は、費用・プライバシー・運用負荷が大きい。MVP では避ける。

データの流れ

1

ユーザー操作

学習開始、コメント表示、提案表示、購入など。

2

アプリ内イベント

必要最小限の event_name と properties を作る。

3

Supabase

ユーザーに紐づく学習・バディ・通知状態を保存。

4

外部サービス

Crashlytics、RevenueCat、広告 SDK など。

5

分析

継続率、正答率、提案受諾率、購入率を見る。

バディ関連

バディプロフィール

新規テーブル

現在選んでいるバディ、名前、着せ替え、好きなもの 3 つを保存する。コメント生成時のパーソナライズ入力にも使う。

テーブル
user_buddy_profiles
MVP
buddy_key, buddy_name, favorite_topics, appearance
後回し
着せ替え履歴、有料アイテム監査、アイコン生成履歴

バディコメントログ

新規テーブル

どのコメントが学習継続や正答率に効いたかを後で見るためのログ。全文プロンプトは保存しない。

テーブル
buddy_comment_logs
保存する
表示文、画面文脈、trigger、テンプレートキー、参照した好きなもの
保存しない
emotion / direction。現状は UI 側で固定的に決まるため。

学習ログ

新規ログ

学習後おすすめ

スコアに応じて 30 秒授業 / 記述模試を提案したか、受け入れたかを保存する。

テーブル
study_recommendation_logs
見る指標
表示率、承諾率、閉じられた率
新規ログ

30 秒授業

点数がないためクイズ attempt とは分ける。生成状態とカスタマイズ内容だけ保存する。

テーブル
interactive_lesson_generations
本文保存
MVP ではしない
既存に乗せる

記述模試

1 回分の学習と問題ごとの回答・正誤を持つため、既存の challenge / answer に乗せる。

study_mode
written_mock_test
answer_method
written_mock_test

通知

通知は「ユーザー設定」「端末トークン」「送信イベント」に分ける。設定と実際の送信履歴を混ぜない。

役割 テーブル 保存する内容
通知設定 user_notification_preferences 学習リマインド ON/OFF、時間帯、timezone、quiet hours
端末 user_push_tokens Expo / FCM / APNs の token、platform、last_seen_at
送信履歴 notification_events scheduled / sent / opened / failed と error

広告・サブスク

必要になったら

広告ログ

MVP では広告ネットワークの管理画面で足りる可能性が高い。リワードやプロダクト判断に使うなら内部ログを持つ。

テーブル
ad_events
イベント
loaded, impression, click, reward, failed
RevenueCat 推奨

サブスク

App Store / Play Billing を直接自前実装するより、RevenueCat webhook から権限状態を同期する方が現実的。

権限
user_entitlements
イベント
subscription_events
書き込み
service role / webhook のみ

ログ / 分析

推奨スタック

用途 候補
クラッシュ・安定性 Firebase Analytics + Crashlytics
プロダクト分析 Supabase または PostHog 系 product events

最初に取るイベント

学習プラン作成 暗記帳生成 クイズ開始 / 完了 バディコメント表示 学習後おすすめ表示 / 承諾 サブスク画面表示 / 購入 広告リワード獲得
最初から全 UI 操作ログを取る必要はない。費用、ノイズ、プライバシーリスクが増える。まず意思決定に使うイベントだけに絞る。

テーブル候補一覧

user_buddy_profiles 現在のバディ設定
  • user_iduuid pk
  • buddy_keytext
  • buddy_nametext
  • favorite_topicstext[]
  • appearancejsonb
buddy_comment_logs バディコメントの表示ログ
  • user_iduuid
  • context_typetext
  • triggertext
  • messagetext
  • template_keytext
study_recommendation_logs 学習後おすすめの表示・承諾ログ
  • note_iduuid
  • scorenumeric
  • recommendation_typetext
  • shown_attimestamptz
  • accepted_attimestamptz
interactive_lesson_generations 30 秒授業の生成ログ
  • generation_typetext
  • customization_focustext
  • statustext
  • modeltext
  • error_messagetext
user_entitlements サブスク権限の現在状態
  • user_iduuid
  • entitlement_keytext
  • activeboolean
  • sourcetext
  • expires_attimestamptz
analytics_events プロダクトイベント
  • event_nametext
  • screentext
  • propertiesjsonb
  • app_versiontext
  • platformtext

RLS / SQL 化の注意

守ること

  • 既存 RLS はなるべく変更しない。
  • 新規テーブルは auth.uid() = user_id の owner read を基本にする。
  • Webhook / provider / AI 生成ログの書き込みは service role に寄せる。

避けること

  • 分析用 jsonb に重要指標を全部閉じ込める。
  • 全文プロンプトや回答全文を安易にログ保存する。
  • ユーザーが subscription event の raw payload を直接読める設計にする。