A good sales dashboard answers one question fast: are we going to hit the number, and if not, where is the gap? Power BI suits this well because your CRM already holds the raw deals, and a tight semantic model turns that export into revenue, pipeline, win rate, and quota attainment that update with a refresh. This is a practical blueprint: which metrics to show, how to lay them out, the DAX that matters, and how to prep a CRM export so the math is actually correct.

Start with the metrics leadership acts on

Resist the urge to chart everything. A sales dashboard earns its place by surfacing the handful of numbers a VP of Sales or a rep checks daily. Group them in three layers.

Outcome metrics — what already happened:

  • Closed revenue (won deals), shown month-to-date and year-to-date
  • Quota attainment — actual vs. target, as a percentage, by rep and by team
  • Win rate — won deals ÷ (won + lost) closed deals
  • Average deal size and sales cycle length (days from created to closed)

Forward metrics — what's coming:

  • Open pipeline — total value of deals not yet closed
  • Weighted pipeline — pipeline value × stage probability, a more honest forecast
  • Pipeline coverage — open pipeline ÷ remaining quota (3x is a common rule of thumb)

Diagnostic breakdowns — why the number is what it is:

  • Revenue and attainment by rep, region, product, and segment
  • A stage funnel showing where deals stall
  • A trend line of monthly bookings vs. target

If a metric doesn't change a decision, leave it off the main page. You can always add a detail page for the curious.

Lay it out to read top-to-bottom, left-to-right

People scan a report the way they read: the most important thing belongs top-left. A reliable single-page structure looks like this.

+--------------------------------------------------------------+
|  Filters: Date | Region | Rep | Product   (slicers, top bar) |
+--------------------------------------------------------------+
|  KPI cards: Revenue YTD | Quota Attainment | Win Rate |      |
|             Open Pipeline | Avg Deal Size                    |
+----------------------------+---------------------------------+
|  Revenue vs Target (combo  |  Attainment by Rep              |
|  column + line, by month)  |  (horizontal bar, sorted)       |
+----------------------------+---------------------------------+
|  Pipeline by Stage (funnel)|  Detail table: deals,           |
|                            |  owner, stage, amount, close    |
+----------------------------+---------------------------------+

A few rules that keep it usable:

  • Five KPI cards is plenty. Each can show the value plus a small YoY or vs-target indicator.
  • Put slicers in one consistent strip so users always know where to filter. Region, rep, product, and a date slider cover most asks.
  • Sort bar charts by value, not alphabetically — the eye should land on the top and bottom performers instantly.
  • Use one accent color for "on target" and one for "behind." Don't paint every series a different hue. If you want a coherent palette without fiddling, the free Power BI theme generator produces a theme JSON you can drop straight into Desktop.

Model the CRM export as a star schema

This is where most homemade sales dashboards go wrong. A CRM export is usually one wide, flat table — every deal with the rep name, region, product, and dates in the same row. That works for a quick chart, but it makes time intelligence and clean slicers painful. Reshape it into a star schema: one central fact table surrounded by dimension tables.

Table Type Holds
Deals Fact One row per opportunity: amount, stage, probability, created date, close date, foreign keys
Date Dimension A continuous calendar; mark it as the date table
Rep Dimension Rep name, team, manager, region
Product Dimension Product or product line
Quota Fact (or bridge) Target per rep per month

Connect each dimension to Deals with a one-to-many relationship on a single key column. Keep relationships single-direction unless you have a specific reason not to — bidirectional filters are a common source of wrong totals.

In Power Query (the data-prep step), do the cleanup before it ever hits the model:

  • Set proper data types — amounts to decimal, dates to date, not text.
  • Trim and standardize text (East vs. east vs. EAST will otherwise split your regions).
  • Filter out junk rows (test deals, blank owners).
  • Generate the Date table — either with a Power Query query or a DAX CALENDAR table covering your full date range.

A clean two- or three-table star schema also keeps the file portable. If you save as .pbip (the folder-based Power BI Project format) instead of a single binary .pbix, the model and report are stored as text files, which are far easier to version-control and review.

Write the DAX that actually matters

You need fewer measures than you think. Build a small set of base measures, then layer time intelligence on top. A marked Date table is the prerequisite for the year-over-year logic.

-- Base measures
Total Revenue = SUM ( Deals[Amount] )

Won Revenue =
CALCULATE ( [Total Revenue], Deals[Stage] = "Closed Won" )

Open Pipeline =
CALCULATE (
    [Total Revenue],
    NOT ( Deals[Stage] IN { "Closed Won", "Closed Lost" } )
)

Weighted Pipeline =
SUMX (
    FILTER ( Deals, NOT ( Deals[Stage] IN { "Closed Won", "Closed Lost" } ) ),
    Deals[Amount] * Deals[Probability]
)
-- Win rate
Win Rate =
DIVIDE (
    CALCULATE ( COUNTROWS ( Deals ), Deals[Stage] = "Closed Won" ),
    CALCULATE (
        COUNTROWS ( Deals ),
        Deals[Stage] IN { "Closed Won", "Closed Lost" }
    )
)
-- Year-over-year
Revenue PY =
CALCULATE ( [Won Revenue], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )

Revenue YoY % =
DIVIDE ( [Won Revenue] - [Revenue PY], [Revenue PY] )
-- Quota attainment (Quota table is per rep, per month)
Total Quota = SUM ( Quota[Target] )

Quota Attainment % = DIVIDE ( [Won Revenue], [Total Quota] )

Two habits prevent most DAX bugs here:

  • Always wrap division in DIVIDE. A rep with no prior-year revenue or no quota would otherwise throw a divide-by-zero error across the whole visual. DIVIDE returns blank instead.
  • Filter on stage with explicit values, and make sure those strings match exactly what's in your data — "Closed Won" won't match "Won".

Make the numbers honest and the report fast

A sales dashboard that's subtly wrong is worse than none — people stop trusting it. Watch for the usual traps:

  • Currency and partial periods. Decide whether the current month is partial-to-date or excluded, and label it. A half-finished month next to full ones looks like a crash.
  • Duplicate deals. CRM exports often double-count split opportunities. Check your row count against the CRM's own total before you publish.
  • Refresh cadence. If you re-export the CSV nightly, the data is only as fresh as that export. State the "data as of" date on the page so nobody assumes it's live.

For performance, prefer Import mode (the default) for a CRM-sized dataset — it's fast and fully featured. Keep cardinality low (drop columns you don't use, like internal IDs and free-text notes), and lean on measures rather than calculated columns where you can.

When you're ready to share, remember the licensing split: you can build and view everything for free in Power BI Desktop on Windows. Publishing to the Power BI Service so colleagues can view it online requires a paid license — Power BI Pro is roughly $14 per user per month at the time of writing — or a Microsoft Fabric capacity. For more on the modeling foundation, see our guides on star schemas for beginners and time intelligence in DAX.

Don't want to build it yourself?

If you'd rather skip the modeling and DAX, that's exactly what Instant PowerBI does. Export your deals from your CRM — Salesforce, HubSpot, Zoho, Dynamics, or a pipeline report in Excel — and send it over. You get back a finished, branded sales dashboard built on a proper star schema, with the revenue, pipeline, win-rate, and quota-attainment measures already wired up. It opens in free Power BI Desktop, so you own the file and can keep editing it. Send us your data and get your report back.

Frequently asked questions

What metrics should a sales dashboard in Power BI include?

Lead with the numbers leadership acts on: closed revenue (with month-to-date and year-to-date), quota attainment by rep, win rate, average deal size, and sales cycle length. Add open pipeline and weighted pipeline so the team can see what's coming. Then provide breakdowns by rep, region, product, and stage so a single bad number can be traced to its source.

How do you calculate year-over-year (YoY) growth in Power BI?

Use a marked Date table and the time-intelligence function SAMEPERIODLASTYEAR. Define a prior-year measure like Revenue PY = CALCULATE([Won Revenue], SAMEPERIODLASTYEAR('Date'[Date])), then compute growth as DIVIDE([Won Revenue] - [Revenue PY], [Revenue PY]). Format it as a percentage and use DIVIDE so a zero or blank prior-year value returns blank instead of an error.

Can I build a sales dashboard from a CRM CSV export?

Yes. A CRM export (from Salesforce, HubSpot, Zoho, Dynamics, or a pipeline report) is one of the most common Power BI sources. Import the CSV or Excel file through Power Query, set correct data types, split it into a deals fact table plus dimension tables for reps, accounts, and dates, then build a star schema. Quotas and targets usually come from a separate spreadsheet you load alongside it.

Do I need a paid Power BI license to build a sales dashboard?

No. You build and view reports for free in Power BI Desktop on Windows. A paid license (Power BI Pro is roughly $14 per user per month at the time of writing) is only required to publish to the Power BI Service and share reports online with colleagues. You can design the entire dashboard, write all the DAX, and review it locally without paying anything.

Build Power BI reports for a living? Do this part in minutes.

Studio turns a data export and a sentence into a valid .pbip project — TMDL model, PBIR report pages, DAX measures, branded theme. You keep the judgment calls; the clicking is done.

See Studio →