毎月の受発注SaaSの請求書を見て、「この機能の半分も使っていないのに」と感じたことはないでしょうか。あるいは、自社のワークフローに合わない画面構成に合わせて業務を変えている、CSV出力のフォーマットが固定で後工程の加工に毎回手間がかかる——そうした小さな不満が積み重なっているなら、フルスクラッチへの切り替えを検討するタイミングかもしれません。ただし、SaaSにはSaaSの強みがあります。この記事では、受発注SaaSに不満を感じ始めている中小企業の経営者の方に向けて、「切り替えるべき条件」と「SaaSを残すべき条件」の両面から判断基準を整理します。
どんなサインが出たら切り替えを検討すべきか?
SaaSへの不満がすべて切り替えの理由になるわけではありません。以下のチェックリストで、自社の状況がどちらに近いかを確認してみてください。
切り替えを検討すべきサイン
- 使っていない機能に毎月コストを払っている。 SaaSの月額が膨らんでいるのに、利用しているのは受注管理と請求書発行だけ、という状態です。
- 自社固有の承認フローや帳票に対応できない。 「見積→社内承認→受注」の間に自社特有のステップがあるのに、SaaS側で再現できない。結果として、SaaSとExcelを併用している。
- データの入出力に制約がある。 欲しい項目でCSVが出せない、他システムとのAPI連携に制限がある、といった状況が業務のボトルネックになっている。
- SaaSの仕様変更に業務が振り回される。 アップデートで画面が変わるたびに現場が混乱する。自社の業務ペースではなく、SaaS側の開発ロードマップに従わざるを得ない。
- 月額課金の累積が、開発費用のレンジに近づいている。 年間で換算したときに、フルスクラッチの開発・運用費と大差がない水準になっている。
SaaSを残すべきサイン
- 法改正や税制対応をSaaS側が自動で吸収してくれている。 インボイス制度や電子帳簿保存法への対応をSaaSが肩代わりしている場合、自前で追従し続けるコストは小さくありません。
- 業務フローがSaaSの標準に十分収まっている。 不満が「ちょっとした使い勝手」の範囲なら、切り替えのコストに見合わない可能性があります。
- 社内にITの運用体制がない。 フルスクラッチのシステムは、作って終わりではなく運用が続きます。保守を外注する場合でも、窓口となる担当者は必要です。
- 受発注の件数が月に数十件以下。 業務量が少ない場合、SaaSの定額料金のほうがトータルで安く済むことがほとんどです。
どちらか一方に偏っていれば判断しやすいですが、実際にはサインが混在しているケースが多いかと思います。その場合は、「SaaSでは対応できない業務上のボトルネックが、売上や顧客対応に影響しているか」を軸に考えると、優先度が見えてきます。
Next.js + Firestore で受発注データをどう設計するか?
切り替えを検討する際に気になるのが、「フルスクラッチで作るとして、受発注データはどう持つのか」という点です。ここでは、Next.js 16(App Router)と Firebase の Firestore を前提に、基本的なデータモデルの考え方を整理します。
状態遷移の基本:見積 → 受注 → 納品 → 請求
受発注業務の中核は、1件の取引が複数のステータスを経て進むという「状態遷移」です。Firestore では、この遷移を1つのドキュメントの status フィールドで管理するのが最もシンプルな設計です。
orders/{orderId}
├── status: "estimate" | "ordered" | "delivered" | "invoiced" | "paid"
├── customerRef: customers/{customerId}
├── items: [ { name, quantity, unitPrice } ]
├── totalAmount: number
├── estimateDate: timestamp
├── orderDate: timestamp | null
├── deliveryDate: timestamp | null
├── invoiceDate: timestamp | null
├── statusHistory: [ { status, changedAt, changedBy } ]
└── ...メタ情報
statusHistory 配列を持たせることで、「誰がいつステータスを変更したか」の監査証跡を残せます。SaaSでは取れなかった粒度のログが自前で取れるようになる点は、フルスクラッチの利点の一つです。
Server Components で一覧画面を構成する
Next.js 16 の App Router では、Server Components がデフォルトです。受注一覧のような読み取り中心の画面は、サーバー側で Firestore からデータを取得し、組み立て済みのHTMLをブラウザに届けます。ブラウザに送る JavaScript の量が減るため、表示が速くなる傾向があります。
ステータスの変更ボタンやフィルター操作など、ユーザーの操作が必要な部分だけを Client Component として切り出します。この「サーバーで読み、クライアントで操作する」という分離が、受発注管理のように一覧表示と状態変更が混在する画面と相性が良い設計です。
Firestore セキュリティルールで権限を制御する
Firestore のセキュリティルールを使えば、「営業担当は自分が担当する案件のみ編集可能」「経理担当は請求ステータスのみ変更可能」といったアクセス制御を、アプリケーションコードとは別のレイヤーで定義できます。SaaSでは「管理者」と「一般ユーザー」の2段階しか選べなかった権限設計が、自社の組織構造に合わせて柔軟に組めるようになります。
受発注データの設計についてより広い視点で検討したい場合は、SaaS疲れの整理と判断軸をまとめた記事も参考になるかと思います。
