「毎月の請求書作成に時間がかかっている」「見積書から請求書への転記ミスが多い」「入金確認を手動でやっていて漏れが出る」——そんな課題を解決する請求書・見積書自動生成システムの開発手順を解説します。本記事では、明細入力・消費税自動計算・PDF出力・メール自動送信・Stripe決済リンク発行・入金管理までを備えたシステムを、実際に動くデモを交えながら解説します。React + Node.js + PostgreSQL + Stripe + SendGrid + Puppeteerの構成でSaaS化まで含めた実践的な内容です。
なぜ請求書・見積書の自動化が必要か
フリーランス・中小企業では毎月の請求書作成・送付・入金確認に多くの工数がかかっています。既製品の会計ソフトは機能過多で高額なことも多く、自社の業務フローに合わせたシステムを自作するニーズが高まっています。
| 課題 | 自動化システムでの改善 |
|---|---|
| 毎月の請求書作成に30分〜1時間かかる | テンプレートから3分で生成・送付まで完了 |
| 見積書→請求書の転記ミスが発生する | ワンクリックで見積書を請求書に変換 |
| 入金確認を手動でやっていて漏れが出る | Stripe連携で入金を自動検知・ステータス更新 |
| 既製品の会計ソフトが自社フローに合わない | 業務フローに合わせて完全カスタマイズ可能 |
実際に動かしてみる(デモ)
以下は実際に動作するデモです。「請求書作成」タブで発行者情報・請求先・明細を入力すると消費税・合計金額が自動計算されます。「プレビュー」タブで実際の請求書レイアウトを確認し、「発行して保存」で発行履歴に追加されます。「発行履歴」タブでは入金済み・未入金・確認中のステータスで管理できます。
| 品目・サービス名 | 数量 | 単位 | 単価(円) | 金額(円) |
|---|
開発手順(8ステップ)
STEP 1:システム設計とアーキテクチャ
フロントエンドはReact + Next.js(請求書作成UI・プレビュー・管理画面)、バックエンドはNode.js + Express(API・PDF生成・メール送信)、データベースはPostgreSQL(顧客・請求書・明細・入金履歴)、PDF生成はPuppeteer(HeadlessChromiumでHTMLをPDF変換)、メール送信はSendGrid、決済連携はStripe Payment Links、ホスティングはVercel + Railwayの構成が推奨です。最初はVercel + Supabase(PostgreSQL)でMVPを月5,000円以下で構築できます。
STEP 2:データベース設計
PostgreSQLで5テーブルを設計します。clientsテーブル(顧客情報:会社名・担当者・メール・住所・振込先)、invoicesテーブル(請求書:顧客ID・請求書番号・発行日・支払期限・消費税率・ステータス・Stripe Payment Link URL)、invoice_itemsテーブル(明細:請求書ID・品目名・数量・単位・単価)、quotationsテーブル(見積書:invoicesと同構造)、paymentsテーブル(入金履歴:請求書ID・入金日・金額・Stripe決済ID)です。請求書番号は`INV-YYYY-NNN`形式でPostgreSQLのシーケンスで自動採番します。
STEP 3:請求書作成フォームとリアルタイム計算
ReactのuseStateで明細リストを管理し、追加・削除・編集をリアルタイムで反映します。小計はmemo化した計算関数で自動算出し、消費税率(10%・8%・非課税)の切り替えに即座に対応します。インボイス制度への対応として、登録番号(T+13桁)の入力欄と適格請求書フォーマット(品目ごとの税率区分表示)を実装します。見積書から請求書への変換はボタン一つでデータをコピーして新しい請求書として作成できるようにします。
STEP 4:PuppeteerによるPDF生成
Node.jsでPuppeteerを使い、請求書のHTMLテンプレートをHeadless ChromiumでPDFに変換します。`puppeteer.launch`でブラウザを起動し、`page.setContent`でHTMLを設定し、`page.pdf`でA4サイズのPDFを生成します。生成したPDFはAWS S3またはCloudflare R2に保存してURLを発行します。印刷用CSSはメディアクエリ`@media print`で余白・フォントサイズ・改ページを調整し、ブラウザ印刷とPDFの両方で綺麗に出力されるよう設計します。
STEP 5:SendGridによるメール自動送信
`@sendgrid/mail`パッケージでメール送信を実装します。送信タイミングは「請求書発行時」「支払期限7日前のリマインド」「入金確認時」の3つです。メールにはPDFの添付またはS3のダウンロードリンク、Stripeの決済リンクを含めます。SendGridのDynamic Templateを使うとHTMLメールのデザインをコード外で管理できて保守が楽になります。送信ログはPostgreSQLに記録してトラブル時に追跡できるようにします。
STEP 6:Stripe Payment Linksによる決済連携
Stripe APIで請求書ごとにPayment Linkを生成し、メールに埋め込みます。`stripe.paymentLinks.create`に金額・説明・有効期限を渡すとURLが発行されます。支払い完了後はStripe Webhookで`checkout.session.completed`イベントを受信し、PostgreSQLの請求書ステータスを「入金済み」に自動更新します。Webhook受信時はシグネチャ検証(`stripe.webhooks.constructEvent`)を必ず実装してセキュリティを確保します。銀行振込の場合はStripeの「customer_balance」支払い方法で仮想口座を発行できます。
STEP 7:管理画面の実装
Next.jsで管理画面を構築します。主な機能は請求書一覧(ステータス別フィルター・金額合計表示)、顧客マスター管理(よく使う請求先の登録)、売上ダッシュボード(月別売上グラフ・未回収金額の一覧)、入金消込(銀行振込の場合は手動で入金確認)です。Chart.jsで月別売上の棒グラフと未入金・入金済みの割合を円グラフで表示します。CSVエクスポートで会計ソフト(弥生・freee)へのデータ連携も実装します。
STEP 8:SaaS化と収益化
複数ユーザーが使えるマルチテナント設計にします。PostgreSQLに`company_id`カラムを追加して全テーブルでデータを分離します。価格設定は無料プラン(月5件まで)、スタンダードプラン(月額980円・無制限・PDF出力・メール送信)、ビジネスプラン(月額2,980円・Stripe連携・複数ユーザー・CSVエクスポート)の3階層が標準です。Stripeのサブスクリプション課金で実装します。フリーランス・小規模事業者が100人加入すれば月商約10〜30万円が見込めます。
開発・運用コストの目安
React + Node.js + PostgreSQL + Puppeteer + SendGrid + Stripeの構成なら、請求書作成・PDF出力・メール送信の基本フローを備えたMVPを10万円程度から開発できます。
| フェーズ | 内容 | 費用目安 |
|---|---|---|
| フェーズ1(MVP) | 請求書作成・PDF出力・メール送信・発行履歴 | 10万〜20万円 |
| フェーズ2(機能追加) | 見積書・Stripe決済・入金管理・顧客マスター | 10万〜20万円 |
| フェーズ3(SaaS化) | マルチテナント・課金・ダッシュボード・CSV連携 | 10万〜30万円 |
| Stripe手数料 | 決済金額の3.6%(国内カード) | 売上連動 |
| SendGrid | 月100通まで無料 | 月0円〜5,000円 |
| サーバー(Vercel + Railway) | フロントエンド + バックエンド + DB | 月3,000円〜10,000円 |
| 月額運用費(目安) | サーバー + 保守 + サポート | 月3万〜10万円 |
よくある質問
インボイス制度(適格請求書)に対応できますか?
対応できます。2023年10月から始まったインボイス制度に対応するには、発行者の適格請求書発行事業者登録番号(T+13桁)の表示、品目ごとの税率区分(10%・8%)の明示、税率ごとの小計と消費税額の表示が必要です。これらをHTMLテンプレートとデータベース設計に組み込むことで対応できます。自社の登録番号はインボイス登録番号フィールドとして顧客マスターに追加します。
既存の会計ソフト(freee・弥生)と連携できますか?
CSVエクスポート機能を実装することで多くの会計ソフトと連携できます。freeeはAPI連携(freee API)で請求書データを直接同期できます。弥生はCSVインポート形式に合わせたエクスポート機能で対応します。APIによるリアルタイム連携はフェーズ3以降での実装が現実的で、まずはCSVエクスポートでスタートするのが効率的です。
請求書番号の自動採番はどう実装しますか?
PostgreSQLのシーケンス(`CREATE SEQUENCE invoice_seq`)を使って採番します。年度ごとにリセットする場合は毎年1月1日にシーケンスをリセットするcronジョブを設定します。`INV-2026-001`のようなフォーマットはバックエンドで`INV-${year}-${String(seq).padStart(3,’0′)}`として生成します。採番はトランザクション内で行い、同時リクエストによる重複を防止します。
まとめ
React + Node.js + PostgreSQL + Puppeteer + SendGrid + Stripeの構成で請求書・見積書自動生成システムをMVP10万円程度から開発できます。明細入力・消費税自動計算・PDF出力・メール自動送信・Stripe決済連携・入金管理の6機能を段階的に実装することで、月30分〜1時間かかっていた請求書作業を3分に短縮できます。インボイス制度対応・freee/弥生連携まで対応することで、フリーランスから中小企業まで幅広いユーザーに提供できるSaaSになります。
開発のご相談や見積もりはお気軽にお問い合わせください。要件定義からリリースまで一貫してサポートします。
