島根県安来市のフリーランスエンジニア_プログラマー画像1

請求書・見積書を自動生成するシステムの作り方【デモあり】|Node.js・Stripe・PDF出力・メール送信の実装手順とコスト

「毎月の請求書作成に時間がかかっている」「見積書から請求書への転記ミスが多い」「入金確認を手動でやっていて漏れが出る」——そんな課題を解決する請求書・見積書自動生成システムの開発手順を解説します。本記事では、明細入力・消費税自動計算・PDF出力・メール自動送信・Stripe決済リンク発行・入金管理までを備えたシステムを、実際に動くデモを交えながら解説します。React + Node.js + PostgreSQL + Stripe + SendGrid + Puppeteerの構成でSaaS化まで含めた実践的な内容です。

なぜ請求書・見積書の自動化が必要か

フリーランス・中小企業では毎月の請求書作成・送付・入金確認に多くの工数がかかっています。既製品の会計ソフトは機能過多で高額なことも多く、自社の業務フローに合わせたシステムを自作するニーズが高まっています。

課題 自動化システムでの改善
毎月の請求書作成に30分〜1時間かかる テンプレートから3分で生成・送付まで完了
見積書→請求書の転記ミスが発生する ワンクリックで見積書を請求書に変換
入金確認を手動でやっていて漏れが出る Stripe連携で入金を自動検知・ステータス更新
既製品の会計ソフトが自社フローに合わない 業務フローに合わせて完全カスタマイズ可能

実際に動かしてみる(デモ)

以下は実際に動作するデモです。「請求書作成」タブで発行者情報・請求先・明細を入力すると消費税・合計金額が自動計算されます。「プレビュー」タブで実際の請求書レイアウトを確認し、「発行して保存」で発行履歴に追加されます。「発行履歴」タブでは入金済み・未入金・確認中のステータスで管理できます。

デモシステム
発行者情報
請求先情報
請求情報
明細
品目・サービス名 数量 単位 単価(円) 金額(円)
小計¥0
消費税(10%)¥0
合計¥0
発行済み請求書

開発手順(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になります。

開発のご相談や見積もりはお気軽にお問い合わせください。要件定義からリリースまで一貫してサポートします。

WordPressコピー検知プラグイン「Eatransform Copy Guard」を公開しました

演歌アフィリエイトサイトをAIで完全自動化した話【WordPress実装】