撤去済み(2026-05-26): 本仕様の
ZoneShippingRule(キャリア × 配送ゾーン 9 区分)は、ProvinceDeliveryProfile(配送方法 × 都道府県)に一本化したため廃止しました。Dashboard配送料ゾーン設定・zoneShippingRulesGraphQL・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.tspackages/plugins/src/rule-engine/shipping/services/zone-shipping-rule.service.tspackages/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 / sagawa。ZoneShippingRule.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):
shippingAddress未設定 → 0 円を返す(正常系の未入力状態)。determineShippingZone(province)で 9 区分のいずれかを解決。ZoneShippingRuleService.findActiveForZone(ctx, zone)でisActive=trueかつvalidFrom <= now <= (validTo ?? ∞)を満たすルールをvalidFrom DESCで 1 件取得。- ルールがある場合は
calculateBrandShippingFee(rule, analysis)で金額算出。ルールが無い場合は計算対象のShippingMethodに紐づく DB のProvinceDeliveryProfileを参照する。該当 profile が無い場合は0 円に丸めず設定不備として例外にする。 - 直送モードの場合は
surchargeRate = 0.1をshippingFeeに加算。 FreeShippingProgressService.resolveThreshold(ctx, order)の閾値(既定FREE_SHIPPING_THRESHOLDS.DEFAULT = 20000、特別顧客/VIP は 5,000、まとめ買い顧客は 7,500)をsubTotalが満たすなら 0 円。- 最終的な送料は
toVendureMoneyFromYen()で Vendure Money 値へ変換して返す。例:900円は90_000。
Vendure plugin 構成による都道府県別配送プロファイル¶
DB の ZoneShippingRule が未投入の環境でも、明示的な都道府県別送料を持てる。
通常運用の正本は React Dashboard の 設定 / 都道府県別配送設定 で編集する
ProvinceDeliveryProfile。ProvinceDeliveryProfile は ShippingMethod × 都道府県
で保持し、配送方法ごとの deliveryDateLeadDays に同じ配送方法へ紐づく都道府県別
leadDaysOffset を加算して扱う。
ProvinceDeliveryProfile.province は ALL_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(送料無料プログレス表示)