ECサイトバックエンド設計:注文・在庫・決済・会員管理まで徹底解説
ECサイトのバックエンド設計は、商品を表示するだけの仕組みではありません。会員登録、ログイン、商品検索、カート、注文、決済、在庫更新、配送管理、返品対応、通知、分析、管理画面、外部サービス連携までを支える、EC運営全体の中核です。ユーザーから見える画面がどれだけ美しくても、裏側の処理が不安定であれば、注文漏れ、二重決済、在庫不整合、配送ミス、個人情報漏洩といった重大な問題につながります。
フロントエンドが「ユーザーに見える購買体験」を作る部分だとすれば、バックエンドは「正しく売る」「安全に処理する」「注文を確実に届ける」ための仕組みです。特にECでは、商品数、在庫数、注文数、ユーザー数、決済方法、配送条件、キャンペーン、セール負荷など、考えるべき要素が非常に多くなります。そのため、単に動く機能を作るだけではなく、将来的に商品数や注文数が増えても壊れにくい設計が重要になります。
ECバックエンドで特に難しいのは、複数の処理が連動する点です。たとえば、ユーザーが注文ボタンを押した瞬間には、カート内容の確認、価格の再計算、在庫の確認、在庫の確保、注文番号の発行、決済処理、注文ステータスの更新、通知送信、管理画面への反映など、多くの処理が関係します。このどこか一つでも設計が弱いと、ユーザー体験だけでなく運営側の業務にも大きな影響が出ます。
この記事では、ECサイトバックエンド設計を、会員管理、商品管理、カート、注文、在庫、決済、配送、API、データベース、セキュリティ、パフォーマンス、運用監視まで体系的に整理します。小規模ECを素早く立ち上げたい場合にも、大規模ECとして長期運用したい場合にも、どのような責務を分け、どこで整合性を守り、どの処理を慎重に設計すべきかを理解することが重要です。
1. ECサイトバックエンド設計とは
ECサイトバックエンド設計とは、ユーザーが商品を探し、カートに入れ、注文し、決済し、商品を受け取るまでの一連の処理をサーバー側で安全に管理する設計です。単なるデータ保存ではなく、注文状態、在庫状態、決済状態、配送状態、会員状態を整合性のある形で扱う必要があります。
ECでは、フロントエンドの画面表示とバックエンドの処理が密接に連携します。商品一覧を表示するだけでも、商品情報、価格、在庫、販売ステータス、カテゴリ、画像、検索条件、キャンペーン価格などが関係します。バックエンド設計が整理されていないと、機能追加のたびに処理が複雑化し、後から修正しにくいECシステムになってしまいます。
1.1 EC運営を支えるサーバー側の仕組み
ECバックエンドは、ユーザーから直接見えにくい部分ですが、EC運営の安定性を決める重要な基盤です。商品情報を保存するだけでなく、在庫数を正しく管理し、注文の状態を追跡し、決済結果を受け取り、配送状況を更新し、管理者が運営できる状態にする必要があります。ユーザーが商品を購入する短い操作の裏側では、多数の処理が連続して動いています。
特に注文処理では、金額、在庫、決済、配送先、注文者情報を正しく結びつけなければなりません。途中でエラーが起きた場合にも、注文だけ作られて決済されていない、決済されたのに注文が存在しない、在庫だけ減って注文が失敗した、といった状態を避ける必要があります。
| 領域 | バックエンドの役割 | 重要ポイント |
|---|---|---|
| 商品 | 商品情報を管理する | 表示可否・価格・画像を整理する |
| 会員 | ユーザー情報を管理する | 認証・住所・購入履歴を扱う |
| カート | 購入前の商品を保持する | 価格・在庫の再確認が必要 |
| 注文 | 購入確定情報を管理する | 注文番号と状態管理が重要 |
| 決済 | 支払い処理を連携する | 二重決済と失敗処理に注意 |
| 在庫 | 販売可能数を管理する | 不整合を防ぐ設計が必要 |
| 配送 | 出荷と追跡を管理する | 通知や配送会社連携が関係する |
1.2 フロントエンドとの違い
フロントエンドは、商品一覧、商品詳細、カート画面、注文画面、マイページなど、ユーザーが直接操作する画面を作ります。一方、バックエンドは、その画面から送られてくるリクエストを受け取り、データベースや外部サービスと連携しながら、安全に処理を行います。フロントエンドは見た目と操作性、バックエンドは正確性と整合性を担うと考えると分かりやすいです。
たとえば、フロントエンドでは「カートに入れる」ボタンを表示しますが、バックエンドでは、その商品が販売中か、在庫があるか、ユーザーのカートに追加できるか、価格が現在も有効かを確認します。画面上では単純な操作に見えても、サーバー側では複数の検証が必要です。
| 項目 | フロントエンド | バックエンド |
|---|---|---|
| 主な役割 | 画面表示・操作体験 | データ処理・業務ロジック |
| 対象 | ユーザーインターフェース | サーバー・データベース・外部連携 |
| 重要視する点 | 見やすさ・使いやすさ | 正確性・安全性・整合性 |
| 例 | 商品一覧画面 | 商品一覧API |
| 例 | 注文確認画面 | 注文作成・決済連携 |
| 例 | マイページ | 会員情報・購入履歴管理 |
1.3 商品・注文・決済を安全に処理する役割
ECバックエンドで最も重要なのは、商品、注文、決済を安全に処理することです。商品価格が間違っている、在庫がない商品を販売してしまう、注文が二重に作成される、決済結果が反映されない、といった問題は、ユーザーにも運営側にも大きな損害を与えます。そのため、バックエンドでは各処理の状態を明確に管理する必要があります。
特に決済処理では、外部の決済代行サービスと連携することが一般的です。決済が成功したか、失敗したか、保留中か、キャンセルされたかを正しく受け取り、注文ステータスと同期させる必要があります。決済結果の通知が遅れたり、重複して届いたりすることもあるため、同じ通知を複数回受けても安全に処理できる設計が重要です。
| 処理 | 安全に扱うべき理由 | 設計ポイント |
|---|---|---|
| 商品価格 | 金額ミスが売上に直結する | 注文確定時に再計算する |
| 在庫 | 売り越しを防ぐ必要がある | 仮確保と減算を分ける |
| 注文 | 購入履歴の基準になる | 一意な注文番号を発行する |
| 決済 | 金銭処理に直結する | 成功・失敗・取消を管理する |
| 配送 | 顧客体験に影響する | 出荷状態を追跡する |
| 返品 | 売上・在庫へ影響する | 返金と在庫戻しを設計する |
1.4 小規模ECと大規模ECで設計が変わる理由
小規模ECでは、商品数や注文数が少ないため、比較的シンプルな構成でも運用できます。管理者が手動で在庫を調整したり、注文を確認して配送手配したりすることも可能です。しかし、注文数が増え、商品数が増え、キャンペーンや複数倉庫、外部モール連携、定期購入、ポイント制度などが加わると、手動運用では限界が出てきます。
大規模ECでは、在庫更新、決済通知、配送連携、メール通知、分析処理などを非同期処理に分けたり、APIを明確に分離したり、検索基盤やキャッシュを導入したりする必要があります。最初から過剰に複雑にする必要はありませんが、後から拡張しやすいように、会員、商品、カート、注文、在庫、決済の責務を分けておくことが重要です。
2. ECバックエンドの基本機能
ECバックエンドには、会員管理、商品管理、カテゴリ管理、カート管理、注文管理、決済管理、在庫管理、配送管理などの基本機能があります。これらはそれぞれ独立した機能に見えますが、実際には注文処理を中心に密接につながっています。
たとえば、ユーザーが商品を購入する場合、会員情報、配送先住所、商品情報、在庫数、カート内容、注文情報、決済結果、配送ステータスが連動します。基本機能を分けて設計しながらも、注文時には整合性のある一つの流れとして処理する必要があります。
2.1 会員管理
会員管理は、ユーザー登録、ログイン、プロフィール、住所、購入履歴、退会などを管理する機能です。ECでは、会員情報が注文や配送、決済、問い合わせと結びつくため、正確かつ安全に扱う必要があります。特に個人情報を含むため、アクセス制御やデータ保護が重要です。
会員管理では、ユーザー自身が情報を更新できるマイページと、管理者が必要に応じて確認できる管理画面の両方を設計します。ただし、管理者が見られる情報は必要最小限にし、操作ログを残すことで安全性を高めます。
| 機能 | 内容 | 注意点 |
|---|---|---|
| 会員登録 | 新規ユーザーを作成 | メール確認を検討する |
| ログイン | 認証処理 | セッション管理が重要 |
| プロフィール | 氏名や連絡先を管理 | 個人情報保護が必要 |
| 住所管理 | 配送先を保存 | 複数住所に対応する |
| 購入履歴 | 過去注文を表示 | 本人のみ閲覧可能にする |
| 退会 | アカウント停止・削除 | 注文履歴との関係を整理する |
2.2 商品管理
商品管理は、商品名、説明、価格、画像、販売ステータス、カテゴリ、バリエーション、在庫連携などを扱う機能です。ECサイトでは商品情報が売上に直結するため、表示内容の正確性と管理しやすさが重要です。商品情報が不正確だと、購入後の問い合わせや返品につながる可能性があります。
商品管理では、公開中、非公開、販売停止、予約販売、在庫切れなどの状態を扱う必要があります。また、価格変更やキャンペーン価格を扱う場合は、いつからどの価格が有効なのかを管理する設計が必要です。
| 管理項目 | 内容 | 重要ポイント |
|---|---|---|
| 商品名 | 表示名 | 検索にも影響する |
| 商品説明 | 詳細情報 | 誤解を招かない表現にする |
| 価格 | 通常価格・割引価格 | 注文時に再確認する |
| 画像 | メイン画像・追加画像 | 配信最適化も必要 |
| ステータス | 公開・非公開・停止 | 表示制御に使う |
| バリエーション | サイズ・色など | 在庫と連携する |
2.3 カテゴリ管理
カテゴリ管理は、商品を分類し、ユーザーが探しやすい構造を作る機能です。カテゴリが整理されていると、商品一覧、検索、ナビゲーション、SEO、レコメンドにも良い影響があります。逆にカテゴリ設計が曖昧だと、ユーザーが商品を見つけにくくなります。
カテゴリは、階層構造を持つことが多いです。たとえば、「ファッション > メンズ > トップス > Tシャツ」のような構造です。ただし、階層が深すぎると管理が難しくなるため、ユーザーが理解しやすく、管理者も扱いやすい分類にすることが重要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 親カテゴリ | 大分類 | ナビゲーションに使う |
| 子カテゴリ | 中分類・小分類 | 絞り込みに使う |
| 表示順 | カテゴリの並び | 管理画面で変更可能にする |
| 公開状態 | 表示・非表示 | 季節カテゴリに使える |
| SEO情報 | タイトル・説明 | 一覧ページに影響 |
| 商品紐づけ | 商品との関係 | 複数カテゴリ対応を検討する |
2.4 カート管理
カート管理は、ユーザーが購入前に選んだ商品を一時的に保存する機能です。カートには商品ID、数量、バリエーション、価格情報、ユーザーIDまたはゲスト識別情報が関係します。カートは注文前の仮状態であり、注文確定時には必ず価格と在庫を再確認する必要があります。
カートでは、会員カートとゲストカートの扱いも重要です。ログイン前に入れた商品を、ログイン後に会員カートへ統合する処理が必要になる場合があります。また、長期間放置されたカートをどう扱うか、有効期限をどう設定するかも設計します。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 商品追加 | カートに商品を入れる | 販売中か確認する |
| 数量変更 | 数量を増減する | 上限や在庫を確認する |
| 削除 | 商品を外す | UIと同期させる |
| ゲストカート | 未ログイン状態 | 識別方法が必要 |
| 会員カート | ログイン後のカート | 複数端末同期を考える |
| 有効期限 | カート保持期間 | 放置カート対策に使う |
2.5 注文管理
注文管理は、ECバックエンドの中心機能です。注文が作成されると、注文者、配送先、商品明細、金額、決済状態、配送状態、キャンセル状態などを管理する必要があります。注文は売上、在庫、配送、問い合わせ、返品の基準になるため、データの正確性が非常に重要です。
注文管理では、注文作成、注文確定、決済待ち、支払い済み、出荷準備中、出荷済み、キャンセル、返品などのステータスを明確にします。ステータスが曖昧だと、管理者が現在の状況を判断できず、配送ミスや対応漏れにつながります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 注文番号 | 注文を一意に識別 | ユーザー問い合わせに使う |
| 注文者 | 会員情報 | 退会後の扱いも考える |
| 注文明細 | 商品ごとの購入情報 | 注文時点の価格を保存 |
| 注文金額 | 合計・送料・割引 | 再計算可能にする |
| 注文状態 | 処理状況 | 明確なステータス設計 |
| キャンセル | 取消処理 | 決済・在庫と連動 |
2.6 決済管理
決済管理は、注文に対する支払い状態を管理する機能です。クレジットカード、コンビニ決済、銀行振込、電子決済、後払いなど、決済方法によって処理の流れが異なります。決済が成功したか、失敗したか、保留中か、返金されたかを正しく管理する必要があります。
決済では、外部決済代行サービスと連携することが多くなります。決済結果の通知を受け取り、注文ステータスに反映する仕組みが必要です。通知が重複して届く場合もあるため、同じ決済結果を複数回受けても安全に処理できる設計が重要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 決済方法 | 支払い手段 | 方法ごとに処理が違う |
| 決済状態 | 成功・失敗・保留 | 注文状態と連動する |
| 決済ID | 外部決済の識別子 | 照合に必要 |
| 返金 | キャンセル時の返金 | 一部返金も考える |
| Webhook | 決済結果通知 | 重複通知に対応する |
| 監査 | 決済ログ | トラブル調査に必要 |
2.7 在庫管理
在庫管理は、販売可能な商品数を正しく管理する機能です。ECでは、ユーザーが同時に同じ商品を購入する可能性があるため、在庫数の整合性が非常に重要です。在庫がないのに注文できる売り越しや、在庫があるのに売れない状態は避ける必要があります。
在庫管理では、単純な在庫数だけでなく、仮在庫、引当済み在庫、販売可能在庫、返品在庫、複数倉庫在庫などを扱う場合があります。小規模ECではシンプルな在庫数で十分なこともありますが、注文数が増えると在庫確保の設計が重要になります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 在庫数 | 現在の保有数 | 正確な更新が必要 |
| 販売可能数 | 購入できる数 | 引当分を考慮する |
| 仮在庫 | 注文途中の確保 | 有効期限を設ける |
| 在庫切れ | 購入不可判定 | 表示制御と連動 |
| 返品在庫 | 戻ってきた商品 | 検品後に戻す |
| 倉庫別在庫 | 倉庫ごとの在庫 | 配送計算にも関係 |
2.8 配送管理
配送管理は、注文された商品をユーザーへ届けるための機能です。配送先住所、配送方法、配送料、出荷ステータス、追跡番号、配送業者連携、配送通知などを扱います。配送は購入後の顧客満足度に大きく影響するため、正確な情報管理が必要です。
配送管理では、注文ステータスと配送ステータスを分けて考えることが重要です。注文は支払い済みでも、配送は未出荷の場合があります。出荷済みでも、配送中、配達完了、持ち戻りなどの状態があります。これらを明確に管理すると、ユーザー問い合わせにも対応しやすくなります。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 配送先 | 住所情報 | 注文時点の住所を保存 |
| 配送方法 | 宅配便・メール便など | 商品サイズと関係する |
| 配送料 | 送料計算 | 地域や条件で変わる |
| 出荷状態 | 未出荷・出荷済み | 管理画面で重要 |
| 追跡番号 | 配送追跡 | 通知に使う |
| 配送通知 | メールやアプリ通知 | タイミングが重要 |
3. 会員管理設計
会員管理は、ECサイトの利用者情報を安全に扱うための基盤です。ユーザー登録、ログイン認証、パスワード管理、会員情報更新、住所管理、購入履歴管理、退会処理までを整理する必要があります。会員情報は注文や配送と結びつくため、個人情報保護と利便性のバランスが重要です。
会員管理を設計する際は、ユーザー自身が管理できる情報と、システム側が保持する履歴情報を分けて考えます。たとえば、ユーザーは住所や名前を更新できますが、過去注文の配送先情報は注文時点の記録として残す必要があります。このような設計を誤ると、過去注文の履歴が後から変わってしまうなどの問題が起きます。
3.1 ユーザー登録
ユーザー登録では、メールアドレス、パスワード、氏名、電話番号などを受け取り、アカウントを作成します。最初から多くの情報を求めすぎると登録率が下がるため、購入に必要な情報と後から登録できる情報を分ける設計が有効です。メールアドレスの重複チェックや本人確認も重要です。
登録時には、利用規約への同意、メール認証、仮登録状態、本登録状態などを設計する場合があります。特に会員限定価格や購入履歴機能を提供するECでは、正しいメールアドレスを確認しておくことで、注文通知やパスワード再設定の安全性が高まります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| メールアドレス | ログインIDとして使うことが多い | 重複と形式を確認する |
| パスワード | 認証に使う | ハッシュ化して保存する |
| 氏名 | 配送や請求に使う | 注文時にも確認する |
| 電話番号 | 配送連絡に使う | 必須にするか検討する |
| メール認証 | 本人確認 | 仮登録状態を管理する |
| 利用規約同意 | 法務上重要 | 同意日時を保存する |
3.2 ログイン認証
ログイン認証は、ユーザーが本人であることを確認する機能です。メールアドレスとパスワードによるログインが一般的ですが、SNSログインや多要素認証を導入する場合もあります。認証はECサイトの安全性に直結するため、失敗回数制限、セッション管理、ログアウト処理を適切に設計します。
ログイン後は、セッションCookieやトークンを使ってログイン状態を管理します。Cookieを使う場合は、HttpOnly、Secure、SameSiteを設定し、セッション固定攻撃を防ぐためにログイン時にセッションIDを再生成するなどの対策が必要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| メールログイン | メールとパスワードで認証 | 失敗回数制限を検討 |
| SNSログイン | 外部IDで認証 | 連携解除も設計する |
| セッション | ログイン状態管理 | Cookie属性を設定する |
| ログアウト | セッション破棄 | サーバー側でも無効化 |
| 多要素認証 | 追加認証 | 管理画面では特に有効 |
| 認証ログ | ログイン履歴 | 不正検知に使える |
3.3 パスワード管理
パスワードは、平文で保存してはいけません。必ず安全なハッシュ化を行い、必要に応じてソルトやストレッチングを利用します。パスワード再設定では、期限付きの再設定トークンを発行し、メールで送信するのが一般的です。再設定リンクは一度使ったら無効にする必要があります。
また、パスワード変更時には現在のパスワード確認や再認証を求めると安全性が高まります。弱すぎるパスワードを防ぐために、最低文字数やよく使われるパスワードの拒否も検討します。ただし、複雑すぎるルールはユーザー体験を悪化させるため、バランスが重要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| ハッシュ化 | パスワードを不可逆変換 | 平文保存しない |
| 再設定トークン | パスワード再設定に使う | 期限と一回限りの利用 |
| 変更処理 | パスワードを更新 | 再認証を検討 |
| 強度チェック | 弱いパスワードを防ぐ | ユーザー負担とのバランス |
| 失敗制限 | 総当たり防止 | ロックや遅延を導入 |
| 通知 | 変更通知を送る | 不正変更の検知に役立つ |
3.4 会員情報更新
会員情報更新では、氏名、電話番号、メールアドレス、性別、生年月日、通知設定などを変更できるようにします。個人情報を扱うため、本人確認と入力検証が重要です。特にメールアドレス変更では、新しいメールアドレスへの確認リンクを送るなど、慎重な処理が必要です。
更新された会員情報を過去注文に反映するかどうかも設計上のポイントです。通常、過去注文の注文者情報や配送先情報は、注文時点の記録として保持します。会員情報を変更しても過去注文の記録が変わらないようにすることで、問い合わせや会計処理の整合性を保てます。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 氏名変更 | 表示名や配送名を更新 | 注文時には再確認 |
| メール変更 | ログインID変更になる場合 | 新メール確認が必要 |
| 電話番号変更 | 配送連絡に使用 | 形式検証を行う |
| 通知設定 | メール・アプリ通知 | 同意管理が必要 |
| 個人情報 | プロフィール情報 | アクセス制御が重要 |
| 更新履歴 | 変更記録 | 不正変更調査に役立つ |
3.5 住所管理
住所管理では、ユーザーが複数の配送先住所を登録できるようにする場合があります。自宅、勤務先、ギフト先など、用途によって配送先が異なるためです。住所には氏名、郵便番号、都道府県、市区町村、番地、建物名、電話番号などが含まれます。
注文時には、会員の住所をコピーして注文配送先として保存するのが一般的です。これにより、注文後に会員住所が変更されても、過去注文の配送先記録は変わりません。配送処理の正確性を保つためにも、住所マスタと注文時住所を分ける設計が重要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 住所登録 | 配送先を保存 | 複数住所対応を検討 |
| 住所編集 | 登録住所を更新 | 過去注文には影響させない |
| 既定住所 | よく使う住所 | 注文時の初期値にする |
| 郵便番号補完 | 住所入力を補助 | 入力負担を減らす |
| ギフト住所 | 別送先 | 請求先と分ける |
| 注文時住所 | 注文記録として保存 | 後から変わらないようにする |
3.6 購入履歴管理
購入履歴管理では、ユーザーが過去の注文を確認できるようにします。注文番号、注文日、商品名、数量、金額、決済状態、配送状態、追跡番号、キャンセル可否などを表示します。購入履歴は、再購入、問い合わせ、返品、領収書発行にも関係します。
購入履歴では、注文当時の商品名や価格を保存しておくことが重要です。商品マスタの情報が後から変更されても、過去注文の内容は変わるべきではありません。注文履歴は、現在の商品情報ではなく、注文時点の記録として扱います。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 注文番号 | 注文識別子 | 問い合わせに使う |
| 注文日 | 購入日時 | 履歴表示に必要 |
| 商品情報 | 購入商品 | 注文時点の名称を保存 |
| 金額 | 支払い金額 | 割引や送料も含める |
| 配送状態 | 出荷・配送状況 | 追跡番号と連携 |
| 再購入 | 同じ商品を再注文 | 販売中か再確認する |
3.7 退会処理
退会処理では、ユーザーがアカウントを削除または無効化できるようにします。ただし、ECでは退会後も注文履歴、配送履歴、決済記録、会計上の記録を保持する必要がある場合があります。そのため、単純にユーザーデータをすべて削除すると、注文管理や問い合わせ対応に問題が出る可能性があります。
退会設計では、ログイン不可にする、個人情報を匿名化する、注文履歴は運営上必要な範囲で保持するなど、要件に合わせて処理を分けます。退会後のメール配信停止や、未処理注文がある場合の扱いも明確にする必要があります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 退会申請 | ユーザーが退会する | 確認画面を入れる |
| アカウント無効化 | ログイン不可にする | 注文履歴は残す場合がある |
| 個人情報削除 | 不要情報を削除 | 法務要件を確認する |
| 匿名化 | 個人を特定しにくくする | 分析用データに使える |
| 未処理注文 | 配送前注文の扱い | 退会前に確認する |
| メール停止 | 通知を止める | 配送通知は例外検討 |
4. 商品管理設計
商品管理設計では、商品情報、画像、価格、バリエーション、カテゴリ、販売ステータス、検索連携を整理します。商品管理はフロント表示だけでなく、在庫、注文、キャンペーン、検索、レコメンド、管理画面にも影響するため、EC全体の基盤になります。
商品データが整理されていないと、検索しにくい、価格変更が反映されない、在庫が分かりにくい、商品ページの情報が不正確になるなどの問題が起きます。商品管理では、表示用情報と業務用情報を分けながら、運営しやすい構造にすることが重要です。
4.1 商品情報管理
商品情報管理では、商品名、説明文、ブランド、型番、仕様、素材、サイズ、重量、注意事項などを管理します。ユーザーに見せる説明だけでなく、管理者が商品を識別するための内部コードも必要です。商品情報は検索やフィルタリングにも使われるため、項目設計が重要です。
商品説明は、ユーザーの購入判断に直結します。曖昧な説明や不足した情報は、問い合わせや返品につながります。バックエンドでは、商品情報を構造化し、フロントエンドが必要な情報を適切に表示できるようにします。
| 項目 | 内容 | 用途 |
|---|---|---|
| 商品ID | 内部識別子 | データ連携 |
| 商品名 | 表示名 | 商品ページ・検索 |
| 商品説明 | 詳細情報 | 購入判断 |
| ブランド | メーカーやブランド | フィルター |
| 型番 | 製品番号 | 問い合わせ対応 |
| 仕様 | サイズ・素材など | 比較表示 |
| 注意事項 | 利用上の注意 | トラブル防止 |
4.2 商品画像管理
商品画像は、ECの購入率に大きく影響します。商品一覧用のサムネイル、商品詳細用の高解像度画像、バリエーション別画像、拡大画像、動画、3D画像などを扱う場合があります。バックエンドでは、画像ファイルの保存場所、URL、表示順、代替テキスト、公開状態を管理します。
画像は容量が大きくなりやすいため、配信最適化も重要です。CDN、画像リサイズ、WebPなどの形式変換、遅延読み込みを組み合わせることで、表示速度を改善できます。商品画像管理は、単なるアップロード機能ではなく、ECパフォーマンスにも関係します。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| メイン画像 | 商品代表画像 | 一覧表示に使う |
| 追加画像 | 詳細画像 | 商品理解を深める |
| バリエーション画像 | 色やサイズ別画像 | 選択状態と連動 |
| 画像順序 | 表示順 | 管理画面で変更可能にする |
| 代替テキスト | 画像説明 | アクセシビリティに有効 |
| CDN配信 | 高速配信 | 表示速度改善 |
4.3 価格管理
価格管理では、通常価格、セール価格、会員価格、キャンペーン価格、税込・税抜、送料条件などを扱います。価格は注文金額に直結するため、表示価格と注文確定価格の整合性が非常に重要です。商品ページに表示されていた価格と、注文時の価格が違う場合はユーザーに明確に伝える必要があります。
実務では、価格変更の履歴や適用期間も重要になります。セール期間中だけ価格を変える、会員ランクによって価格を変える、クーポンを適用するなど、複数の価格ルールが重なることがあります。バックエンドでは、注文確定時に価格を再計算し、注文時点の価格を注文明細に保存します。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 通常価格 | 基本価格 | 商品マスタに保持 |
| セール価格 | 割引価格 | 適用期間が必要 |
| 会員価格 | 会員向け価格 | 権限やランクと連動 |
| 税設定 | 税込・税抜 | 表示と計算を統一 |
| クーポン | 割引処理 | 重複適用に注意 |
| 注文時価格 | 購入時点の価格 | 履歴として保存 |
4.4 商品バリエーション管理
商品バリエーションは、サイズ、色、容量、素材など、同じ商品に複数の選択肢がある場合に必要です。たとえば、Tシャツならサイズと色、コスメなら色番、家電なら容量や型番がバリエーションになります。バリエーションごとに価格や在庫、画像が異なる場合もあります。
バリエーション管理では、親商品と子SKUを分ける設計がよく使われます。親商品は商品ページの基本情報を持ち、子SKUは実際に購入される単位として在庫や価格を持ちます。この分離により、商品表示と在庫管理を整理しやすくなります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 親商品 | 商品ページ単位 | 共通説明を持つ |
| SKU | 販売単位 | 在庫・価格を持つ |
| サイズ | S/M/Lなど | 在庫と連動 |
| 色 | カラー選択 | 画像と連動 |
| 型番 | バリエーション識別 | 問い合わせに使う |
| 販売可否 | SKU単位で管理 | 一部在庫切れに対応 |
4.5 カテゴリ分類
カテゴリ分類は、商品を探しやすくするための重要な設計です。ユーザーが商品を見つけやすくなるだけでなく、商品一覧、検索フィルター、ナビゲーション、SEO、キャンペーンページにも影響します。商品を一つのカテゴリだけに入れるのか、複数カテゴリに所属させるのかも設計ポイントです。
カテゴリが増えすぎると管理が難しくなり、少なすぎるとユーザーが絞り込みにくくなります。商品数や業界特性に合わせて、適切な階層と分類ルールを作ることが大切です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 大カテゴリ | 商品の大分類 | ナビゲーションの基準 |
| 中カテゴリ | 詳細分類 | 絞り込みに使う |
| 小カテゴリ | 具体的分類 | 深すぎに注意 |
| 複数所属 | 商品を複数カテゴリへ | 重複表示の扱い |
| 表示順 | カテゴリの並び | 管理画面で調整 |
| SEO項目 | タイトル・説明 | 一覧ページに反映 |
4.6 販売ステータス管理
販売ステータス管理では、商品が公開中、非公開、販売停止、在庫切れ、予約販売、販売終了など、どの状態にあるかを管理します。商品ページに表示するか、カートに入れられるか、検索結果に出すかは、販売ステータスによって変わります。
販売ステータスを単純な公開・非公開だけで管理すると、予約販売や販売終了、在庫切れ時の表示などに対応しにくくなります。ユーザーに見せる状態と、購入可能かどうかを分けて設計すると柔軟になります。
| ステータス | 内容 | 表示・購入の扱い |
|---|---|---|
| 公開中 | 通常販売 | 表示・購入可能 |
| 非公開 | 管理中 | 表示しない |
| 販売停止 | 一時停止 | 表示するが購入不可も可能 |
| 在庫切れ | 在庫なし | 表示し購入不可 |
| 予約販売 | 予約受付 | 出荷予定日を表示 |
| 販売終了 | 終了商品 | 履歴用に残す場合あり |
4.7 商品検索との関係
商品管理は、商品検索と強く関係します。商品名、説明、カテゴリ、ブランド、価格、タグ、属性、在庫状態などが検索対象になります。商品データが構造化されていないと、検索精度が下がり、ユーザーが商品を見つけにくくなります。
検索機能を強化する場合、データベース検索だけでなく、検索エンジンを使う場合もあります。大規模ECでは、全文検索、絞り込み、並び替え、関連語対応、検索ログ分析が重要になります。バックエンドでは、商品データを検索基盤へ同期する設計も必要です。
| 項目 | 検索での役割 | 設計ポイント |
|---|---|---|
| 商品名 | 主要検索対象 | 表記ゆれに注意 |
| 説明文 | 詳細検索 | 長文検索に使う |
| カテゴリ | 絞り込み | 階層を整理 |
| ブランド | フィルター | 正規化が必要 |
| 価格 | 範囲検索 | 税込表示と整合 |
| タグ | 関連検索 | 乱立に注意 |
| 在庫状態 | 表示制御 | 売り切れ表示を決める |
5. カート設計
カート設計は、ユーザーが購入前に商品を一時的に保持するための設計です。カートは注文ではなく、購入前の仮状態です。そのため、カートに入れた時点では在庫や価格が確定しているとは限りません。注文確定時に、最新の価格、販売状態、在庫を再確認する必要があります。
カートはUXにも大きく影響します。商品追加、数量変更、削除、ログイン後のカート統合、放置カート復元などが使いやすいと、購入率向上につながります。一方で、カート内の商品が古い価格のまま残ったり、在庫切れ商品を購入できたりすると、トラブルになります。
5.1 ゲストカート
ゲストカートは、ログインしていないユーザーのカートです。初回訪問ユーザーでも商品をカートに入れられるため、購入導線を短くできます。ゲストカートでは、ブラウザCookieや一時識別子を使ってカート内容を保持することが一般的です。
ただし、ゲストカートは端末やブラウザに依存しやすく、ユーザーが別端末でアクセスすると引き継げない場合があります。ログイン時にゲストカートを会員カートへ統合する処理も必要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 識別方法 | Cookieや一時ID | 有効期限が必要 |
| 保存場所 | DBまたはブラウザ | セキュリティに注意 |
| ログイン連携 | 会員カートへ統合 | 重複商品を処理 |
| 有効期限 | 一定期間で削除 | 放置データを整理 |
| 端末依存 | 同じ端末で利用 | 別端末では引き継ぎにくい |
| UX効果 | 登録前に購入準備可能 | 購入率改善に有効 |
5.2 会員カート
会員カートは、ログイン済みユーザーに紐づくカートです。複数端末で同じカートを共有しやすく、後から購入を再開しやすい点がメリットです。会員カートは、ユーザーIDに紐づけてデータベースに保存するのが一般的です。
会員カートでは、ゲストカートとの統合が重要です。ログイン前に入れた商品と、ログイン後に保存されていた商品が重なる場合、数量を合算するのか、最新の操作を優先するのかを決める必要があります。統合ルールが曖昧だと、ユーザーにとって分かりにくい体験になります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| ユーザー紐づけ | 会員IDで管理 | 複数端末対応 |
| 永続化 | DBに保存 | ログアウト後も保持可能 |
| ゲスト統合 | ログイン時に統合 | 重複商品の扱いを決める |
| 数量管理 | 商品ごとの数量 | 上限と在庫を確認 |
| 表示同期 | 複数端末で反映 | 更新競合に注意 |
| 放置カート | 後日再開可能 | 通知施策に使える |
5.3 カート有効期限
カート有効期限は、カート内の商品をどれくらい保持するかを決める設計です。長く保持するとユーザーは後から購入しやすくなりますが、古い価格や販売終了商品が残る可能性があります。短すぎると、ユーザーが比較検討している間にカートが消えてしまい、UXが悪化します。
有効期限を設ける場合は、カート内の商品が期限切れになったときの表示も重要です。「この商品は販売終了しました」「価格が変更されました」「在庫切れです」のように、理由を明確に伝えるとユーザーの混乱を減らせます。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 有効期間 | カート保持日数 | 商品カテゴリに応じて調整 |
| 期限切れ処理 | 自動削除・無効化 | ユーザーに理由を表示 |
| 価格変更 | 古い価格との差分 | 注文時に再確認 |
| 在庫切れ | 購入不可にする | 代替商品提案も有効 |
| 放置通知 | リマインド | 過剰通知に注意 |
| データ削除 | 古いカート整理 | DB負荷を減らす |
5.4 数量変更
カート内の数量変更では、ユーザーが商品数を増減できるようにします。ただし、数量変更時には販売中かどうか、購入上限を超えていないか、在庫が足りるかを確認する必要があります。フロントエンド上で数量を変えられても、サーバー側で検証しなければ安全ではありません。
数量変更は、価格計算にも影響します。数量によって割引が適用される場合や、送料が変わる場合もあります。カート内の合計金額は、数量変更のたびに最新条件で再計算する必要があります。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 数量増加 | 購入数を増やす | 在庫と上限を確認 |
| 数量減少 | 購入数を減らす | 0の場合は削除扱いも検討 |
| 購入上限 | 最大購入数 | 転売対策にも使える |
| 在庫確認 | 販売可能数を確認 | 注文時にも再確認 |
| 金額再計算 | 小計・合計を更新 | 割引や送料も反映 |
| エラー表示 | 変更不可の理由 | 分かりやすく伝える |
5.5 価格変更時の扱い
カートに入れた後に商品価格が変更されることがあります。セール開始、セール終了、価格改定、クーポン適用条件の変更などが原因です。カートに入れた時点の価格を保持するのか、注文時の最新価格を適用するのかを明確にする必要があります。
一般的には、注文確定時に最新価格を再計算し、価格が変わった場合はユーザーに通知します。ユーザーに気づかれないまま金額が変わると不信感につながるため、確認画面で差分を明示することが重要です。
| 状況 | 処理 | ユーザー表示 |
|---|---|---|
| 価格上昇 | 最新価格へ更新 | 価格変更を通知 |
| 価格低下 | 最新価格へ更新 | 値下げを表示 |
| セール終了 | 通常価格へ戻す | セール終了を表示 |
| クーポン変更 | 再計算 | 適用不可理由を表示 |
| 税率変更 | 税計算更新 | 合計金額を再表示 |
| 注文確定前 | 最終確認 | ユーザーに承認させる |
5.6 在庫確認との関係
カートに商品が入っていても、在庫が確保されているとは限りません。多くのECでは、カート投入時点では在庫を減らさず、注文確定時に在庫を確保または減算します。そのため、カートに入れた商品が注文時に在庫切れになる可能性があります。
在庫確認は、カート表示時、数量変更時、注文確認時、注文確定時に行うのが安全です。特に注文確定時には、トランザクションやロックを使って在庫不整合を防ぐ必要があります。
| タイミング | 確認内容 | 目的 |
|---|---|---|
| カート追加時 | 販売中・在庫あり | 初期追加を制御 |
| カート表示時 | 現在の販売状態 | 古いカートを検出 |
| 数量変更時 | 数量上限・在庫 | 過剰数量を防ぐ |
| 注文確認時 | 価格・在庫 | 最終確認 |
| 注文確定時 | 在庫確保 | 売り越し防止 |
| 決済失敗時 | 在庫解放 | 仮確保を戻す |
5.7 カート復元設計
カート復元は、ユーザーが一度離脱しても、後からカート内容を再表示できるようにする設計です。会員カートではDBに保存し、ゲストカートではCookieや一時IDを使って復元します。放置カート施策や再訪時の購入促進にも関係します。
ただし、復元時には商品状態を再確認する必要があります。販売終了、在庫切れ、価格変更、バリエーション削除が起きている場合があります。復元できることは便利ですが、古い情報のまま注文できないようにすることが重要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 会員復元 | ログイン後に復元 | 複数端末対応 |
| ゲスト復元 | Cookieで復元 | 期限を設ける |
| 商品状態確認 | 販売中か確認 | 販売終了を表示 |
| 価格再計算 | 最新価格を反映 | 差分を通知 |
| 在庫確認 | 購入可能か確認 | 在庫切れを表示 |
| リマインド | 放置カート通知 | 配信頻度に注意 |
6. 注文処理設計
注文処理は、ECバックエンドで最も重要な処理の一つです。カート内の商品を注文として確定し、注文番号を発行し、金額を確定し、在庫や決済と連携します。注文処理は途中で失敗する可能性があるため、どの段階で注文を作成し、どの段階で在庫を確保し、どの段階で決済を行うかを明確にする必要があります。
注文処理では、整合性と再実行安全性が重要です。ユーザーが注文ボタンを連打した場合、通信がタイムアウトした場合、決済通知が遅れた場合でも、注文が重複したり、在庫だけ減ったりしないように設計します。
6.1 注文作成
注文作成では、カート内容、会員情報、配送先、支払い方法、送料、割引、合計金額をもとに注文データを作成します。注文作成時には、商品が販売中か、価格が最新か、在庫があるかを再確認します。カート内の情報をそのまま信じるのではなく、サーバー側で確定情報を作ります。
注文データには、注文者情報や配送先情報を注文時点のスナップショットとして保存します。会員情報が後から変更されても、注文時の記録が変わらないようにするためです。これは、問い合わせ対応や配送処理、会計処理に重要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| カート内容確認 | 商品と数量を確認 | 販売状態を再確認 |
| 金額計算 | 商品小計・送料・割引 | サーバー側で計算 |
| 注文者情報 | 氏名・連絡先 | 注文時点で保存 |
| 配送先 | 住所情報 | 会員住所とは別保存 |
| 注文明細 | 商品ごとの情報 | 注文時価格を保存 |
| 注文作成 | 注文レコードを作成 | トランザクションを検討 |
6.2 注文番号発行
注文番号は、ユーザー問い合わせ、管理画面、配送連携、決済照合に使われる重要な識別子です。内部IDとは別に、ユーザーに見せる注文番号を発行することが一般的です。注文番号は一意であり、推測されにくい形式が望ましいです。
注文番号は、日付や連番を含める場合もありますが、単純な連番だけだと注文数が推測されやすくなることがあります。運営上の扱いやすさとセキュリティのバランスを考え、適切な形式を決めます。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 内部ID | DB上の識別子 | 外部に出さない場合もある |
| 注文番号 | ユーザー表示用 | 一意性が必要 |
| 形式 | 日付+ランダムなど | 推測しにくくする |
| 決済連携ID | 決済との照合 | 外部IDと紐づけ |
| 問い合わせ | ユーザー確認用 | 分かりやすい形式 |
| 再発行 | 原則避ける | 注文履歴と整合させる |
6.3 注文ステータス管理
注文ステータス管理では、注文が現在どの状態にあるかを管理します。注文受付、決済待ち、支払い済み、出荷準備中、出荷済み、キャンセル、返品などの状態を明確に定義します。ステータスが曖昧だと、管理者が処理すべき注文を判断できず、配送漏れや対応漏れにつながります。
注文ステータスは、決済ステータスや配送ステータスと分けて管理することもあります。たとえば、注文は受付済みでも決済は未完了、決済は完了しているが配送は未出荷、という状態があり得ます。状態を分けることで、処理の流れを正確に表現できます。
| ステータス | 内容 | 次の処理 |
|---|---|---|
| 注文受付 | 注文データ作成済み | 決済確認 |
| 決済待ち | 支払い未完了 | 入金確認 |
| 支払い済み | 決済成功 | 出荷準備 |
| 出荷準備中 | 梱包・手配中 | 出荷処理 |
| 出荷済み | 配送開始 | 追跡通知 |
| キャンセル | 注文取消 | 在庫戻し・返金 |
| 返品 | 返品処理中 | 返金・在庫処理 |
6.4 注文確定タイミング
注文確定タイミングは、注文データをいつ正式な注文として扱うかを決める重要な設計です。注文ボタン押下時に確定するのか、決済成功時に確定するのか、入金確認時に確定するのかは、決済方法によって異なります。クレジットカード決済と銀行振込では、確定の考え方が変わります。
設計上は、注文作成、在庫確保、決済成功、出荷可能状態を分けて考えると安全です。注文作成直後は仮状態にし、決済成功後に正式注文へ進めるなど、処理段階を明確にします。
| タイミング | 内容 | 向いているケース |
|---|---|---|
| 注文ボタン時 | 注文をすぐ作成 | 銀行振込・コンビニ決済 |
| 決済成功時 | 支払い成功で確定 | クレジットカード |
| 入金確認時 | 入金後に確定 | 銀行振込 |
| 在庫確保時 | 在庫を先に押さえる | 限定商品 |
| 出荷準備時 | 出荷可能で確定 | 受注生産 |
| 管理者承認時 | 手動確認後 | 高額商品・法人取引 |
6.5 注文重複防止
注文重複は、ユーザーが注文ボタンを連打した場合、通信エラーで再送した場合、決済通知が複数回届いた場合などに発生する可能性があります。注文が重複すると、二重決済や二重配送につながるため、必ず防止する必要があります。
重複防止には、冪等性キー、注文処理中フラグ、決済IDの一意制約、ボタンの二重送信防止などを組み合わせます。フロントエンドでボタンを無効化するだけでは不十分であり、バックエンド側で同じ処理が複数回実行されても一度だけ反映される設計が重要です。
| 対策 | 内容 | 注意点 |
|---|---|---|
| 冪等性キー | 同じ処理を一度だけ実行 | API設計で有効 |
| 一意制約 | 決済IDや注文キーを一意にする | DB側でも守る |
| 処理中フラグ | 注文処理中を管理 | タイムアウト時に注意 |
| ボタン無効化 | フロントで連打防止 | サーバー対策も必要 |
| 決済通知重複対応 | 同じ通知を再処理しない | Webhookで重要 |
| ログ記録 | 重複検知 | 調査に使う |
6.6 キャンセル処理
キャンセル処理では、注文を取り消し、必要に応じて在庫を戻し、決済を取り消しまたは返金します。キャンセル可能かどうかは、注文状態、決済状態、出荷状態によって変わります。出荷前ならキャンセル可能でも、出荷後は返品扱いになる場合があります。
キャンセル処理は、注文、在庫、決済、配送が連動するため慎重に設計します。途中で処理が失敗した場合、注文はキャンセル済みなのに返金されていない、在庫が戻っていない、といった状態を避ける必要があります。
| 条件 | 処理 | 注意点 |
|---|---|---|
| 決済前キャンセル | 注文取消 | 在庫仮確保を戻す |
| 決済後キャンセル | 返金処理 | 決済サービス連携 |
| 出荷前キャンセル | 出荷停止 | 倉庫連携が必要 |
| 出荷後キャンセル | 返品扱い | 配送状態を確認 |
| 一部キャンセル | 一部商品だけ取消 | 金額再計算が必要 |
| 管理者キャンセル | 管理画面から実行 | 操作ログを残す |
6.7 注文履歴表示
注文履歴表示では、ユーザーが自分の注文状況を確認できるようにします。注文番号、注文日、商品名、数量、金額、支払い状態、配送状態、追跡番号、キャンセル可否などを表示します。ユーザーが状況を自分で確認できれば、問い合わせ削減にもつながります。
注文履歴では、注文時点の情報を表示することが重要です。商品名や価格が後から変更されても、過去注文には購入時の内容を表示します。また、本人以外が他人の注文を見られないように、認可チェックを必ず行います。
| 表示項目 | 内容 | 注意点 |
|---|---|---|
| 注文番号 | 問い合わせ用 | 一意な番号 |
| 注文日 | 購入日時 | タイムゾーンに注意 |
| 商品情報 | 購入商品 | 注文時点の情報 |
| 金額 | 合計・送料・割引 | 注文時点で固定 |
| 決済状態 | 支払い状況 | 注文状態と分ける |
| 配送状態 | 出荷・配送状況 | 追跡番号と連携 |
| キャンセル可否 | 操作可能性 | 状態に応じて制御 |
7. 在庫管理設計
在庫管理は、ECバックエンドで最も不整合が起きやすい領域の一つです。複数ユーザーが同時に同じ商品を購入する場合、在庫数を正しく制御できないと、在庫がないのに注文を受けてしまう売り越しが発生します。逆に、在庫があるのに販売できない状態になると機会損失になります。
在庫管理では、在庫数、仮在庫、注文確定時の減算、キャンセル時の戻し、在庫切れ判定、複数倉庫対応、不整合監視を設計します。小規模ECでは単純な在庫数管理でも運用できますが、注文数が増えるとトランザクションやロック、在庫引当の考え方が重要になります。
7.1 在庫数管理
在庫数管理では、商品またはSKUごとに現在の在庫数を保持します。バリエーションがある商品では、親商品ではなくSKU単位で在庫を持つことが一般的です。たとえば、同じTシャツでも、黒のMサイズと白のLサイズでは在庫が異なります。
在庫数は注文、キャンセル、返品、入荷、棚卸しによって変動します。すべての変動を履歴として残しておくと、在庫不整合が起きたときに原因を追跡しやすくなります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| SKU在庫 | 販売単位の在庫 | サイズ・色ごとに管理 |
| 入荷 | 在庫を増やす | 入荷履歴を残す |
| 出荷 | 在庫を減らす | 注文と連動 |
| 調整 | 手動補正 | 理由を記録する |
| 棚卸し | 実在庫確認 | 差分を記録 |
| 在庫履歴 | 増減ログ | 調査に必要 |
7.2 仮在庫確保
仮在庫確保は、注文途中の商品を一時的に押さえる処理です。決済前に在庫を完全に減らすと、決済失敗時に戻す必要があります。一方、決済成功まで在庫を押さえないと、決済後に在庫がない状態になる可能性があります。そのため、注文フローに応じて仮確保を設計します。
仮在庫には有効期限が必要です。ユーザーが決済途中で離脱した場合、在庫をいつまでも押さえ続けると販売機会を失います。一定時間が経過したら仮在庫を解放する処理を用意します。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 仮確保 | 注文途中で在庫を押さえる | 決済前に有効 |
| 有効期限 | 一定時間で解放 | 放置対策 |
| 決済成功 | 確定在庫減算へ進む | 注文確定と連動 |
| 決済失敗 | 仮確保を戻す | 自動解放が必要 |
| セール時 | 同時購入が多い | ロック設計が重要 |
| 管理画面 | 仮在庫を確認 | トラブル調査に役立つ |
7.3 注文確定時の在庫減算
注文確定時の在庫減算では、購入された数量を在庫から減らします。この処理は、注文作成や決済成功と密接に関係します。どのタイミングで在庫を減らすかは、決済方法や業務フローによって変わります。クレジットカードなら決済成功時、銀行振込なら入金確認時などが考えられます。
在庫減算では、同時注文への対応が重要です。複数ユーザーが同時に最後の1点を購入しようとした場合、一方だけを成功させる必要があります。データベーストランザクションや行ロック、条件付き更新などを使って不整合を防ぎます。
| タイミング | 内容 | 向いているケース |
|---|---|---|
| 注文作成時 | すぐ在庫を減らす | 在庫確保を優先 |
| 決済成功時 | 支払い後に減算 | クレジットカード |
| 入金確認時 | 入金後に減算 | 銀行振込 |
| 出荷時 | 出荷時に減算 | 受注生産や倉庫連携 |
| 仮確保後 | 仮在庫から確定へ | セール商品 |
| 条件付き更新 | 在庫が足りる場合だけ減算 | 売り越し防止 |
7.4 キャンセル時の在庫戻し
キャンセル時には、注文で確保または減算された在庫を戻す必要があります。ただし、すべてのキャンセルで即座に販売可能在庫へ戻せるとは限りません。出荷前キャンセルであれば戻せる場合が多いですが、出荷後の返品では検品後に戻す必要があります。
在庫戻しは、決済返金や注文ステータス変更と連動します。途中で失敗すると在庫不整合が起きるため、処理ログを残し、必要に応じて再実行できる設計にします。
| 状況 | 在庫処理 | 注意点 |
|---|---|---|
| 決済前キャンセル | 仮在庫を解放 | 自動処理可能 |
| 決済後キャンセル | 在庫を戻す | 返金と連動 |
| 出荷前キャンセル | 出荷停止後に戻す | 倉庫連携が必要 |
| 出荷後返品 | 検品後に戻す | 商品状態を確認 |
| 一部キャンセル | 一部数量だけ戻す | 明細単位で処理 |
| 失敗時 | 再処理 | ログが必要 |
7.5 在庫切れ判定
在庫切れ判定では、商品を購入可能にするかどうかを決めます。在庫数が0の場合は購入ボタンを無効化する、商品ページで在庫切れ表示にする、再入荷通知を受け付けるなどの処理が必要です。販売可能数が少ない場合は、残りわずか表示を出すこともあります。
ただし、在庫切れ判定はフロントエンド表示だけで行ってはいけません。ユーザーが古い画面を開いている場合や、APIを直接呼び出す場合があるため、注文確定時には必ずサーバー側で在庫を確認します。
| 状態 | 表示 | サーバー処理 |
|---|---|---|
| 在庫あり | 購入可能 | 注文時に再確認 |
| 残りわずか | 注意表示 | 数量上限を制御 |
| 在庫切れ | 購入不可 | カート追加を拒否 |
| 再入荷予定 | 通知受付 | 入荷時に案内 |
| 販売終了 | 購入不可 | 商品履歴として残す |
| 予約販売 | 予約可能 | 出荷予定日を管理 |
7.6 複数倉庫対応
複数倉庫対応では、商品在庫を倉庫ごとに管理します。地域別倉庫、店舗在庫、外部倉庫、委託倉庫などがある場合、どの倉庫から出荷するかを決める必要があります。配送先地域、在庫数、送料、配送日数を考慮して倉庫を選択します。
複数倉庫では、在庫数の合計だけでなく、倉庫別の在庫が重要になります。合計在庫があっても、特定地域へ配送できる倉庫に在庫がない場合があります。倉庫連携や在庫同期の設計が必要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 倉庫ID | 倉庫の識別 | 在庫と紐づける |
| 倉庫別在庫 | 倉庫ごとの数量 | 合計在庫と分ける |
| 配送地域 | 倉庫が対応する地域 | 送料計算に影響 |
| 出荷優先度 | どの倉庫から出すか | 近い倉庫を優先 |
| 倉庫連携 | 外部倉庫との同期 | 遅延に注意 |
| 分割配送 | 複数倉庫から出荷 | UXと送料に影響 |
7.7 在庫不整合防止
在庫不整合は、注文処理、キャンセル、返品、手動調整、外部倉庫連携などが原因で発生します。ECでは、在庫数が正確でないと、売り越しや販売機会損失につながります。そのため、在庫更新は履歴を残し、監視できるようにする必要があります。
在庫不整合を防ぐには、トランザクション、排他制御、在庫履歴、定期棚卸し、異常検知を組み合わせます。特にセール時や同時購入が多い商品では、在庫更新の競合が起きやすいため、慎重な設計が必要です。
| 対策 | 内容 | 効果 |
|---|---|---|
| トランザクション | 注文と在庫更新を一体化 | 中途半端な更新を防ぐ |
| 行ロック | 同時更新を制御 | 売り越し防止 |
| 在庫履歴 | 増減理由を記録 | 原因調査 |
| 定期棚卸し | 実在庫と照合 | 差分発見 |
| 異常検知 | マイナス在庫を検出 | 早期対応 |
| 再同期 | 外部倉庫と同期 | 連携ズレを修正 |
8. 決済連携設計
決済連携設計は、ECバックエンドで最も慎重に扱うべき領域の一つです。決済は金銭処理に直結するため、成功、失敗、保留、キャンセル、返金、期限切れなどの状態を正確に管理する必要があります。外部の決済代行サービスを使う場合でも、EC側で注文状態と決済状態を正しく同期させなければなりません。
決済方法によって処理フローは大きく異なります。クレジットカードは即時決済が多く、コンビニ決済や銀行振込は支払い完了まで時間差があります。電子決済は外部アプリや外部画面への遷移が関係する場合があります。バックエンドでは、決済方法ごとの違いを吸収し、注文管理側では統一的に扱える設計が重要です。
8.1 クレジットカード決済
クレジットカード決済は、ECでよく使われる決済方法です。即時に与信や決済結果を取得できることが多く、購入完了までの導線が短い点がメリットです。一方で、カード情報の扱いには高いセキュリティが求められるため、基本的には決済代行サービスを利用し、EC側でカード番号を直接保持しない設計にします。
クレジットカード決済では、決済成功時に注文を確定し、決済失敗時には注文を未確定または失敗扱いにします。ユーザーが再試行できる導線も必要です。また、決済結果の通知が外部サービスから届く場合は、Webhookを安全に検証する必要があります。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 与信 | 支払い可能か確認 | 決済代行と連携 |
| 決済成功 | 支払い完了 | 注文確定へ進む |
| 決済失敗 | 支払い不可 | 再試行導線を用意 |
| カード情報 | 機密情報 | EC側で保持しない |
| 返金 | キャンセル時処理 | 一部返金も検討 |
| Webhook | 結果通知 | 署名検証が必要 |
8.2 コンビニ決済
コンビニ決済は、注文後にユーザーがコンビニで支払う方式です。支払い完了まで時間差があるため、注文ステータスと決済ステータスを分けて管理する必要があります。注文受付後は「決済待ち」とし、入金通知を受け取った後に「支払い済み」へ変更します。
コンビニ決済では、支払い期限の管理が重要です。期限内に支払いがなければ注文を自動キャンセルし、仮確保していた在庫を解放する必要があります。期限切れ処理を忘れると、在庫が無駄に押さえられたり、未払い注文が残り続けたりします。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 支払い番号 | コンビニ支払い用番号 | ユーザーへ通知 |
| 決済待ち | 入金前状態 | 在庫確保方針を決める |
| 支払い期限 | 入金期限 | 期限切れ処理が必要 |
| 入金通知 | 支払い完了通知 | Webhookで受信 |
| 期限切れ | 未払い終了 | 注文取消・在庫解放 |
| ユーザー案内 | 支払い方法説明 | 分かりやすさが重要 |
8.3 銀行振込
銀行振込は、ユーザーが指定口座に入金する決済方法です。入金確認に時間がかかるため、注文作成から支払い完了までの間に保留状態が必要です。入金確認を手動で行う場合もあれば、銀行APIや決済サービスと連携して自動化する場合もあります。
銀行振込では、入金名義、金額、注文番号の照合が重要です。ユーザーが注文番号を入力し忘れたり、金額を間違えたりする場合があります。照合作業を考慮した管理画面とログ設計が必要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 振込先 | 銀行口座情報 | 注文ごとに案内 |
| 入金待ち | 支払い前状態 | 期限管理が必要 |
| 入金確認 | 手動または自動確認 | 照合ミスに注意 |
| 名義照合 | 振込名義確認 | 注文者と違う場合がある |
| 金額照合 | 入金額確認 | 過不足に対応 |
| 期限切れ | 未入金キャンセル | 在庫解放が必要 |
8.4 電子決済
電子決済には、QRコード決済、ウォレット決済、キャリア決済、外部アプリ決済などがあります。ユーザーは外部アプリや外部画面で支払いを行い、ECサイトへ戻ってくる場合があります。外部遷移が発生するため、戻りURL、決済結果通知、セッション保持が重要になります。
電子決済では、ユーザーが途中で戻らない場合や、画面上は戻っていないが決済は完了している場合があります。そのため、フロントエンドの戻り結果だけで注文を確定せず、決済代行サービスからの正式な通知や照会結果をもとに状態を更新します。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 外部遷移 | 決済画面へ移動 | 戻りURLを設定 |
| 決済結果 | 成功・失敗 | サーバー側で確認 |
| アプリ決済 | 外部アプリで支払い | ユーザー離脱に注意 |
| 状態照会 | 決済結果を確認 | 戻り失敗に対応 |
| 通知受信 | Webhook | 署名検証が必要 |
| 再試行 | 失敗時の導線 | 注文重複に注意 |
8.5 決済ステータス管理
決済ステータス管理では、注文に対する支払い状態を明確にします。未決済、決済待ち、決済成功、決済失敗、返金済み、一部返金、取消などを定義し、注文ステータスと連動させます。決済ステータスが曖昧だと、出荷してよい注文か判断できません。
決済ステータスは、決済方法ごとに異なる状態を、EC内部で扱いやすい共通状態へ変換する設計が有効です。外部決済サービスごとの細かいステータスをそのまま注文管理に持ち込むと、管理が複雑になります。
| ステータス | 内容 | 注文への影響 |
|---|---|---|
| 未決済 | 支払い前 | 出荷不可 |
| 決済待ち | 入金・承認待ち | 保留 |
| 決済成功 | 支払い完了 | 出荷可能 |
| 決済失敗 | 支払い失敗 | 再試行または取消 |
| 取消 | 決済取消 | 注文取消と連動 |
| 返金済み | 返金完了 | キャンセル後処理 |
| 一部返金 | 一部のみ返金 | 明細単位で管理 |
8.6 決済失敗時の処理
決済失敗時には、ユーザーに分かりやすく再試行方法を案内する必要があります。クレジットカードの利用不可、通信エラー、外部決済のキャンセル、支払い期限切れなど、失敗理由によって対応が異なります。失敗時に注文をどう扱うかも重要です。
決済失敗後に在庫を確保し続けると販売機会を失います。一方で、すぐに注文を削除するとユーザーが再試行しにくくなります。一定時間は再試行可能にし、期限が過ぎたら注文取消と在庫解放を行う設計がよく使われます。
| 失敗理由 | 処理 | 注意点 |
|---|---|---|
| カード拒否 | 再入力を案内 | 詳細理由は出しすぎない |
| 通信エラー | 状態照会 | 二重決済を防ぐ |
| ユーザー中断 | 再試行可能にする | 在庫期限を設定 |
| 期限切れ | 注文取消 | 在庫解放 |
| 決済通知遅延 | 保留状態にする | 後続通知に対応 |
| 重複通知 | 一度だけ処理 | 冪等性が必要 |
8.7 決済代行サービス連携
決済代行サービス連携では、ECサイト側が直接カード情報を扱わず、外部サービスを通じて決済を行います。これにより、セキュリティリスクや運用負担を軽減できます。ただし、外部サービスとの連携には、API、Webhook、署名検証、決済ID管理、障害時対応が必要です。
決済代行サービスからの通知は、必ず正当性を検証します。署名検証やシークレットキーを使い、不正な通知を受け付けないようにします。また、通知が複数回届いても同じ処理を重複実行しない冪等性が必要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| API連携 | 決済作成・照会 | エラー処理が重要 |
| Webhook | 決済結果通知 | 署名検証を行う |
| 決済ID | 外部決済識別子 | 注文と紐づける |
| 状態照会 | 結果を再確認 | 通知漏れに対応 |
| 障害対応 | 外部サービス障害 | 保留状態を用意 |
| 冪等性 | 重複処理防止 | 通知再送に対応 |
決済方法ごとの特徴は、次のように整理できます。方法によって注文確定タイミング、在庫確保、ユーザー案内が変わります。
| 決済方法 | 特徴 | 注文設計の注意点 |
|---|---|---|
| クレジットカード | 即時決済しやすい | 成功後に注文確定 |
| コンビニ決済 | 支払いまで時間差がある | 支払い期限が必要 |
| 銀行振込 | 入金照合が必要 | 手動確認に注意 |
| 電子決済 | 外部アプリと連携 | 戻り処理と通知を分ける |
| 後払い | 商品到着後に支払い | 与信審査が必要 |
| ポイント決済 | サービス内残高を使う | 残高整合性が重要 |
9. 配送管理設計
配送管理設計では、配送先住所、配送料、配送方法、追跡番号、出荷ステータス、配送業者連携、配送通知を扱います。配送は注文後のユーザー体験に大きく影響します。購入まではスムーズでも、配送状況が分からない、追跡番号が届かない、住所が間違っていると、顧客満足度は下がります。
配送管理は、注文管理や在庫管理と連動します。注文が支払い済みになったら出荷準備へ進み、倉庫で出荷されると追跡番号が登録され、ユーザーへ通知されます。配送ステータスを明確に管理することで、問い合わせ対応や管理業務が効率化されます。
9.1 配送先住所管理
配送先住所管理では、注文時にユーザーが指定した住所を保存します。会員住所とは別に、注文時点の配送先を注文データとして保持することが重要です。これにより、ユーザーが後から会員住所を変更しても、過去注文の配送先は変わりません。
住所には入力ミスが起きやすいため、郵便番号補完、都道府県選択、番地確認、電話番号形式チェックなどを導入すると配送ミスを減らせます。高額商品では、住所確認をより慎重に行うこともあります。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 氏名 | 受取人名 | 注文時点で保存 |
| 郵便番号 | 住所検索に使用 | 入力補完に使う |
| 都道府県 | 地域判定 | 送料計算に関係 |
| 市区町村 | 住所情報 | 入力ミスに注意 |
| 番地・建物名 | 詳細住所 | 配送ミス防止 |
| 電話番号 | 配送連絡 | 形式検証が必要 |
9.2 配送料計算
配送料計算では、配送先地域、商品サイズ、重量、購入金額、配送方法、キャンペーン条件をもとに送料を計算します。全国一律送料、地域別送料、送料無料条件、クール便料金、大型商品送料など、ECの種類によって設計は変わります。
送料は購入判断に大きく影響します。商品価格が安くても送料が高いと離脱につながる場合があります。そのため、カート画面や注文確認画面で送料を早めに表示できる設計が重要です。
| 条件 | 内容 | 計算への影響 |
|---|---|---|
| 配送地域 | 都道府県や離島 | 地域別送料 |
| 商品サイズ | 大型・小型 | 大型送料 |
| 商品重量 | 重さ | 重量別送料 |
| 購入金額 | 一定額以上 | 送料無料条件 |
| 配送方法 | 通常便・クール便 | 送料差分 |
| キャンペーン | 送料無料施策 | 条件判定が必要 |
9.3 配送方法選択
配送方法選択では、ユーザーが通常配送、日時指定、メール便、クール便、店舗受取などを選べるようにします。商品によって利用できる配送方法が異なる場合もあります。冷蔵商品はクール便、大型家具は大型配送など、商品属性と配送方法を連携する必要があります。
配送方法は、送料や配送日数にも影響します。注文時には、選択可能な配送方法だけを表示し、選択後に送料や到着予定日を再計算します。配送方法の制約をサーバー側でも検証することが重要です。
| 配送方法 | 内容 | 注意点 |
|---|---|---|
| 通常配送 | 標準的な配送 | 多くの商品で利用 |
| メール便 | 小型商品の配送 | 追跡や補償に注意 |
| クール便 | 冷蔵・冷凍配送 | 対応商品を限定 |
| 大型配送 | 家具・家電 | 送料と日程が重要 |
| 日時指定 | 配達日時を指定 | 地域制限がある場合 |
| 店舗受取 | 店舗で受取 | 店舗在庫と連携 |
9.4 追跡番号管理
追跡番号管理では、配送業者から発行された追跡番号を注文に紐づけます。ユーザーは追跡番号を使って配送状況を確認できます。追跡番号はメール通知、マイページ、管理画面に表示されることが一般的です。
追跡番号は、出荷処理が完了したタイミングで登録されます。配送業者連携がある場合は自動で登録され、手動運用の場合は管理者が入力します。誤った追跡番号を登録すると問い合わせにつながるため、入力検証や確認画面が有効です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 追跡番号 | 配送追跡用番号 | 注文に紐づける |
| 配送業者 | どの業者か | 追跡URL生成に必要 |
| 登録タイミング | 出荷時 | 通知と連動 |
| 追跡URL | 配送状況ページ | ユーザーに表示 |
| 手動入力 | 管理者が登録 | 入力ミスに注意 |
| 自動連携 | 業者APIで取得 | 連携エラー対応 |
9.5 出荷ステータス管理
出荷ステータス管理では、注文が出荷前なのか、出荷準備中なのか、出荷済みなのかを管理します。注文ステータスと配送ステータスを分けることで、支払いは完了しているが出荷はまだ、出荷済みだが配達完了ではない、といった状態を表現できます。
出荷ステータスは、倉庫業務やユーザー通知に関係します。管理画面では、出荷待ち注文を一覧表示し、出荷済みに更新できるようにします。ステータス変更時には操作ログを残すと、トラブル調査に役立ちます。
| ステータス | 内容 | 次の処理 |
|---|---|---|
| 未出荷 | まだ出荷していない | 出荷準備 |
| 出荷準備中 | 梱包・倉庫作業中 | 追跡番号登録 |
| 出荷済み | 配送開始 | ユーザー通知 |
| 配送中 | 業者が配送中 | 追跡表示 |
| 配達完了 | 商品到着 | 完了処理 |
| 持ち戻り | 配達できなかった | 再配達案内 |
| 返品中 | 返品配送中 | 検品処理 |
9.6 配送業者連携
配送業者連携では、送り状発行、追跡番号取得、配送ステータス取得などを外部システムと連携します。手動で配送情報を入力するよりも効率的で、出荷件数が多いECでは重要になります。倉庫管理システムや配送管理サービスと連携する場合もあります。
連携では、APIエラーや通信失敗に備える必要があります。送り状発行に失敗した場合、管理者が再実行できるようにする、追跡番号取得が遅れた場合に保留状態にするなど、運用上の例外処理が重要です。
| 連携内容 | 内容 | 注意点 |
|---|---|---|
| 送り状発行 | 配送ラベル作成 | 住所情報の正確性 |
| 追跡番号取得 | 番号を自動取得 | 取得失敗に対応 |
| 配送状況取得 | ステータス更新 | 遅延や差分に注意 |
| 倉庫連携 | 出荷指示 | 在庫と連動 |
| 再実行 | 失敗時の再処理 | 重複出荷に注意 |
| ログ保存 | 連携履歴 | トラブル調査 |
9.7 配送通知
配送通知は、注文受付、出荷完了、配送中、配達完了などのタイミングでユーザーへ送る通知です。メール、アプリ通知、SMS、LINE連携などを使う場合があります。配送通知が適切に届くと、ユーザーは安心して商品到着を待てます。
通知では、必要な情報を簡潔に伝えることが重要です。注文番号、配送業者、追跡番号、追跡URL、到着予定日を含めると便利です。ただし、通知の送りすぎはストレスになるため、重要なタイミングに絞ります。
| 通知タイミング | 内容 | ユーザー効果 |
|---|---|---|
| 注文受付 | 注文完了を知らせる | 安心感 |
| 入金確認 | 支払い完了を知らせる | 状態確認 |
| 出荷完了 | 発送済みを知らせる | 到着待ちが分かる |
| 追跡番号通知 | 追跡情報を送る | 自分で確認できる |
| 配達完了 | 到着を知らせる | 受取確認 |
| 配送遅延 | 遅延を知らせる | 問い合わせ削減 |
10. API設計
ECバックエンドでは、フロントエンド、管理画面、外部サービス、スマートフォンアプリなどがバックエンドAPIを通じてデータを取得・更新します。API設計が整理されていると、フロントエンド開発がしやすくなり、外部連携や機能追加にも対応しやすくなります。
API設計では、商品一覧、商品詳細、カート、注文、決済、会員、管理画面、外部連携を分けて設計します。ユーザー向けAPIと管理者向けAPIでは権限や返す情報が異なるため、同じデータを扱う場合でもエンドポイントや認可設計を分ける必要があります。
10.1 商品一覧API
商品一覧APIは、商品リストを取得するためのAPIです。カテゴリ、検索キーワード、価格帯、ブランド、在庫有無、並び替え、ページングなどに対応します。商品数が多いECでは、一覧APIの速度がユーザー体験に直結します。
一覧APIでは、必要な情報だけを返すことが重要です。商品詳細に必要な長い説明文や大量の画像を一覧で返すと、レスポンスが重くなります。一覧では、商品名、価格、サムネイル、販売状態などに絞り、詳細は商品詳細APIで取得します。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 検索条件 | キーワードやカテゴリ | 複数条件に対応 |
| ページング | 件数制御 | 大量取得を防ぐ |
| 並び替え | 価格順・新着順 | インデックス設計 |
| フィルター | ブランド・価格など | 商品属性と連携 |
| 表示項目 | 一覧用情報 | 詳細情報は返しすぎない |
| キャッシュ | 人気一覧を高速化 | 在庫表示に注意 |
10.2 商品詳細API
商品詳細APIは、特定商品の詳細情報を取得するAPIです。商品名、説明、画像、価格、バリエーション、在庫状態、レビュー、関連商品などを返します。商品詳細は購入判断に直結するため、正確な情報を返す必要があります。
商品詳細APIでは、販売ステータスや在庫状態を適切に反映します。非公開商品や販売終了商品を一般ユーザーが取得できないようにし、管理者向けには別APIで詳細を取得できるようにするなど、権限に応じた設計が必要です。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 商品基本情報 | 名称・説明 | 表示用情報 |
| 画像 | 詳細画像 | 表示順を管理 |
| 価格 | 現在価格 | キャンペーン反映 |
| バリエーション | SKU一覧 | 在庫と連動 |
| 在庫状態 | 購入可否 | 注文時にも再確認 |
| 関連商品 | おすすめ | 過剰取得に注意 |
| 権限制御 | 非公開商品制御 | 管理者APIと分ける |
10.3 カートAPI
カートAPIは、商品追加、数量変更、削除、カート取得、カート統合などを扱います。カートはユーザー操作が多く、レスポンス速度も重要です。カートAPIでは、商品が販売中か、数量が妥当か、在庫があるかをサーバー側で検証します。
カートAPIは、ゲストユーザーと会員ユーザーの両方に対応する場合があります。ゲストカート識別子やセッション情報、ログイン時の統合処理を設計する必要があります。
| 操作 | 内容 | サーバー側確認 |
|---|---|---|
| カート取得 | 現在の内容を返す | 商品状態を確認 |
| 商品追加 | 商品を追加 | 販売中・在庫確認 |
| 数量変更 | 数量を更新 | 上限・在庫確認 |
| 商品削除 | 商品を外す | 対象確認 |
| カート統合 | ゲストから会員へ | 重複処理 |
| 金額計算 | 合計を返す | 最新価格で計算 |
10.4 注文API
注文APIは、注文作成、注文確認、注文履歴、キャンセルなどを扱います。注文APIは金額や在庫、決済と関係するため、特に慎重な設計が必要です。フロントエンドから送られた金額をそのまま信用せず、サーバー側で再計算します。
注文作成APIでは、冪等性キーを使うことで二重注文を防げます。通信エラーやボタン連打によって同じ注文作成が複数回実行されても、同じ処理は一度だけ反映されるようにします。
| 操作 | 内容 | 注意点 |
|---|---|---|
| 注文確認 | 注文前の内容確認 | 金額を再計算 |
| 注文作成 | 注文データ作成 | 冪等性が重要 |
| 注文履歴 | 過去注文取得 | 本人確認が必要 |
| 注文詳細 | 注文単位で取得 | 認可チェック |
| キャンセル | 注文取消 | 状態に応じて制御 |
| 再注文 | 過去商品をカートへ | 販売中か再確認 |
10.5 決済API
決済APIは、決済開始、決済結果取得、決済失敗時の再試行、返金、決済代行サービス連携などを扱います。決済APIでは、ユーザー入力だけでなく、外部決済サービスからのWebhookも受け取ります。Webhookは署名検証を行い、不正な通知を拒否します。
決済APIでは、注文状態と決済状態を正しく同期する必要があります。決済成功通知が届いたら注文を支払い済みにし、決済失敗なら再試行またはキャンセルへ進めます。重複通知や遅延通知に対応する設計が重要です。
| 操作 | 内容 | 設計ポイント |
|---|---|---|
| 決済開始 | 決済処理を作成 | 注文と紐づける |
| 決済成功 | 支払い完了 | 注文状態を更新 |
| 決済失敗 | 支払い失敗 | 再試行導線 |
| Webhook受信 | 外部通知 | 署名検証 |
| 返金 | キャンセル時返金 | 一部返金対応 |
| 状態照会 | 決済結果確認 | 通知漏れ対策 |
10.6 会員API
会員APIは、会員情報取得、更新、住所管理、購入履歴、パスワード変更などを扱います。個人情報を含むため、認証と認可が非常に重要です。本人以外が会員情報を取得・更新できないようにします。
会員APIでは、更新できる項目を制限します。たとえば、ユーザー自身が会員ランクや管理者権限を変更できてはいけません。入力値の検証だけでなく、更新可能フィールドの制御も必要です。
| 操作 | 内容 | 注意点 |
|---|---|---|
| 会員情報取得 | 自分の情報を取得 | 本人確認 |
| 会員情報更新 | 氏名や電話番号変更 | 更新可能項目を制限 |
| メール変更 | ログインID変更 | 確認メールが必要 |
| 住所管理 | 配送先の追加・編集 | 複数住所対応 |
| パスワード変更 | 認証情報更新 | 再認証を検討 |
| 購入履歴 | 過去注文取得 | 他人の注文を見せない |
10.7 管理画面API
管理画面APIは、商品登録、注文管理、在庫調整、配送処理、会員確認、売上分析などを扱います。管理画面APIは強い権限を持つため、一般ユーザー向けAPIよりも厳格な認証・認可が必要です。管理者、スタッフ、倉庫担当、CS担当など、権限を分ける設計が重要です。
管理画面APIでは、操作ログを残すことも重要です。誰がいつ商品価格を変更したか、誰が注文をキャンセルしたか、誰が在庫を調整したかを追跡できるようにします。トラブル調査や内部統制に役立ちます。
| 機能 | 内容 | 注意点 |
|---|---|---|
| 商品管理 | 登録・編集・削除 | 権限を制御 |
| 注文管理 | ステータス更新 | 操作ログを残す |
| 在庫調整 | 在庫数変更 | 理由を記録 |
| 会員管理 | ユーザー確認 | 個人情報保護 |
| 配送処理 | 出荷・追跡番号登録 | 誤配送に注意 |
| 売上分析 | 集計表示 | 権限に応じて表示 |
10.8 外部連携API
外部連携APIは、決済代行、配送業者、倉庫管理、会計システム、CRM、メール配信、マーケティングツール、モール連携などと接続するためのAPIです。ECは外部サービスと連携することが多いため、連携エラーや遅延への対応が重要です。
外部連携では、同期処理と非同期処理を分けて考えます。注文確定時にすべての外部連携を同期的に実行すると、ユーザー待ち時間が長くなり、外部障害の影響を受けやすくなります。通知や分析連携は非同期処理にするなど、役割を分けると安定します。
| 連携先 | 内容 | 設計ポイント |
|---|---|---|
| 決済代行 | 支払い処理 | Webhook検証 |
| 配送業者 | 送り状・追跡 | 連携失敗に対応 |
| 倉庫管理 | 出荷指示 | 在庫同期 |
| 会計 | 売上データ連携 | 金額整合性 |
| メール配信 | 通知送信 | 非同期化が有効 |
| CRM | 顧客情報連携 | 個人情報保護 |
| モール | 外部販売連携 | 在庫同期に注意 |
11. データベース設計
ECバックエンドのデータベース設計では、ユーザー、商品、カート、注文、注文明細、在庫、決済、配送などを適切に分けて管理します。特に注文関連データは、後から商品情報や会員情報が変わっても注文時点の内容を保持できるようにする必要があります。
データベース設計が曖昧だと、注文履歴が壊れる、在庫数が合わない、決済状態を追跡できない、配送状況が分からないといった問題が発生します。ECでは、現在のマスタ情報と、注文時点の履歴情報を分けることが重要です。
11.1 ユーザーテーブル
ユーザーテーブルは、会員情報を管理するテーブルです。メールアドレス、パスワードハッシュ、氏名、電話番号、会員状態、作成日時、更新日時などを持ちます。認証情報とプロフィール情報を同じテーブルに持つ場合もありますが、規模が大きくなると分割することもあります。
個人情報を含むため、アクセス制御や暗号化、ログ管理が重要です。パスワードは平文で保存せず、必ずハッシュ化します。また、退会済みユーザーの扱いも設計しておく必要があります。
| カラム例 | 内容 | 注意点 |
|---|---|---|
| id | ユーザーID | 主キー |
| メールアドレス | 一意制約 | |
| password_hash | パスワードハッシュ | 平文保存しない |
| name | 氏名 | 個人情報 |
| phone | 電話番号 | 任意項目にする場合もある |
| status | 有効・停止・退会 | ログイン制御 |
| created_at | 作成日時 | 監査用 |
| updated_at | 更新日時 | 変更管理 |
11.2 商品テーブル
商品テーブルは、商品情報を管理します。商品名、説明、価格、ブランド、カテゴリ、販売ステータスなどを持ちます。ただし、バリエーションがある商品では、商品テーブルとSKUテーブルを分ける方が管理しやすくなります。商品テーブルは商品ページ単位、SKUは実際の販売単位として設計します。
商品テーブルは検索や一覧表示に頻繁に使われるため、インデックス設計が重要です。公開状態やカテゴリ、価格、作成日時などで絞り込むことが多い場合は、検索条件に合わせた設計が必要です。
| カラム例 | 内容 | 設計ポイント |
|---|---|---|
| id | 商品ID | 主キー |
| name | 商品名 | 検索対象 |
| description | 商品説明 | 詳細表示 |
| base_price | 基本価格 | SKU別価格がある場合も |
| status | 公開・非公開 | 表示制御 |
| brand_id | ブランド | フィルター |
| category_id | カテゴリ | 一覧表示 |
| created_at | 登録日時 | 新着順に使う |
11.3 カートテーブル
カートテーブルは、ユーザーまたはゲストのカート情報を管理します。カート本体とカート明細を分ける設計が一般的です。カート本体にはユーザーIDやゲスト識別子、有効期限を持ち、カート明細には商品ID、SKU ID、数量を持ちます。
カートは注文前の仮情報であるため、価格を完全に確定情報として扱わない方が安全です。表示用にカート投入時価格を持つ場合でも、注文確定時には商品マスタや価格ルールをもとに再計算します。
| テーブル | 主な内容 | 注意点 |
|---|---|---|
| carts | カート本体 | ユーザーまたはゲストに紐づけ |
| cart_items | カート明細 | SKUと数量を保持 |
| user_id | 会員カート | NULLならゲストもあり |
| guest_token | ゲスト識別子 | 有効期限が必要 |
| sku_id | 販売単位 | 在庫と連動 |
| quantity | 数量 | 上限チェック |
| expires_at | 有効期限 | 放置カート整理 |
11.4 注文テーブル
注文テーブルは、注文全体の情報を管理します。注文番号、ユーザーID、注文者情報、配送先情報、合計金額、注文ステータス、決済ステータス、作成日時などを保持します。注文は履歴情報であるため、注文時点の情報を保存します。
会員情報や住所が後から変更されても、注文テーブルの情報は変わらないようにします。注文テーブルは売上集計や問い合わせ対応にも使われるため、正確性と履歴性が重要です。
| カラム例 | 内容 | 設計ポイント |
|---|---|---|
| id | 注文ID | 主キー |
| order_number | 注文番号 | ユーザー表示用 |
| user_id | 注文者 | ゲスト注文ならNULLもあり |
| customer_name | 注文者名 | 注文時点で保存 |
| total_amount | 合計金額 | 注文時点で固定 |
| order_status | 注文状態 | 業務フローに使う |
| payment_status | 決済状態 | 出荷判断に関係 |
| created_at | 注文日時 | 売上集計に使う |
11.5 注文明細テーブル
注文明細テーブルは、注文に含まれる商品ごとの情報を管理します。商品ID、SKU ID、商品名、単価、数量、小計、税額、割引額などを保存します。ここでは、商品マスタへの参照だけでなく、注文時点の商品名や価格を保存することが重要です。
商品名や価格が後から変わっても、過去注文の明細は変更されるべきではありません。注文明細は、領収書、返品、一部キャンセル、売上分析にも使われます。
| カラム例 | 内容 | 注意点 |
|---|---|---|
| id | 明細ID | 主キー |
| order_id | 注文ID | 注文と紐づけ |
| product_id | 商品ID | 参照用 |
| sku_id | SKU ID | 在庫単位 |
| product_name | 注文時商品名 | 履歴として保存 |
| unit_price | 注文時単価 | 後から変えない |
| quantity | 数量 | 返品や一部キャンセルに使う |
| subtotal | 小計 | 集計に使う |
11.6 在庫テーブル
在庫テーブルは、SKUごとの在庫数を管理します。単一倉庫ならSKU IDと数量だけでも管理できますが、複数倉庫の場合は倉庫IDも必要になります。在庫数だけでなく、引当済み数、販売可能数を分けて管理する場合もあります。
在庫更新は注文処理と強く関係するため、履歴テーブルを用意することが望ましいです。在庫がいつ、なぜ、どれだけ増減したかを記録しておくと、不整合の調査がしやすくなります。
| カラム例 | 内容 | 設計ポイント |
|---|---|---|
| sku_id | SKU識別子 | 販売単位 |
| warehouse_id | 倉庫ID | 複数倉庫対応 |
| stock_quantity | 在庫数 | 実在庫 |
| reserved_quantity | 引当数 | 仮確保 |
| available_quantity | 販売可能数 | 計算値でもよい |
| updated_at | 更新日時 | 同期確認 |
| version | 更新制御 | 競合防止に使える |
11.7 決済テーブル
決済テーブルは、注文に対する決済情報を管理します。決済方法、決済ステータス、外部決済ID、金額、決済日時、返金状態などを保存します。決済は外部サービスと連携することが多いため、外部IDや通知履歴を保持することが重要です。
決済テーブルには、カード番号などの機密情報を保存しない設計が基本です。決済代行サービスが発行するトークンや決済IDを使って照合します。返金や取消を扱う場合は、決済履歴を別テーブルに分けることもあります。
| カラム例 | 内容 | 注意点 |
|---|---|---|
| id | 決済ID | 主キー |
| order_id | 注文ID | 注文と紐づけ |
| payment_method | 決済方法 | カード・振込など |
| payment_status | 決済状態 | 成功・失敗・返金 |
| amount | 決済金額 | 注文金額と照合 |
| external_payment_id | 外部決済ID | 決済代行と照合 |
| paid_at | 支払い日時 | 入金確認 |
| refunded_at | 返金日時 | 返金管理 |
11.8 配送テーブル
配送テーブルは、注文の配送情報を管理します。配送先住所、配送方法、配送業者、追跡番号、出荷ステータス、出荷日時、配達完了日時などを保存します。注文と配送を分けることで、分割配送や複数配送先にも対応しやすくなります。
配送情報は、注文時点の住所を保存することが重要です。会員住所が後から変更されても、出荷済み注文の配送先は変わらないようにします。配送テーブルは、ユーザー通知や配送業者連携にも使われます。
| カラム例 | 内容 | 設計ポイント |
|---|---|---|
| id | 配送ID | 主キー |
| order_id | 注文ID | 注文と紐づけ |
| recipient_name | 受取人名 | 注文時点で保存 |
| address | 配送先住所 | 変更されない履歴 |
| shipping_method | 配送方法 | 送料計算と関係 |
| carrier | 配送業者 | 追跡URLに使う |
| tracking_number | 追跡番号 | ユーザー通知 |
| shipped_at | 出荷日時 | ステータス管理 |
12. セキュリティ設計
ECサイトは、個人情報、決済情報、注文履歴、住所情報などを扱うため、セキュリティ設計が非常に重要です。認証と認可、個人情報保護、決済情報の扱い、CSRF対策、XSS対策、SQLインジェクション対策、管理画面セキュリティを体系的に設計する必要があります。
セキュリティは後から追加するものではなく、最初の設計段階から組み込むべきです。特にECでは、ユーザー向け画面だけでなく、管理画面や外部連携APIも攻撃対象になります。フロントエンド、バックエンド、インフラ、運用を含めた多層防御が必要です。
12.1 認証と認可
認証はユーザーが誰であるかを確認する処理で、認可はそのユーザーがその操作を実行してよいかを確認する処理です。ECでは、一般ユーザー、管理者、倉庫担当、カスタマーサポート担当など、複数の権限が存在する場合があります。ログインしているだけで全操作を許可してはいけません。
たとえば、ユーザーは自分の注文履歴だけを見られるべきで、他人の注文を見られてはいけません。管理者でも、商品編集はできるが返金処理はできない、といった権限分離が必要な場合があります。認可は必ずサーバー側で行います。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| 認証 | 本人確認 | セッション管理が重要 |
| 認可 | 操作権限確認 | サーバー側で必ず検証 |
| ロール | 権限グループ | 管理者・スタッフなど |
| リソース制御 | 自分のデータだけ許可 | 注文履歴で重要 |
| 多要素認証 | 追加認証 | 管理画面に有効 |
| 監査ログ | 操作記録 | 不正操作調査 |
12.2 個人情報保護
ECでは、氏名、住所、電話番号、メールアドレス、購入履歴などの個人情報を扱います。これらの情報は必要な範囲だけ保存し、アクセスできる人を制限する必要があります。管理画面でも、すべてのスタッフが全個人情報を見られる設計は避けるべきです。
個人情報保護では、通信の暗号化、データベースアクセス制御、ログへの出力制限、バックアップ管理も重要です。特に、ログに住所やトークン、決済関連情報を出してしまうと、ログ漏洩時の被害が大きくなります。
| 項目 | 内容 | 注意点 |
|---|---|---|
| 氏名 | 注文・配送に使用 | 必要範囲で表示 |
| 住所 | 配送に使用 | アクセス制限 |
| 電話番号 | 配送連絡 | マスキング検討 |
| メール | 通知・ログイン | 重複管理 |
| 購入履歴 | 顧客対応に使用 | 本人と権限者のみ |
| ログ | 操作記録 | 個人情報を出しすぎない |
12.3 決済情報を直接保持しない設計
ECサイトでは、カード番号などの機密性の高い決済情報を直接保持しない設計が基本です。決済代行サービスを利用し、EC側では決済IDやトークン、決済ステータスだけを保持します。これにより、情報漏洩時のリスクを下げられます。
決済情報を直接扱わない場合でも、決済結果や返金履歴は正確に管理する必要があります。外部サービスに依存するため、Webhook検証、状態照会、決済IDの保存、エラー時のリカバリーを設計します。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| カード番号 | 原則保持しない | 決済代行を利用 |
| 決済トークン | 外部サービスが発行 | 有効期限に注意 |
| 決済ID | 決済照合用 | 注文と紐づけ |
| Webhook | 結果通知 | 署名検証 |
| 返金履歴 | 返金処理記録 | 金額整合性 |
| 権限制御 | 決済操作制限 | 管理者でも限定する |
12.4 CSRF対策
CSRF対策は、ログイン中のユーザーに意図しない操作を実行させないために必要です。ECでは、会員情報変更、注文確定、退会、住所変更、管理画面操作などで特に重要です。Cookie認証を使う場合は、CSRFトークンやSameSite Cookieを組み合わせます。
重要操作では、CSRFトークンだけでなく、再認証や確認画面を入れることも有効です。注文確定や退会処理など、影響が大きい操作では、ユーザーが意図した操作であることを明確に確認します。
| 対策 | 内容 | ECでの対象 |
|---|---|---|
| CSRFトークン | 正規フォームからの送信確認 | 注文・会員更新 |
| SameSite Cookie | Cookie送信制御 | ログイン状態保護 |
| Origin検証 | リクエスト元確認 | APIや管理画面 |
| GETで状態変更しない | 状態変更をPOST等へ | 削除・更新処理 |
| 確認画面 | 操作内容確認 | 退会・注文確定 |
| 再認証 | 重要操作前の確認 | パスワード変更 |
12.5 XSS対策
XSS対策では、ユーザー入力や外部データを画面に表示する際に、適切な出力エスケープを行います。ECでは、レビュー、問い合わせ内容、商品説明、管理メモ、検索キーワードなど、入力値が画面に表示される場面が多いため注意が必要です。
管理画面もXSS対策の対象です。ユーザーから送られた問い合わせ内容を管理者が見る画面でエスケープが不足していると、管理者権限で被害が広がる可能性があります。一般画面と管理画面の両方で安全な表示を徹底します。
| 対策 | 内容 | 対象 |
|---|---|---|
| 出力エスケープ | HTMLとして実行させない | レビュー・検索結果 |
| 入力検証 | 形式や長さを確認 | フォーム全般 |
| HTML挿入制限 | 危険なHTMLを避ける | 商品説明・CMS |
| サニタイズ | 許可タグだけ残す | リッチテキスト |
| CSP | スクリプト実行を制限 | 全ページ |
| HttpOnly Cookie | Cookie読み取り制限 | 認証Cookie |
12.6 SQLインジェクション対策
SQLインジェクションは、入力値を不適切にSQLへ組み込むことで発生する脆弱性です。ECでは、商品検索、ログイン、注文検索、管理画面の絞り込みなど、多くの場所でデータベース検索が行われるため、対策が必要です。基本は、プレースホルダーやORMの安全な機能を使い、文字列連結でSQLを作らないことです。
検索条件や並び替え条件を動的に組み立てる場合も注意が必要です。値だけでなく、カラム名やソート方向をユーザー入力から直接使うと危険です。許可リスト方式で受け付ける項目を限定します。
| 対策 | 内容 | 注意点 |
|---|---|---|
| プレースホルダー | 値を安全にバインド | 文字列連結を避ける |
| ORM利用 | 安全なクエリ生成 | 生SQL使用時は注意 |
| 入力検証 | 型や範囲を確認 | 数値IDも検証 |
| 許可リスト | カラムやソートを限定 | 動的SQLで重要 |
| 権限制限 | DBユーザー権限を限定 | 被害範囲を減らす |
| ログ監視 | 異常クエリ検知 | 攻撃兆候を把握 |
12.7 管理画面セキュリティ
管理画面は、商品価格、在庫、注文、会員情報、決済、配送などを操作できるため、最も厳重に守るべき領域です。一般ユーザー向け画面とは別の認証強度、権限管理、IP制限、多要素認証、操作ログが必要になる場合があります。
管理画面では、スタッフごとに権限を分けます。商品編集はできるが返金はできない、在庫調整はできるが会員情報は見られない、といった分離が重要です。すべての管理者に全権限を与えると、内部ミスや不正時の被害が大きくなります。
| 対策 | 内容 | 設計ポイント |
|---|---|---|
| 管理者認証 | 管理画面ログイン | 多要素認証を検討 |
| 権限分離 | ロール別権限 | 最小権限にする |
| IP制限 | 接続元制限 | 運用要件と調整 |
| 操作ログ | 管理操作を記録 | 誰が何をしたか残す |
| 個人情報制限 | 表示範囲を制御 | CS担当のみ表示など |
| セッション管理 | 管理者セッション | タイムアウト短めに設定 |
13. パフォーマンス設計
ECサイトでは、商品一覧、検索、カート、注文、決済など、ユーザーが購入するまでに複数の処理が発生します。ページ表示やAPIレスポンスが遅いと、離脱率が上がり、売上に影響します。特に商品一覧や検索はアクセス数が多く、パフォーマンス設計が重要です。
パフォーマンス設計では、商品一覧の高速化、検索最適化、キャッシュ、画像配信、データベースインデックス、非同期処理、セール時の高負荷対策を組み合わせます。ただし、キャッシュを使う場合は、価格や在庫の正確性とのバランスに注意する必要があります。
13.1 商品一覧の高速化
商品一覧は、ECサイトで最もアクセスされやすいページの一つです。カテゴリページ、検索結果、ランキング、新着一覧などで頻繁に利用されます。一覧表示が遅いと、ユーザーが商品を探す前に離脱してしまう可能性があります。
高速化のためには、ページング、必要項目だけの取得、適切なインデックス、キャッシュ、検索基盤の導入を検討します。一覧では詳細情報を返しすぎず、商品名、価格、サムネイル、販売状態などに絞ることが重要です。
| 対策 | 内容 | 効果 |
|---|---|---|
| ページング | 一度に取得する件数を制限 | DB負荷を減らす |
| 項目削減 | 一覧に必要な項目だけ返す | レスポンス軽量化 |
| インデックス | 検索条件に合わせる | 取得高速化 |
| キャッシュ | 人気一覧を保存 | 高速表示 |
| CDN | 静的画像を配信 | 表示速度改善 |
| 非同期読み込み | 一部情報を後から取得 | 初期表示改善 |
13.2 検索処理最適化
商品検索は、キーワード、カテゴリ、価格、ブランド、在庫、タグなど複数条件が絡むため、負荷が高くなりやすい処理です。商品数が少ないうちはデータベース検索でも十分ですが、大規模になると全文検索エンジンの導入を検討します。
検索処理では、ユーザーが求める商品を速く返すだけでなく、検索結果の質も重要です。表記ゆれ、同義語、カテゴリ補正、並び替え、在庫表示などを考慮します。検索ログを分析すると、ユーザーが何を探しているかも分かります。
| 対策 | 内容 | 設計ポイント |
|---|---|---|
| 全文検索 | 商品名や説明を検索 | 大規模ECで有効 |
| フィルター | 条件絞り込み | 属性設計が重要 |
| ソート | 価格順・人気順 | インデックスに注意 |
| 表記ゆれ対応 | 同義語やかな違い | 検索精度向上 |
| 検索ログ | 検索語を記録 | 商品改善に使える |
| 在庫反映 | 販売可能商品を優先 | キャッシュとの整合性 |
13.3 キャッシュ設計
キャッシュは、同じデータを何度も計算・取得しないための仕組みです。商品一覧、カテゴリ、商品詳細、ランキング、設定情報などはキャッシュしやすい領域です。キャッシュを使うことで、データベース負荷を減らし、レスポンス速度を改善できます。
ただし、ECでは価格や在庫の正確性が重要です。古いキャッシュによって、在庫切れ商品が購入可能に見えたり、価格が古いまま表示されたりすると問題になります。キャッシュする情報と、リアルタイムに確認する情報を分ける設計が必要です。
| 対象 | キャッシュ適性 | 注意点 |
|---|---|---|
| カテゴリ | 高い | 更新頻度が低い |
| 商品詳細 | 中 | 価格・在庫に注意 |
| 商品一覧 | 中 | 条件が多い |
| ランキング | 高い | 定期更新でよい |
| 在庫 | 低〜中 | 注文時は必ず再確認 |
| 価格 | 中 | セール時に注意 |
13.4 画像配信最適化
ECでは商品画像が多く、画像配信が遅いとページ表示が重くなります。商品一覧では大量のサムネイルが表示されるため、画像サイズ、形式、CDN配信、遅延読み込みが重要です。画像最適化は、フロントエンドだけでなくバックエンドや配信基盤とも関係します。
バックエンドでは、アップロードされた画像を複数サイズに変換し、一覧用、詳細用、拡大用に分ける設計が有効です。CDNを使うことで、ユーザーに近い場所から画像を配信し、表示速度を改善できます。
| 対策 | 内容 | 効果 |
|---|---|---|
| 画像リサイズ | 用途別サイズ生成 | 転送量削減 |
| WebP対応 | 軽量形式 | 表示速度改善 |
| CDN配信 | 近いサーバーから配信 | 高速化 |
| 遅延読み込み | 必要時に読み込む | 初期表示改善 |
| サムネイル生成 | 一覧用画像 | 一覧表示高速化 |
| 画像圧縮 | 容量削減 | モバイルで有効 |
13.5 データベースインデックス
データベースインデックスは、検索や絞り込みを高速化するために重要です。商品一覧ではカテゴリ、価格、公開状態、作成日時、ブランドなどで検索することが多く、注文一覧では注文日、注文ステータス、ユーザーIDなどで絞り込みます。よく使う条件に合わせてインデックスを設計します。
ただし、インデックスを増やしすぎると、更新処理が遅くなる場合があります。商品登録や在庫更新、注文作成の頻度も考慮し、必要なインデックスを選びます。パフォーマンス改善では、実際のクエリを分析することが重要です。
| 対象 | インデックス候補 | 用途 |
|---|---|---|
| 商品 | category_id | カテゴリ一覧 |
| 商品 | status | 公開商品絞り込み |
| 商品 | price | 価格フィルター |
| 商品 | created_at | 新着順 |
| 注文 | user_id | 購入履歴 |
| 注文 | order_status | 管理画面絞り込み |
| 在庫 | sku_id | 在庫確認 |
13.6 非同期処理
非同期処理は、ユーザーを待たせる必要がない処理をバックグラウンドで実行する設計です。注文完了メール、在庫同期、配送連携、分析ログ送信、レコメンド更新などは非同期化しやすい処理です。これにより、注文完了画面の表示を速くできます。
ただし、決済や在庫確保など、注文成立に必要な処理は安易に非同期化してはいけません。同期的に完了すべき処理と、後から実行してよい処理を分けることが重要です。非同期処理では、失敗時の再試行やログ管理も必要です。
| 処理 | 非同期適性 | 注意点 |
|---|---|---|
| 注文メール送信 | 高い | 送信失敗時の再試行 |
| 分析ログ送信 | 高い | 多少遅れてもよい |
| 配送連携 | 中 | 出荷業務に影響 |
| 在庫同期 | 中 | 整合性に注意 |
| 決済処理 | 低〜中 | 状態管理が重要 |
| レコメンド更新 | 高い | 定期処理でよい |
13.7 セール時の高負荷対策
セール時には、通常よりも多くのユーザーが同時にアクセスし、商品一覧、商品詳細、カート、注文、決済に負荷が集中します。特に限定商品や在庫数が少ない商品では、同時購入による在庫競合が発生しやすくなります。
高負荷対策では、キャッシュ、CDN、キュー、レート制限、在庫ロック、待機室、読み取り専用ページの最適化などを検討します。セール前に負荷試験を行い、どの処理がボトルネックになるかを確認しておくことが重要です。
| 対策 | 内容 | 効果 |
|---|---|---|
| CDN | 静的配信を高速化 | フロント負荷軽減 |
| キャッシュ | 商品一覧を高速化 | DB負荷軽減 |
| キュー | 注文処理を制御 | 急激な負荷を吸収 |
| レート制限 | 過剰アクセス制御 | 障害防止 |
| 在庫ロック | 同時購入制御 | 売り越し防止 |
| 負荷試験 | 事前検証 | ボトルネック発見 |
14. 運用・監視設計
ECバックエンドは、リリース後の運用と監視が非常に重要です。注文失敗、決済エラー、在庫不整合、配送連携エラー、メール送信失敗などは、すぐに検知して対応する必要があります。システムが動いているだけでは不十分で、正しく注文が処理されているかを継続的に監視します。
運用・監視設計では、エラーログ、注文失敗監視、決済エラー監視、在庫不整合監視、売上ダッシュボード、管理者通知、バックアップを整備します。問題が発生したときに原因を追跡し、復旧できる状態を作ることが重要です。
14.1 エラーログ管理
エラーログ管理では、APIエラー、決済連携エラー、配送連携エラー、データベースエラー、認証エラーなどを記録します。ログがないと、障害発生時に何が起きたのか分からず、対応が遅れます。ECでは、注文や決済に関わるエラーを特に重視します。
ただし、ログに個人情報や決済情報をそのまま出力しないように注意します。ログは調査に必要な情報を残しつつ、機密情報を含めない設計にします。エラーIDや注文番号を使って追跡できるようにすると便利です。
| ログ対象 | 内容 | 注意点 |
|---|---|---|
| APIエラー | リクエスト失敗 | 原因調査に使う |
| 注文エラー | 注文作成失敗 | 重要度が高い |
| 決済エラー | 支払い失敗 | 決済IDを記録 |
| 配送エラー | 連携失敗 | 再処理に使う |
| 認証エラー | ログイン失敗 | 不正検知 |
| 個人情報 | ログ出力制限 | マスキングが必要 |
14.2 注文失敗監視
注文失敗監視では、注文作成に失敗したケースや、注文が途中状態で止まっているケースを検知します。たとえば、注文は作成されたが決済に進んでいない、決済は成功したが注文が更新されていない、在庫確保後に処理が止まった、といった状態です。
注文失敗は売上損失やユーザー不満に直結するため、早期検知が重要です。一定時間以上同じ状態に留まっている注文を監視し、管理者へ通知する仕組みを作ります。
| 監視対象 | 内容 | 対応 |
|---|---|---|
| 注文作成失敗 | 注文が作れない | エラー通知 |
| 決済待ち長期化 | 支払い未完了 | リマインド・取消 |
| 決済成功未反映 | 支払い済みなのに未更新 | 状態照会 |
| 在庫確保停止 | 仮在庫のまま | 自動解放 |
| 注文重複 | 同一注文の重複 | 調査・取消 |
| ステータス停滞 | 処理が止まる | 管理者通知 |
14.3 決済エラー監視
決済エラー監視では、決済失敗率、Webhook受信失敗、返金失敗、決済代行サービス障害などを監視します。決済に問題があると購入完了できず、売上に直結します。ユーザー側では「購入できない」という体験になるため、迅速な対応が必要です。
決済エラーは、外部サービス側の障害、通信エラー、設定ミス、認証情報の期限切れなどが原因になることがあります。異常が発生した場合、管理者へ通知し、必要に応じて決済方法を一時停止する設計も検討します。
| 監視対象 | 内容 | 対応 |
|---|---|---|
| 決済失敗率 | 失敗が増えていないか | 原因調査 |
| Webhook失敗 | 通知受信失敗 | 再送・照会 |
| 返金失敗 | 返金処理エラー | 手動対応 |
| 外部障害 | 決済代行障害 | 告知・一時停止 |
| 署名検証失敗 | 不正通知の可能性 | セキュリティ確認 |
| 決済遅延 | 結果反映遅れ | 保留状態管理 |
14.4 在庫不整合監視
在庫不整合監視では、在庫数がマイナスになっていないか、仮在庫が長時間残っていないか、注文数と在庫減算が一致しているかを確認します。在庫不整合は、売り越しや販売停止につながるため、定期的に検知する必要があります。
在庫不整合が起きた場合、在庫履歴をもとに原因を調査します。注文、キャンセル、返品、手動調整、外部倉庫連携のどこで差分が出たかを追えるようにしておくことが重要です。
| 監視対象 | 内容 | 対応 |
|---|---|---|
| マイナス在庫 | 在庫が0未満 | 緊急確認 |
| 長期仮在庫 | 仮確保が残る | 自動解放 |
| 注文差分 | 注文数と在庫減算の不一致 | 履歴調査 |
| 倉庫差分 | 外部倉庫との差 | 再同期 |
| 手動調整 | 管理者変更 | 理由確認 |
| 棚卸し差分 | 実在庫との差 | 調整処理 |
14.5 売上ダッシュボード
売上ダッシュボードでは、売上、注文数、平均注文単価、決済方法別売上、カテゴリ別売上、商品別売上、キャンセル率、返品率などを可視化します。運営者はダッシュボードを見て、ECの状況を把握し、施策を判断します。
売上ダッシュボードでは、リアルタイム性と正確性のバランスが重要です。速報値としてすぐ表示するデータと、会計用に確定したデータは分けて扱う場合があります。キャンセルや返金が発生すると売上が変わるため、集計ルールを明確にします。
| 指標 | 内容 | 活用 |
|---|---|---|
| 売上 | 合計売上 | 経営判断 |
| 注文数 | 注文件数 | 需要把握 |
| 平均注文単価 | 1注文あたり金額 | 施策評価 |
| 決済方法別 | 支払い手段別 | 決済改善 |
| 商品別売上 | 商品ごとの売上 | 在庫・販促 |
| キャンセル率 | 取消割合 | UX改善 |
| 返品率 | 返品割合 | 商品改善 |
14.6 管理者通知
管理者通知は、重要なエラーや業務イベントを運営者へ知らせる仕組みです。注文失敗、決済エラー、在庫切れ、配送連携失敗、不正ログイン疑い、高負荷状態などは、早めに通知する必要があります。通知がなければ、問題に気づくのが遅れます。
ただし、通知が多すぎると重要な通知が埋もれてしまいます。通知レベルを分け、緊急度の高いものだけ即時通知し、軽微なものは日次レポートにまとめるなどの設計が有効です。
| 通知対象 | 内容 | 通知方法 |
|---|---|---|
| 注文失敗 | 注文処理エラー | 即時通知 |
| 決済エラー | 決済連携失敗 | 即時通知 |
| 在庫切れ | 人気商品の在庫切れ | 管理者通知 |
| 配送失敗 | 出荷連携エラー | 担当者通知 |
| 不正ログイン | 異常ログイン | セキュリティ通知 |
| 高負荷 | サーバー負荷上昇 | 運用通知 |
| 日次集計 | 売上・注文レポート | 定期通知 |
14.7 バックアップ設計
バックアップ設計は、障害や誤操作、データ破損に備えるために必要です。ECでは、注文、会員、商品、在庫、決済、配送データが重要です。バックアップがなければ、障害時に復旧できず、注文処理や顧客対応に大きな影響が出ます。
バックアップでは、取得頻度、保存期間、保存場所、暗号化、復旧手順を決めます。バックアップを取っているだけでは不十分で、実際に復元できるか定期的に確認することが重要です。
| 項目 | 内容 | 設計ポイント |
|---|---|---|
| DBバックアップ | データベース保存 | 定期取得 |
| ファイルバックアップ | 商品画像など | オブジェクトストレージ |
| 保存期間 | 何日残すか | 法務・運用要件 |
| 暗号化 | バックアップ保護 | 漏洩対策 |
| 復旧手順 | リストア方法 | 手順書化 |
| 復旧テスト | 実際に戻せるか確認 | 定期実施 |
おわりに
ECサイトバックエンド設計は、商品を登録して注文を受けるだけの単純な仕組みではありません。会員、商品、カート、注文、在庫、決済、配送、API、データベース、セキュリティ、パフォーマンス、運用監視が連動して初めて、安全で安定したECシステムになります。特に注文処理では、価格、在庫、決済、配送先が同時に関係するため、どのタイミングで何を確定するかを明確にすることが重要です。
小規模ECでは、最初から過度に複雑なシステムを作る必要はありません。しかし、会員管理、商品管理、注文管理、在庫管理、決済管理の責務を最初から分けておくと、後から拡張しやすくなります。商品数や注文数が増えたとき、キャンペーン、複数倉庫、外部配送連携、ポイント制度、定期購入などを追加しやすい構造になります。
ECバックエンドで特に重要なのは、整合性と安全性です。在庫がない商品を売らない、決済が失敗した注文を出荷しない、注文が重複しない、ユーザーが他人の注文を見られない、個人情報や決済情報を安全に扱う、といった基本を確実に守る必要があります。見た目のUXだけでなく、裏側の処理が正確であることが、ECの信頼性を支えます。
長期運用を考えるなら、運用・監視設計も欠かせません。注文失敗、決済エラー、在庫不整合、配送連携失敗を早期に検知し、復旧できる状態を作る必要があります。バックアップ、監査ログ、管理者通知、売上ダッシュボードを整備することで、問題が起きたときにも対応しやすくなります。ECサイトのバックエンド設計は、ユーザーに商品を届けるための業務基盤であり、安定した売上と信頼を支える重要な土台です。
EN
JP
KR