A realistic, Python-driven simulator that creates a production-style retail supply chain dataset for an Indian retail (apparel, footwear, and accessories) network built on a hub-and-spoke topology with cross-docking, designed to feed directly into a professional Power BI dashboard for analysis across orders, deliveries, costs, inventory, suppliers, and returns
Live interactive demo of the Power BI dashboard
Distribution hub master data containing specialization and location details for the three primary fulfillment centers.
| Column Name | Data Type | Description |
|---|---|---|
| Hub_ID PK | String | Unique hub identifier |
| Hub_Name | String | Full descriptive hub name |
| Specialty | String | Product category specialization |
Store master data for 100 retail outlets, including home hub assignment, city, and store type (major/minor).
| Column Name | Data Type | Description |
|---|---|---|
| Store_ID PK | String | Unique store identifier |
| Home_Hub_ID FK | String | Assigned distribution hub |
| City | String | Store location city |
| Store_Type | String | Major or minor store classification |
Product catalog with 500 SKUs including physical attributes, demand patterns, and inventory planning parameters.
| Column Name | Data Type | Description |
|---|---|---|
| SKU PK | String | Stock keeping unit identifier |
| Product_Name | String | Full product name |
| Category | String | Primary product category |
| Sub_Category | String | Detailed product subcategory |
| Weight_kg | Float | Product weight in kilograms |
| Volume_cbm | Float | Product volume in cubic meters |
| Base_Demand _Min | Integer | Minimum daily demand baseline |
| Base_Demand _Max | Integer | Maximum daily demand baseline |
| Avg_Daily _Demand | Float | Calculated average daily demand |
| ROP | Integer | Reorder point (safety stock) |
| Target_Level | Integer | Target inventory level |
Supplier master data with 20 vendors across specialized manufacturing regions in India.
| Column Name | Data Type | Description |
|---|---|---|
| Supplier_ID PK | String | Unique supplier identifier |
| City | String | Supplier location city |
| Specialty | String | Manufacturing specialization |
Granular order line data representing 50,000+ customer orders with fulfillment details and delivery requirements.
| Column Name | Data Type | Description |
|---|---|---|
| Order _Line_ID PK | String | Unique order line identifier |
| Order_ID | String | Parent order identifier |
| Store_ID FK | String | Destination store |
| SKU FK | String | Product ordered |
| Source _Hub_ID FK | String | Fulfillment hub for this SKU |
| Order_Date | Date | Order placement date |
| Required _Delivery _Date | Date | Customer requested delivery date |
| Quantity _Ordered | Integer | Quantity customer requested |
| Quantity _Shipped | Integer | Quantity actually fulfilled |
| Is_Express | Boolean | Express shipping flag (≤3 days) |
Individual shipment legs tracking both inter-hub consolidation and final-mile delivery with transportation costs.
| Column Name | Data Type | Description |
|---|---|---|
| Shipment _Leg_ID PK | String | Unique shipment leg identifier |
| Leg_Type | String | Shipment classification |
| Transport _Mode | String | Transportation method |
| Origin | String | Shipment starting location |
| Destination | String | Shipment ending location |
| Dispatch_Date | Date | Shipment departure date |
| Arrival_Date | Date | Shipment arrival date |
| Transportation _Cost | Float | Total shipment cost (INR) |
Daily inventory levels capturing stock-on-hand for each SKU at each hub, enabling time-series analysis and stockout detection.
| Column Name | Data Type | Description |
|---|---|---|
| Snapshot _Date PK | Date | Inventory snapshot date |
| Hub_ID FK | String | Hub location |
| SKU FK | String | Product SKU |
| Quantity _On_Hand | Integer | Available inventory units |
Customer return transactions with reason codes and restocking details, tracking 3-6% return rate across product categories.
| Column Name | Data Type | Description |
|---|---|---|
| Return_ID PK | String | Unique return identifier |
| Order _Line_ID FK | String | Original order line reference |
| SKU FK | String | Returned product SKU |
| Quantity _Returned | Integer | Units returned |
| Return_Date | Date | Return processed date |
| Return_Reason | String | Customer return reason |
Supplier replenishment shipments tracking purchase orders, lead times, and stock arrivals at distribution hubs.
| Column Name | Data Type | Description |
|---|---|---|
| Inbound _Shipment_ID PK | String | Unique inbound shipment identifier |
| Supplier_ID FK | String | Source supplier |
| Destination _Hub_ID FK | String | Receiving hub |
| SKU FK | String | Product being replenished |
| Quantity _Received | Integer | Units received |
| Expected _Arrival_Date | Date | Promised delivery date |
| Actual _Arrival_Date | Date | Actual delivery date |
Unfulfilled demand tracking partial and complete order failures due to stockouts, enabling service level analysis.
| Column Name | Data Type | Description |
|---|---|---|
| Backorder_ID PK | String | Unique backorder identifier |
| Order_Line_ID FK | String | Affected order line |
| Order_ID FK | String | Parent order reference |
| SKU FK | String | Backordered product |
| Quantity _Backordered | Integer | Unfulfilled quantity |
| Backorder _Date | Date | Backorder creation date |
| Status | String | Backorder status |
Bridge table connecting shipment legs to order lines, enabling many-to-many relationships and multi-leg fulfillment tracking.
| Column Name | Data Type | Description |
|---|---|---|
| Shipment _Leg_ID FK | String | Shipment leg reference |
| Order _Line_ID FK | String | Order line reference |
| Quantity _Shipped | Integer | Quantity in this shipment leg |
Avg Inbound Lead Time =
AVERAGEX(
fact_inbound_shipments,
DATEDIFF(
fact_inbound_shipments[Expected_Arrival_Date],
fact_inbound_shipments[Actual_Arrival_Date],
DAY
)
)
Purpose: OnTimeDeliveryRate =
DIVIDE(
COUNTROWS(
FILTER(fact_inbound_shipments, fact_inbound_shipments[Delay Days] = 0)
),
COUNTROWS(fact_inbound_shipments)
)
Purpose:Average Product On Hand per SKU =
AVERAGEX(
VALUES(fact_inventory_snapshot[SKU]),
CALCULATE(AVERAGE(fact_inventory_snapshot[Quantity_On_Hand]))
)
Purpose:Qty On Hand (Latest Snapshot) =
VAR MaxDate = LASTDATE('fact_inventory_snapshot'[Snapshot_Date])
RETURN
CALCULATE(
SUM('fact_inventory_snapshot'[Quantity_On_Hand]),
'fact_inventory_snapshot'[Snapshot_Date] = MaxDate
)
Purpose:Order Fulfillment Rate % =
DIVIDE(
SUM('fact_orders'[Quantity_Shipped]),
SUM('fact_orders'[Quantity_Ordered]),
0
)
Purpose:Total Backordered Quantity =
SUMX(fact_orders, fact_orders[Quantity_Ordered] - fact_orders[Quantity_Shipped])
Purpose:Return Rate % =
DIVIDE(
SUM('fact_returns'[Quantity_Returned]),
SUM('fact_orders'[Quantity_Shipped]),
0
) * 100
Purpose:Avg Delivery Lead Time (Inter-Hub) =
AVERAGEX(
FILTER('fact_shipments', 'fact_shipments'[Leg_Type] = "Inter-Hub"),
DATEDIFF('fact_shipments'[Dispatch_Date], 'fact_shipments'[Arrival_Date], DAY)
)
Purpose:On-Time Delivery % =
VAR FinalMileDeliveries =
ADDCOLUMNS(
FILTER(link_shipment_orders, RELATED(fact_shipments[Leg_Type]) = "Final-Mile"),
"ArrivalDate", RELATED(fact_shipments[Arrival_Date]),
"RequiredDate", RELATED(fact_orders[In_Store_Required_Delivery_Date])
)
VAR OnTimeDeliveries =
FILTER(FinalMileDeliveries, [ArrivalDate] <= [RequiredDate])
RETURN
DIVIDE(COUNTROWS(OnTimeDeliveries), COUNTROWS(FinalMileDeliveries), 0)
Purpose: