はじめに
「毎月届く請求書を見ながら、ネットバンキングに振込先をポチポチ入力する作業、なんとかならないかな…」
そんな身近な課題から、請求書をアップロードするだけでAIが自動解析し、全銀協フォーマットの振込データファイルを生成するWebサービス「トルカ 振込アシスト」を個人で開発・リリースしました。
この記事では、着想から本番リリースまでの流れ、技術選定の理由、つまずいたポイントなどを共有します。
解決したい課題
中小企業や個人事業主の経理担当者は、毎月こんな作業をしています:
- 届いた請求書(PDF or 紙)を開く
- 振込先の銀行名・支店名・口座番号・金額を確認
- ネットバンキングにログインして1件ずつ手入力
- 入力ミスがないか目視チェック
取引先が10社あれば10回この作業を繰り返します。1件あたり3〜5分、月に30分〜1時間がこの単純作業に費やされています。
しかも、銀行名から「金融機関コード(4桁)」を調べたり、支店名から「支店コード(3桁)」を調べたりする手間もあります。
全銀フォーマットという解決策
実は、ほぼすべてのネットバンキングには**「振込データ一括インポート」**機能があります。全銀協(全国銀行協会)が定めた固定長テキストフォーマットのファイルをアップロードすれば、振込先を一括登録できます。
問題は、この全銀フォーマットファイルを作ること自体が面倒だということ。Shift-JIS・120バイト固定長という仕様は、Excelで手軽に作れるものではありません。
「請求書の画像からAIが情報を読み取り、全銀フォーマットに自動変換する」 — これがトルカのコンセプトです。
サービス概要
利用フロー
請求書(PDF/画像) → アップロード → AI解析 → 確認・修正 → 全銀ファイルDL → ネットバンキングにインポート
- アップロード: PDF・JPG・PNGの請求書をドラッグ&ドロップ(最大20件一括対応)
- AI解析: Claude Vision APIが銀行名・支店名・口座番号・カナ名義・金額を自動抽出
- 確認・修正: 解析結果を画面上で確認。銀行名を入力するとオートコンプリートで金融機関コードを自動補完
- ダウンロード: 全銀協規定フォーマット(Shift-JIS・120バイト固定長)のTXTファイルを生成
- インポート: ネットバンキングの「総合振込」→「ファイル受付」でアップロードするだけ
特徴
- AI解析精度: Claude Sonnet 4.6の高精度Vision APIで、手書き請求書やカラフルなレイアウトにも対応
- 銀行コード自動補完: 1,500以上の金融機関マスタデータと自動照合
- 仕入先マスタ: 一度登録すれば次回から口座情報を自動反映
- 品質保証: AI精度が低かった場合、クレジットを自動返還
技術スタック
| 区分 | 技術 | 選定理由 |
|---|---|---|
| フロントエンド | Next.js 16 (App Router) | RSC + Server Actions、SSR/SSG柔軟 |
| CSS | Tailwind CSS | 高速プロトタイピング |
| 認証 | Clerk | Google OAuth含め10分で導入完了 |
| DB | Supabase (PostgreSQL) | 無料枠が充実、Storage一体 |
| ORM | Prisma | 型安全、マイグレーション管理 |
| AI | Anthropic Claude Sonnet 4.6 | Vision APIの精度が圧倒的 |
| 決済 | Stripe | Checkout + Webhook + カスタマーポータル |
| ホスティング | Vercel | Next.jsとの親和性、無料枠 |
| アクセス解析 | Vercel Analytics | ゼロ設定で導入 |
| ドメイン/DNS | Cloudflare | 無料SSL、高速DNS |
コスト
| 項目 | 月額 |
|---|---|
| Vercel (Hobby) | 無料 |
| Supabase (Free) | 無料 |
| Clerk (Free) | 無料(10,000 MAUまで) |
| Cloudflare | 無料 |
| ドメイン (toruca.app) | 約¥2,000/年 |
| 合計固定費 | 約¥170/月 |
AI解析コスト(Anthropic API)とStripe手数料は利用量に応じた従量制なので、利用がなければゼロです。
開発で工夫したこと
1. 全銀フォーマット生成
全銀フォーマットは1976年制定の古い規格で、Shift-JIS・120バイト固定長です。
ヘッダー (1行): 振込依頼人情報
データ (N行): 振込先情報(1件1行)
トレーラ (1行): 合計件数・合計金額
エンド (1行): 終了マーカー
カタカナは半角カナ、数字は右寄せゼロ埋め、文字列はスペース埋めなど、細かいルールがあります。このフォーマット生成ロジックは自動テストで品質を担保しています。
2. 銀行コード自動解決
AIが抽出した「三菱UFJ銀行」→ 金融機関コード「0005」への変換は、zengin-codeパッケージのマスタデータを使っています。
さらに、ゆうちょ銀行の独自体系(記号5桁 + 番号7〜8桁)から全銀コードへの変換も実装しました。
3. 品質保証クレジット返還
AIの解析精度が低く、ユーザーが多くの項目を手修正した場合、消費したクレジットを自動返還する仕組みを入れています。10項目中4項目以上の修正で1クレジット返還。これにより「AIが使えなかった場合でも損しない」安心感を提供しています。
4. 仕入先マッチング
同じ取引先からの請求書を2回目以降アップロードした際、過去の仕入先データと自動マッチングし、銀行口座情報を事前に入力します。使えば使うほど便利になる設計です。
つまずいたポイント
Vercelデプロイで404
vercel.jsonに"framework": "nextjs"を明示しないと、全ページ404になりました。CLIデプロイ時の自動検出に頼ると危険です。
Supabase接続のSession Mode
Prismaは直接接続(ポート5432)、アプリケーションはSession Mode Pooler(ポート5432)で接続する必要があります。DATABASE_URLとDIRECT_URLの使い分けに注意。
Stripe Webhookの冪等性
Stripeは同じイベントを複数回送信することがあります。checkout.session.completedでクレジット付与する際、stripeSessionIdの重複チェックで二重付与を防止しています。
全角↔半角変換の罠
日本語入力では全角数字「123」と半角数字「123」が混在します。バリデーション前に全角→半角の自動変換を入れることで、ユーザーの入力ストレスを軽減しました。
今後の展望
- 会計ソフト連携: freee、マネーフォワードとのAPI連携
- 定期取引テンプレート: 毎月同じ取引先への振込を簡略化
- API提供: 外部システムからの利用
- メール通知: 解析完了通知
おわりに
「ニッチだけど確実に需要がある課題」を解決するサービスを、モダンな技術スタックで低コストに構築できました。
無料で3回分お試しいただけますので、経理業務の効率化に興味がある方はぜひ試してみてください。
トルカ 振込アシスト — https://toruca.app
この記事が参考になったら「いいね」をお願いします。質問やフィードバックはコメント欄またはサービス内のお問い合わせフォームからどうぞ。