28. End-to-End Project: Blinkit Quick-Commerce Dashboard
28.5 Step 4 – Create the Measures
| Folder | Measure | DAX |
|---|---|---|
| Sales | Total Sales | SUM(Orders[Amount]) |
| Sales | Total Discount | SUM(Orders[Discount]) |
| Sales | AOV | DIVIDE([Total Sales], [Delivered Orders]) |
| Sales | Gross Margin % | DIVIDE([Gross Profit], [Total Sales]) (see Module 13.5) |
| Sales | Delivery Fee Revenue | SUMX(VALUES(Orders[Order ID]), CALCULATE(MAX(Orders[Delivery Fee]))) |
| Orders | Total Orders | DISTINCTCOUNT(Orders[Order ID]) |
| Orders | Delivered Orders | CALCULATE([Total Orders], Orders[Order Status] = "Delivered") |
| Orders | Cancelled Orders | CALCULATE([Total Orders], Orders[Order Status] = "Cancelled") |
| Orders | Cancellation Rate | DIVIDE([Cancelled Orders], [Total Orders]) |
| Orders | Orders per Dark Store | DIVIDE([Total Orders], DISTINCTCOUNT(Orders[Store ID])) |
| Delivery | Avg Delivery Time (mins) | AVERAGEX(VALUES(Orders[Order ID]), CALCULATE(MAX(Orders[Delivery Time Mins]))) |
| Delivery | % Orders Delivered Under 10 Mins | DIVIDE(CALCULATE([Delivered Orders], Orders[Delivery Time Mins] <= 10), [Delivered Orders]) |
| Delivery | Store Speed Rank | RANKX(ALL(DarkStore[Store Name]), [Avg Delivery Time (mins)], , ASC, DENSE) |
| Customers | Active Customers | DISTINCTCOUNT(Orders[Customer ID]) |
| Customers | Repeat Customer % | DIVIDE(COUNTROWS(FILTER(VALUES(Customer[Customer ID]), [Total Orders] > 1)), [Active Customers]) |
| Time | Sales LY | CALCULATE([Total Sales], SAMEPERIODLASTYEAR('Date'[Date])) |
| Time | YoY Growth % | DIVIDE([Total Sales] - [Sales LY], [Sales LY]) |
| Time | Orders Previous Month | CALCULATE([Total Orders], DATEADD('Date'[Date], -1, MONTH)) |
| Time | MoM Orders Growth % | DIVIDE([Total Orders] - [Orders Previous Month], [Orders Previous Month]) |
| Time | Sales YTD | TOTALYTD([Total Sales], 'Date'[Date]) |
| Time | Orders 7D Moving Avg | see Module 13.16 |
| Time | Festival Orders | CALCULATE([Total Orders], 'Date'[Is Festival Day] = TRUE()) |
| Platform | Blinkit Orders | CALCULATE([Total Orders], Orders[Platform] = "Blinkit") |
| Platform | Amazon Now Orders | CALCULATE([Total Orders], Orders[Platform] = "Amazon Now") |
| Platform | Blinkit Share of Orders % | DIVIDE([Blinkit Orders], CALCULATE([Total Orders], REMOVEFILTERS(Orders[Platform]))) |
| Ranking | Top 5 Products Sales | CALCULATE([Total Sales], TOPN(5, ALL(Product[Product Name]), [Total Sales])) |
| UI | Selected City | SELECTEDVALUE(DarkStore[City], "All Cities") |
| UI | Report Title | "Blinkit Operations – " & [Selected City] |
| UI | Delivery Time Colour | IF([Avg Delivery Time (mins)] <= 10, "#107C10", "#D13438") |
Format currency measures with the ₹ symbol (e.g. ₹ #,##0), time measures with one decimal place, and percentage measures with one decimal place.
Ravindra Bagale's Tip
Ek common chuk mhanje writing every KPI from scratch instead of reusing base measures. Build Total Sales, Total Orders and Delivered Orders first, then build AOV, Cancellation Rate and YoY on top. Put all measures in a measure table with display folders. Ghabru naka, don-teen vela kela ki savay hote.