課金ダッシュボードの実装
サンプルアプリ 課金情報ダッシュボード を題材に、SaaSus Metering API/Pricing API を組み合わせて テナントごとの請求額と使用量をリアルタイムで把握できるダッシュボード の実装方法を解説します。
以下は課金情報ダッシュボードのスクリーンショットです。

フロントエンド実装
実装例リンク
以下のリンク先に、フロントエンドの実装が含まれています。
- React:
BillingDashboard.tsx
バックエンド実装
エンドポイント一覧
| 種別 | メソッド & パス | 説明 |
|---|---|---|
| 請求期間候補 | GET /billing/plan_periods?tenant_id= | テナントに対して適用されたプラン履歴をもとに 月次/年次 区間を返却します。セレクトボックス生成に使用。 |
| ダッシュボード集計 | GET /billing/dashboard | メータリング集計結果と課金額、プラン情報をまとめて取得。 |
| メータ更新 (現時刻) | POST /billing/metering/{tenant_id}/{unit} | add / sub / direct を指定して即時メータを加減。 |
| メータ更新 (任意TS) | POST /billing/metering/{tenant_id}/{unit}/{ts} | 履歴補正など、任意タイムスタンプで更新。 |
備考
プラン履歴は Auth API の テナント情報を取得 のレスポンスに含まれる plan_histories 配列から取得できます。
請求期間候補エンドポイント
請求期間セレクトボックスの実装
プラン履歴を 月/年 単位に切り分ける処理は バックエンド で行い、フロントには区間ラベルと Unix タイムスタンプ(秒)を渡します。
備考
Auth API の テナント情報を取得 レスポンスの plan_histories 配列(plan_id と plan_applied_at)を用いてプラン適用タイミングを取得し、current_plan_period_end を最終境界として扱います。plan_id が空のエントリは除外してください。
備考
以下の実装フロー概要およびコードサンプルはバックエンドが Go、フロントエンドが React を前提としています。
実装フロー概要
- テナント情報取得 — Auth API でテナントを取得し、
planHistoriesとcurrentPlanPeriodEndを取得。 - 境界エッジ作成 —
planAppliedAtを昇順にソートして境界点 (edge) の配列を作成。 - 最終境界決定 —
currentPlanPeriodEndがあればその 1 秒前、無ければ「現在」を最終境界に設定。 - 区間分割 — 区間ごとに月次 / 年次かを判定し、
step()でループしながらPlanPeriodOptionを生成。 - 最新優先ソート —
Startをキーに降順ソートしてフロントへ返却。
- Go
// ② 境界エッジ作成 & ④ 区間を month/year で分割
type edge struct { PlanID string; Time time.Time }
// ...プラン履歴を Time 昇順で edge 配列に格納...
for cur := periodStart; !cur.After(periodEnd); {
next := step(cur) // month なら +1M, year なら +1Y
end := next.Add(-1 * time.Second)
results = append(results, PlanPeriodOption{ Label: label(cur,end), PlanID: e.PlanID, Start: cur.Unix(), End: end.Unix() })
if end.Equal(periodEnd) { break }
cur = end.Add(time.Second)
}