Notion家計簿の「残高調整」と「月次繰越」をLaravelで自動化した
はじめに
私はNotionで家計簿をつけています。
使っているのは、日々の収入と支出を記録するシンプルな家計簿です。ベースにしたテンプレートはこちらです。
複雑な予算管理や資産分析はせず、使ったお金と入ってきたお金を記録するだけ。このくらいシンプルだからこそ、ずぼらな私でも何年も続けられています。
ただし、長く使っていると次のような問題が起きます。
- 支出を入力し忘れる
- 金額を間違えて登録する
- 現金の細かな増減を記録し忘れる
その結果、銀行口座と手持ち現金の実残高が、Notion上の家計簿残高と合わなくなります。
そこで、毎月の残高調整と翌月への繰越を自動化するWebアプリ「Notion Ledger Sync」を作りました。
この記事では、作った理由、仕組み、実装時に考えたことを紹介します。
毎月の残高調整が地味に面倒だった
以前は、給与が振り込まれるたびに次の作業をしていました。
- 銀行アプリで給与振込額と普通預金残高を確認する
- 手持ちの現金を数える
- Notionの家計簿残高を確認する
- 電卓で差額を計算する
- 差額を「調整額」としてNotionに登録する
- 給与を収入としてNotionに登録する
銀行アプリ、電卓、Notionの3つを行き来する必要があります。
月に一度とはいえ、毎回同じ計算と入力をするのは地味に面倒です。手作業なので、計算ミスや転記ミスも起こり得ます。
「銀行アプリを見ながら金額を入力したら、計算からNotionへの登録まで終わってほしい」と考え、専用のWebフォームを作りました。
作ったもの
Webフォームに次の3項目を入力します。
- 今回の給与振込額
- 普通預金残高
- 手持ちの金額
「調整額計算」を押すと、実際に持っているお金とNotion上の記録を比較し、登録すべき調整額を表示します。
計算結果を確認して「給与・調整額を家計簿に登録」を押すと、Notionに次の2レコードを登録します。
| レコード | カテゴリー | 摘要 | 種類 | 金額 |
|---|---|---|---|---|
| 給与 | 給料 | 給料 | 収入 | フォームに入力した給与額 |
| 調整 | 調整 | 調整額 | 差額の正負から判定 | 計算した調整額 |
給与額が0円または未入力なら、給与レコードは作りません。調整額が0円なら、調整レコードも作りません。
これにより、銀行アプリの情報をWebフォームへ入力するだけで、残高確認からNotionへの反映まで完了するようになりました。
全体構成
アプリはLaravelで実装し、Notion APIを通じて家計簿データベースを読み書きします。
記事執筆時点の主な構成は次のとおりです。
- PHP 8.5
- Laravel 13
- Notion API
- Laravel Scheduler
- SQLiteまたはLaravel対応データベース
- パスキー(WebAuthn/FIDO2)またはID・パスワードによるフォーム認証
調整額を計算する
調整フォームでは、対象月のNotionレコードを取得し、対象口座の金額を合計します。
現在の実装における計算の中心部分は次のとおりです。
$physicalTotal = $bankBalance + $cashOnHand;
$adjustmentAmount = $physicalTotal - $notionTotal;
つまり、考え方は次の式です。
実残高 = 普通預金残高 + 手持ち現金
調整額 = 実残高 - Notion上の対象口座残高
調整額がプラスなら収入、マイナスなら支出として、絶対値をNotionへ登録します。
$type = $adjustmentAmount >= 0 ? '収入' : '支出';
$amount = abs($adjustmentAmount);
Notion側では「収入を正、支出を負として集計する」といったルールを持たせているため、登録時に種類を分けています。
なお、給与振込をNotionへ記録するタイミングや、残高計算用の数式は家計簿の設計によって変わります。この式をそのまま流用するのではなく、自分のNotionデータベースが「給与登録前の残高」と「給与登録後の残高」のどちらを表しているかを確認する必要があります。
給与と調整額を1回の操作で登録する
調整額の計算だけなら電卓でもできます。今回の自動化で大きかったのは、そのままNotionへ登録できるようにしたことです。
給与レコードは次のようなデータとして登録します。
$notion->createLedgerPage(
$calculatedAt,
'収入',
'給料',
'給料',
$salaryAmount,
$accountName
);
調整レコードも同じ登録処理を利用し、種類、カテゴリー、摘要、金額を切り替えます。Notion APIへのページ作成処理を共通化することで、給与と調整額で別々のAPI実装を持たないようにしました。
フォームは家計簿を更新できるため、未認証のまま公開するのは危険です。このプロジェクトでは、パスキーまたはハッシュ化した認証情報でログインした利用者だけが操作できるようにしています。
NotionのIntegration Tokenや認証情報は、コードへ直接書かず環境変数で管理します。
NOTION_API_TOKEN=secret_xxx
NOTION_DATA_SOURCE_ID=xxxxxxxx
CASH_OR_SAVING=現金/普通預金
.env、実際のトークン、データベースIDはリポジトリへコミットしません。
月ごとに締めて繰越を作る
以前は、家計簿を月で締めずに通年で管理していました。
しかし、途中に入力漏れや誤入力があると、それ以降の残高がすべてずれてしまいます。そこで、月次で締めて翌月へ繰り越す方式に変更しました。
この方式なら、ずれが発生しても影響範囲をその月に限定しやすくなります。
一方で、月末残高の計算と翌月の繰越レコード作成を毎月手作業で行う必要がありました。当時のNotionには、この運用を任せられるエージェント機能もありませんでした。
そこで、月次処理もLaravelのバッチとして実装しました。
処理の流れは次のとおりです。
- 前月のNotionレコードを取得する
- 口座ごとに金額を集計する
- 翌月1日付の繰越レコードを口座ごとに作成する
- 必要に応じて結果をメールやSlackへ通知する
Laravel Schedulerでは毎月1日の0時にコマンドを実行します。
$schedule->command('notion:monthly-sum')
->monthlyOn(1, '0:00')
->timezone(config('app.timezone', 'UTC'));
サーバー側では、Laravel Schedulerを起動するためのcron設定も必要です。
* * * * * cd /path/to/notion-ledger-sync && php artisan schedule:run >> /dev/null 2>&1
二重に繰越を作らない
バッチ処理では、再実行への備えが重要です。
通信エラーやタイムアウトが発生したとき、同じ月次処理を再実行することがあります。そのたびに繰越レコードが増えると、翌月の残高が壊れます。
このプロジェクトでは、翌月1日付の繰越レコードがすでに存在する場合、処理を中止できるようにしました。
MONTHLY_SUM_SKIP_IF_CARRY_OVER_EXISTS=true
単に「毎月1回実行する」だけでなく、「同じ処理が再実行されてもデータを重複させない」ことまで考えておくと、定期処理を安心して運用できます。
作って楽になったこと
以前の残高調整では、銀行アプリ、電卓、Notionを何度も行き来していました。
現在は次の操作だけです。
- 銀行アプリで給与振込額と普通預金残高を確認する
- 手持ち現金と合わせてWebフォームへ入力する
- 計算結果を確認して登録ボタンを押す
月次繰越も自動作成されるため、月初の手作業はほぼなくなりました。
私は難しい家計簿管理を続けられるタイプではありません。それでも、日々の収入と支出だけを記録するシンプルなNotion家計簿と、面倒な部分だけを自動化する小さなWebアプリを組み合わせることで、何年も記録を続けられています。
すべてを高機能な家計簿サービスへ置き換えなくても、自分が面倒だと感じる作業だけをAPIで自動化すると、普段の運用をかなり楽にできます。
実装・運用で気をつけたこと
- Notion Integrationには必要なデータベースだけを共有する
- API Tokenや認証情報をリポジトリへコミットしない
- 金額登録前に計算結果を画面で確認できるようにする
- 給与額や調整額が0円なら不要なレコードを作らない
- 月次バッチを再実行しても繰越を重複させない
-
APP_TIMEZONEを設定し、月境界と実行日時のずれを防ぐ - 公開フォームには認証とrate limitを設定する
- 本番投入前に、ダミーのNotionデータベースで計算式とプロパティ名を確認する
おわりに
今回作った「Notion Ledger Sync」では、次の2つを自動化しました。
- 給与振込後の実残高とNotion残高の差額計算、および給与・調整額の登録
- 前月の口座別集計と、翌月への繰越レコード作成
リポジトリはこちらです。
Notionで家計簿を管理していて、毎月同じ集計や転記を繰り返している方の参考になれば幸いです。



