13. Shipping
[← Categories]/12-categories/ · [Index]/00-index/
13. Shipping
Verified against: Medusa admin dashboard 2.18.0 (location-create,
location-service-zone-create, location-service-zone-shipping-option-create — schemas and
forms source-read directly), real seed data in
services/medusa/src/migration-scripts/initial-data-seed.ts, and .ai/features/shipping.md,
.ai/next-tasks.md.
How shipping is structured in this admin
Configured under Settings → Locations (not a dedicated sidebar section — see [Section 2]/02-admin-dashboard/#shipping), in three nested layers:
Stock Location ("India Warehouse") ↓Service Zone (which geography this location ships to) ↓Shipping Option (the actual method + price the customer picks at checkout)Real setup today
| Layer | Real value |
|---|---|
| Stock Location | “India Warehouse” — address is a placeholder, not the real warehouse address |
| Service Zone | Single zone covering all of India (geo_zones: [{ country_code: "in", type: "country" }]) — flat nationwide, no per-state/per-distance split |
| Shipping Option | “Standard Delivery”, flat rate ₹49 — explicitly a placeholder, not a confirmed real cost |
| Fulfillment provider | manual_manual — Medusa’s default; no live carrier rate/tracking integration is fully wired yet (see Shiprocket note below) |
Creating/editing a Stock Location — real fields
| Field | Required? |
|---|---|
| Name | REQUIRED |
| Address Line 1 | REQUIRED |
| Address Line 2 | OPTIONAL |
| City | OPTIONAL |
| Postal Code | REQUIRED |
| Country | REQUIRED |
| State/Province | OPTIONAL |
| Company | OPTIONAL |
| Phone | OPTIONAL |
Creating a Service Zone — real fields
A Name, plus one or more geographic areas (country / province / city level). This store’s zone uses the simplest possible area: the whole country of India as one zone. Real capability exists for finer splits (e.g. a separate zone for a specific state) — not used today.
Creating a Shipping Option — real fields
| Field | Notes |
|---|---|
| Name | e.g. “Standard Delivery” |
| Price Type | flat or calculated — this store uses flat. calculated would mean the rate comes from a live fulfillment provider (e.g. a real courier’s API) instead of a fixed number — not used today, since no live carrier is wired up |
| Shipping Profile | Groups shipping options by product type/handling requirements |
| Fulfillment Provider | manual_manual today |
| Fulfillment Option | The specific option offered by that provider |
| Shipping Option Type | A label/category for the option (e.g. “Standard” vs “Express”) |
| Enabled in Store | Toggle — whether customers can actually select it at checkout |
| Price | Set per region/currency |
IMPORTANT — real capability, not used today: shipping options support conditional pricing — a price that only applies above/below a cart-total threshold (e.g. “₹0 shipping if cart total ≥ ₹999”), configurable per region or currency directly in this form. This is a real, verified feature of the admin, not a hypothetical — worth knowing if the business ever wants a free-shipping threshold. [TO BE CONFIRMED] whether/when this should be set up; no such rule exists today, only the flat ₹49.
Shipping address, status, tracking, delivery
These are handled at the order level, not configured here — see [Section 8]/08-order-management/#fulfillment-status-values for status values and [Section 9, steps 10–13]/09-order-processing-sop/ for the real Fulfill/Ship/Deliver workflow and its Location/Tracking Number/Tracking URL/Label URL fields.
Real carrier integration status
IMPORTANT — do not invent courier names or delivery timelines, per the original brief’s own instruction.
A Shiprocket integration exists in the codebase
(services/medusa/src/modules/fulfillment-shiprocket) that would create a real Shiprocket
order/AWB/label automatically when an order is fulfilled — Phase 1, built and
typechecked/boot-verified, but blocked on a real Shiprocket account/API credentials for
end-to-end testing (.ai/next-tasks.md). It does not touch checkout pricing — the flat ₹49
is unchanged by it.
Phase 2 (live rate calculation at checkout, replacing the flat ₹49 with a real calculated rate) is a separate, later, more invasive change and has not been started.
Until Phase 1 is confirmed working with a real account, assume tracking numbers must be entered manually (see [Section 9]/09-order-processing-sop/#11-mark-as-shipped-add-tracking).
Business decisions not yet made
[TO BE CONFIRMED] — none of the following has a confirmed answer yet:
- The real shipping cost (₹49 is a placeholder)
- Whether a free-shipping threshold should exist
- Real warehouse address
- Whether zone/rate differentiation (e.g. remote pincode surcharge) is ever needed
[← Categories]/12-categories/ · [Index]/00-index/ · [Next: Payments →]/14-payments/