Power BI Retail Dashboard for D2C Brands: Sales, Returns, Inventory
A useful Power BI retail dashboard for an Indian D2C brand combines order exports from your website and every marketplace into one order-line table, then adds returns and daily stock snapshots on a shared SKU master. With that model you can see net sales after returns, return-to-origin rates for cash on delivery against prepaid orders, and how many days of stock each SKU has left.
At a glance: the questions the dashboard must answer
- What did we really sell, after cancellations, RTO and customer returns, by channel and week?
- Which SKUs, sizes and reasons drive returns?
- How do COD and prepaid orders differ in RTO rate, by state and PIN code?
- How many days of stock does each SKU have, and where are we about to stock out?
- Which channels and categories are growing once returns are taken out?
Start with the exports you already have
You do not need an ERP integration to begin. Most brands already download these files every week:
| Source | Typical export | Watch out for |
|---|---|---|
| Your website store | Orders CSV | One row per line item |
| Each marketplace | Orders, returns, payments | Column names change |
| Courier or aggregator | Shipment status, RTO | Status wording varies |
| Warehouse or ERP | Daily stock on hand | Snapshots, not movements |
Take a Shopify store as an example. Its help page on exporting orders explains that an order with several items shows the extra line items on separate rows, with many order-level fields left blank on those rows. Columns such as Financial Status, Payment Method and Refunded Amount sit on the order's first row. In Power Query, sort by the order name and use Fill Down on the order-level columns before you do anything else, or every multi-item order will look like it has unpaid, unknown-payment lines.
Marketplace seller panels offer order, return and payment or settlement reports, but each uses its own layout, and layouts change without notice. Keep the raw files untouched in one folder per channel, and write a small staging query per channel that renames columns to your standard names. When a marketplace changes a column, you fix one staging query, not the whole model. The Folder connector and Combine Files handle the monthly files, as Microsoft shows in Combine files (binaries) in Power BI Desktop.
Clean four things before you model
1. One SKU, many IDs
The same product appears as your internal SKU on the website, as an ASIN on Amazon and under other listing IDs elsewhere, often with size and colour variants. Build a SKU map table with two columns, channel listing ID and internal SKU, and maintain it like a master. Add a report page that lists unmapped IDs, so a new listing never silently drops out of the totals.
2. Payment mode in two values
Each gateway and marketplace writes payment methods differently. Map whatever text arrives into exactly two values, COD and Prepaid, in a small mapping table. Partial payments or wallets can go into Prepaid if the order is paid before dispatch; decide the rule once and write it down.
3. Dates in IST
If any channel exports timestamps in UTC, add 5 hours 30 minutes before taking the date. Otherwise orders placed between midnight and 5:30 am IST land on the previous day, and festive sale days never quite match what the marketing team saw.
4. One status vocabulary
Every channel and courier describes the same outcome in its own words. Keep a status map with three columns, channel, raw status and standard status, and join it in each staging query. The raw wording below is illustrative; copy the exact text from your own files.
| Raw wording (examples) | Standard status |
|---|---|
| Delivered, Completed | Delivered |
| RTO delivered, Returned to seller | RTO |
| Cancelled by customer, Cancelled | Cancelled |
| Shipped, Out for delivery | In transit |
Keep RTO and customer returns apart. An RTO parcel was never accepted and comes back from the courier; a customer return was delivered, then sent back, usually with a reason. They have different causes and different fixes, so one blended "returns" number hides both.
Design the model
Use a star schema, which Microsoft recommends for Power BI because dimension tables filter and group while fact tables summarise (star schema guidance).
| Table | Type | Grain |
|---|---|---|
| OrderLines | Fact | One order line |
| Returns | Fact | One returned line |
| Inventory | Fact | SKU, location, day |
| Product | Dimension | Internal SKU |
| Date | Dimension | Day |
| Channel | Dimension | Website or marketplace |
| Geography | Dimension | PIN code, city, state |
Give OrderLines a single Status column with a small set of agreed values: Delivered, RTO, Cancelled and In transit. Customer returns after delivery live in the Returns table, with return date, reason and the original order line ID, so a delivered and later returned unit is counted once in each place.
The Inventory table is a snapshot. Stock on hand is semi-additive: you can add it across SKUs and warehouses, but never across days. Adding Monday's stock to Tuesday's is the most common mistake in retail dashboards.
Write the measures
Gross Units = SUM ( OrderLines[Qty] )
Ordered Units =
CALCULATE ( [Gross Units], OrderLines[Status] <> "Cancelled" )
Delivered Units =
CALCULATE ( [Gross Units], OrderLines[Status] = "Delivered" )
RTO Units =
CALCULATE ( [Gross Units], OrderLines[Status] = "RTO" )
RTO Rate =
DIVIDE ( [RTO Units], [Delivered Units] + [RTO Units] )
Returned Units = SUM ( Returns[Qty] )
Return Rate = DIVIDE ( [Returned Units], [Delivered Units] )
Closing Stock =
CALCULATE (
SUM ( Inventory[QtyOnHand] ),
LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[QtyOnHand] ) ) )
)
Avg Daily Units 30D =
DIVIDE (
CALCULATE ( [Ordered Units], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -30, DAY ) ),
30
)
Days of Inventory = DIVIDE ( [Closing Stock], [Avg Daily Units 30D] )
RTO Rate uses orders that reached an outcome, delivered or returned to origin, so in-transit parcels do not flatter the number. Days of Inventory uses the last 30 days of demand; change the window for seasonal categories, but use the same window everywhere so teams compare like with like.
Build five pages, not fifteen
- Sales overview. Net units and net value by week and channel, with average order value. Mark festive sale weeks with a date-table flag so year-on-year comparisons line up.
- Returns. Return rate by category, size and reason, with a minimum-volume filter. A SKU with one sale and one return shows 100 percent and teaches nobody anything.
- COD and prepaid. RTO rate by payment mode, then by state and PIN code. Pair it with the share of COD orders, so the team sees both the risk and the volume before changing payment options for any region.
- Inventory health. Days of inventory by SKU, with stock-outs (zero closing stock while demand exists) in one list and slow movers (days of inventory above a threshold your planners choose) in another.
- Channel view. Units, net value and return rate by channel and category. If you load settlement reports, add fees and net payout here.
Rules that keep the numbers honest
- Decide returns by order month or return month. For rates, cohort returns back to the month of the order; for warehouse workload, use the return date. Label each visual with the one it uses.
- Pick one value basis. Channels report prices with and without GST, and with and without discounts. Standardise on taxable value after discount, and keep tax in its own column. Our GST dashboard guide covers the tax side.
- Refresh without a gateway. Keep the export folders in SharePoint or OneDrive, so the Power BI service can refresh them on schedule.
- Use incremental refresh as history grows. Microsoft supports incremental refresh on Power BI Pro, Premium Per User and Premium models, which keeps daily refreshes fast once you hold years of orders (incremental refresh requirements).
- Treat exchanges as two events. A size exchange is a return of one SKU and a new order line for another. Record both, or the original size looks like a sale and the new size appears from nowhere in your stock.
- Protect customer data. Order files contain names, phone numbers and addresses. Drop columns you do not analyse in Power Query, and keep PIN code and state rather than full addresses.
A trainer's note: the first version should take days, not months. Start with one channel and the sales and returns pages, show it to the people who run the business, and add inventory once the SKU map is trusted.
How CertTulen Academy can help
Everything in this build, Power Query staging, star schema design, semi-additive DAX and scheduled refresh, is covered in Microsoft Power BI Data Analyst (PL-300), which CertTulen Academy teaches live online with MCT-led sessions and hands-on labs. If your brand team wants to learn on data shaped like its own, ask about a private corporate cohort. The PL-300 exam guide explains the certification. Course pages show prices in INR with UPI, card and netbanking checkout. Contact us for a batch that suits your time zone.
Frequently Asked Questions
Can Power BI combine Shopify and marketplace orders in one report?+
Yes. Load each channel's export through its own staging query in Power Query, rename columns to one standard layout, map every listing ID to your internal SKU, and append the channels into one order-line table. The append is easy; the SKU map and consistent status values are what make the combined numbers trustworthy.
How do I calculate RTO rate for COD orders in Power BI?+
Give each order line a status such as Delivered, RTO, Cancelled or In transit, and a payment mode of COD or Prepaid. Divide RTO units by delivered plus RTO units, so parcels still in transit are left out, then put payment mode on the visual. Slice by state or PIN code to see where the gap is widest.
What is days of inventory and how is it calculated?+
Days of inventory estimates how long current stock will last at recent demand. Take closing stock on the latest snapshot date and divide it by average daily units ordered over a recent window, such as 30 days. In DAX, use LASTNONBLANK for closing stock so snapshots are never summed across days.
Do I need a data warehouse for a D2C Power BI dashboard?+
Not at the start. Folders of CSV and Excel exports in SharePoint or OneDrive, combined in Power Query, are enough for many growing brands. Consider a warehouse or a Fabric lakehouse once you have many channels, years of history, or several teams building reports on the same data.
Is a Power BI dashboard safe for customer order data?+
It can be, if you design for it. Remove names, phone numbers and full addresses in Power Query unless a report truly needs them, keep PIN code and state for geography, limit workspace access, and use row-level security where teams should see only their own channel or region.
Sources
- Exporting orders
- Understand star schema and the importance for Power BI
- Combine files (binaries) in Power BI Desktop
- Configure incremental refresh and real-time data for Power BI semantic models
- DATESINPERIOD
Checked on 25 October 2026. Exams, products and rules change, so confirm on the official page before you book or decide.
Written by
Microsoft Certified Trainer (MCT), founder of CertTulen Academy
CertTulen Academy · Microsoft Training Services Partner · Microsoft AI Cloud Partner

