コンテンツにスキップ

撤去済み(2026-05-26): 本仕様の ZoneShippingRule(キャリア × 配送ゾーン 9 区分)は、ProvinceDeliveryProfile(配送方法 × 都道府県)に一本化したため廃止しました。Dashboard 配送料ゾーン設定zoneShippingRules GraphQL・ritsubi_zone_shipping_rule テーブルは削除済みです。本ドキュメントは経緯参照のため残しています。新規仕様は docs/03-implementation/vendure-plugins/shipping-calculator.md を正本にしてください。

配送ゾーン 9 区分とキャリア × ゾーンの送料ルール

  • 作成日: 2026-05-20
  • 関連実装:
  • packages/domain/src/rules/shipping.ts (SHIPPING_ZONES, determineShippingZone)
  • packages/plugins/src/rule-engine/shipping/entities/zone-shipping-rule.entity.ts
  • packages/plugins/src/rule-engine/shipping/services/zone-shipping-rule.service.ts
  • packages/plugins/src/rule-engine/shipping/services/shipping-calculator.service.ts
  • migrations: 1779227213000_shipping_zone_expand.ts, 1779246401472_add_brand_shipping_rule_carrier.ts, 1779246401473_rename_brand_shipping_rule_to_zone.ts

背景

2026-05 までの送料体系は「ブランド別 × ゾーン」の BrandShippingRule を SSOT としていたが、運用上ブランド軸の差は無く、配送キャリアと地域差の方が支配的だった。本仕様で キャリア × ゾーン に再設計し、ブランド軸を廃止する。

ゾーン定義

都道府県ベースの 9 区分。SHIPPING_ZONES がコード側の SSOT。

key label 都道府県
hokkaido 北海道 北海道
tohoku 東北 青森 / 岩手 / 宮城 / 秋田 / 山形 / 福島
kanto 関東・甲信越 東京 / 神奈川 / 千葉 / 埼玉 / 茨城 / 栃木 / 群馬 / 山梨 / 長野 / 新潟
hokuriku 北陸 富山 / 石川 / 福井
tokai 東海 愛知 / 岐阜 / 静岡 / 三重
kinki 近畿 大阪 / 京都 / 兵庫 / 奈良 / 和歌山 / 滋賀
chugoku_shikoku 中国・四国 鳥取 / 島根 / 岡山 / 広島 / 山口 / 徳島 / 香川 / 愛媛 / 高知
kyushu 九州 福岡 / 佐賀 / 長崎 / 熊本 / 大分 / 宮崎 / 鹿児島
okinawa 沖縄・離島 沖縄県

determineShippingZone(province) は 9 区分を順に走査して該当 zone を返す。マッチしない場合は ShippingZoneResolutionError を投げる。kanto などへの暗黙フォールバックは、表記揺れや空文字を隠して誤課金につながるため行わない。

キャリア

SHIPPING_CARRIERS = yamato / japan_post / sagawaZoneShippingRule.carrier は nullable(キャリア非依存ルールを表現する)。

ZoneShippingRuleEntity

金額列は業務設定として円単位で保存する。Vendure の shipping calculator が返す値や Shop API の Money field は Vendure Money 値であり、JPY でも円の 100 倍整数として扱う。境界変換は @ritsubi/utils の helper を使い、詳細は docs/03-implementation/vendure-money-units.md を参照する。

用途
carrier varchar nullable。キャリア軸
shippingZone varchar 9 区分のいずれか
baseShippingFee decimal 基本送料
freeShippingThreshold decimal nullable。本ルール上での送料無料閾値
weightLimit / sizeLimit decimal nullable。超過時に specialHandlingFee 加算
supportsDirectShipping boolean 直送可否
directShippingExtraDays int 直送時の追加日数
specialHandlingFee decimal 超過時の加算料金
validFrom / validTo date 有効期間
isActive boolean 即時切替フラグ
notes text 備考

複合ユニーク制約: (carrier, shippingZone, validFrom)

ルール選定ロジック

ShippingCalculatorService.calculate(ctx, order):

  1. shippingAddress 未設定 → 0 円を返す(正常系の未入力状態)。
  2. determineShippingZone(province) で 9 区分のいずれかを解決。
  3. ZoneShippingRuleService.findActiveForZone(ctx, zone)isActive=true かつ validFrom <= now <= (validTo ?? ∞) を満たすルールを validFrom DESC で 1 件取得。
  4. ルールがある場合は calculateBrandShippingFee(rule, analysis) で金額算出。ルールが無い場合は計算対象の ShippingMethod に紐づく DB の ProvinceDeliveryProfile を参照する。該当 profile が無い場合は 0 円 に丸めず設定不備として例外にする。
  5. 直送モードの場合は surchargeRate = 0.1shippingFee に加算。
  6. FreeShippingProgressService.resolveThreshold(ctx, order) の閾値(既定 FREE_SHIPPING_THRESHOLDS.DEFAULT = 20000、特別顧客/VIP は 5,000、まとめ買い顧客は 7,500)を subTotal が満たすなら 0 円。
  7. 最終的な送料は toVendureMoneyFromYen() で Vendure Money 値へ変換して返す。例: 900円90_000

Vendure plugin 構成による都道府県別配送プロファイル

DB の ZoneShippingRule が未投入の環境でも、明示的な都道府県別送料を持てる。 通常運用の正本は React Dashboard の 設定 / 都道府県別配送設定 で編集する ProvinceDeliveryProfileProvinceDeliveryProfileShippingMethod × 都道府県 で保持し、配送方法ごとの deliveryDateLeadDays に同じ配送方法へ紐づく都道府県別 leadDaysOffset を加算して扱う。

ProvinceDeliveryProfile.provinceALL_PREFECTURES の 47 都道府県日本語表記のみ許可する。 migration では既存の都道府県別 profile を既存の全 ShippingMethod へ複製し、現行料金と leadDaysOffset を維持する。配送方法に紐づかない共通 profile は通常運用の正本にしない。

運用ルール

  • ZoneShippingRule は plugin 構成より優先される。運用上の正式な料金改定や履歴管理が必要な場合は、管理画面から有効期間付きルールを投入する。
  • ProvinceDeliveryProfile は配送方法別・都道府県別の標準送料と配送日数差分の正本。ZoneShippingRule が無い場合の送料と、配送希望日の leadDaysOffset に使う。
  • ルールの差し替えは validFrom / validTo をずらした新ルールを追加する形で行い、過去料金の履歴を保持する。isActive=false への切替は即時停止用。
  • Admin API 認可: 取得は ReadSettings、作成・更新・削除は UpdateSettings

例: ヤマト 60 サイズの初期投入

migration 1779246401472 以降では、ヤマト運輸・日本郵便の 60 サイズを起点とした初期データを seed する想定で運用する。本番投入時には validFrom を当日付に揃え、isActive=true で投入する。

関連仕様

  • docs/03-implementation/vendure-plugins/shipping-calculator.md (実装メモ)
  • docs/01-requirements/shipping-and-purchase-unit-requirements.md (要件)
  • docs/specifications/2026-04-storefront-free-shipping-progress.md (送料無料プログレス表示)