Power BI Template Specification¶
Complete instructions for manually creating the ComplianceDashboard.pbit Power BI template file using Power BI Desktop.
Overview¶
The Compliance Dashboard Power BI template (.pbit file) must be created manually using Power BI Desktop GUI, as template creation cannot be fully automated. This document provides step-by-step instructions to build the template from scratch.
Template Purpose: - Provides parameterized Dataverse connection for multi-tenant deployment - Includes pre-configured data model with relationships and DAX measures - Contains all 5 dashboard pages with visuals and formatting - Enables customers to deploy without Power BI development skills
Time to Create: Approximately 2-3 hours for first-time creation
Prerequisites¶
- Power BI Desktop (latest version) - Download here
- Access to Dataverse environment with deployed Compliance Dashboard tables
- Sample data loaded (recommended for testing visuals)
- Familiarity with Power BI Desktop interface
Step 1: Create New Report¶
- Open Power BI Desktop
- Click File > New to create blank report
- Save immediately as
ComplianceDashboard.pbix(working file)
Step 2: Configure Parameters¶
Parameters allow customers to enter their own Dataverse environment URL and tenant ID at deployment time.
- Click Home > Transform data > Manage Parameters
- Click New Parameter
Parameter 1: DataverseEnvironmentUrl¶
| Setting | Value |
|---|---|
| Name | DataverseEnvironmentUrl |
| Description | Your Dataverse environment URL (e.g., https://example.crm.dynamics.com) |
| Required | Yes (checked) |
| Type | Text |
| Suggested Values | Any value |
| Default value | https://your-org.crm.dynamics.com |
| Current value | (use your test environment URL) |
- Click OK
Parameter 2: TenantId¶
- Click New Parameter again
| Setting | Value |
|---|---|
| Name | TenantId |
| Description | Your Microsoft Entra ID tenant ID (GUID format) |
| Required | Yes (checked) |
| Type | Text |
| Suggested Values | Any value |
| Default value | 12345678-1234-1234-1234-123456789abc |
| Current value | (use your actual tenant ID for testing) |
- Click OK
- Click Close to exit parameter manager
Step 3: Connect to Dataverse¶
Add Dataverse Data Source¶
- Click Home > Get Data > More
- Search for "Dataverse"
- Select Dataverse
- Click Connect
Configure Connection¶
- In the "Server URL" field, delete the placeholder
- Click fx button next to the field to use a formula
- Enter:
DataverseEnvironmentUrl - Click OK
- Select Import mode (not DirectQuery)
- Click OK
Authenticate¶
- Sign in with organizational account
- Select Organizational account tab
- Click Sign in
- Complete authentication
- Click Connect
Select Tables¶
In the Navigator window, select these tables (check the box next to each):
-
fsi_controlmaster -
fsi_controlassessment -
fsi_compliancescore -
fsi_complianceexception -
fsi_complianceevidence
Do not select other tables (keeps model lightweight)
Click Load (not Transform Data)
Rename Tables¶
In the Data pane on the right, right-click each table and select Rename:
| Original Name | New Name |
|---|---|
fsi_controlmaster |
ControlMaster |
fsi_controlassessment |
ControlAssessment |
fsi_compliancescore |
ComplianceScore |
fsi_complianceexception |
ComplianceException |
fsi_complianceevidence |
ComplianceEvidence |
Step 4: Create Date Table¶
A date table is required for time intelligence functions.
- Click Modeling tab > New Table
- In the formula bar, enter:
DateTable =
ADDCOLUMNS(
CALENDAR(DATE(2025, 1, 1), DATE(2027, 12, 31)),
"Year", YEAR([Date]),
"Month", MONTH([Date]),
"MonthName", FORMAT([Date], "MMMM"),
"Quarter", "Q" & QUARTER([Date]),
"QuarterName", "Q" & QUARTER([Date]) & " " & YEAR([Date]),
"WeekNum", WEEKNUM([Date]),
"DayOfWeek", WEEKDAY([Date]),
"DayName", FORMAT([Date], "dddd"),
"IsCurrentMonth", IF(
MONTH([Date]) = MONTH(TODAY()) && YEAR([Date]) = YEAR(TODAY()),
TRUE,
FALSE
),
"IsCurrentYear", IF(YEAR([Date]) = YEAR(TODAY()), TRUE, FALSE)
)
- Press Enter
- Verify table appears in Data pane
Mark as Date Table¶
- Click Modeling tab
- Select DateTable in Data pane
- Click Mark as date table > Mark as date table
- In dialog, select Date column
- Click OK
Step 5: Configure Relationships¶
View Relationship Diagram¶
- Click Model view (icon on left sidebar)
- Verify tables appear in diagram
- Drag tables to organize visually
Create Relationships¶
Power BI may auto-detect some relationships. Verify and create the following:
Relationship 1: DateTable to ComplianceScore¶
- Drag
DateTable[Date]toComplianceScore[fsi_scoredate] - Verify relationship settings:
- Cardinality: One to many (1:*)
- Cross filter direction: Single
- Make this relationship active: Checked
- Click OK
Relationship 2: ControlMaster to ControlAssessment¶
- Drag
ControlMaster[fsi_controlmasterid]toControlAssessment[_fsi_controlmasterid_value](Lookup columns are imported by the Dataverse connector as_<schemaname>_valueGUID columns on the child side.) - Verify relationship settings:
- Cardinality: One to many (1:*)
- Cross filter direction: Single
- Make this relationship active: Checked
- Click OK
Relationship 3: ControlAssessment to ComplianceException¶
- Drag
ControlAssessment[fsi_controlassessmentid]toComplianceException[_fsi_controlassessmentid_value] - Verify relationship settings:
- Cardinality: One to many (1:*)
- Cross filter direction: Single
- Make this relationship active: Checked
- Click OK
Relationship 4: ControlAssessment to ComplianceEvidence¶
- Drag
ControlAssessment[fsi_controlassessmentid]toComplianceEvidence[_fsi_controlassessmentid_value] - Verify relationship settings:
- Cardinality: One to many (1:*)
- Cross filter direction: Single
- Make this relationship active: Checked
- Click OK
Step 6: Create DAX Measures¶
All measures should be created in a single Measures table for organization.
Create Measures Table¶
- Click Home > Enter Data
- Delete default columns (click X on column headers)
- Name table:
Measures - Click Load
Add Measures¶
For each measure below, select the Measures table in Data pane, then: 1. Click Modeling > New Measure 2. Paste the DAX code 3. Press Enter
See dax-measures.md for complete measure library. Key measures to create:
Overall Score¶
Overall Score =
VAR LatestDate = MAX(ComplianceScore[fsi_scoredate])
RETURN
CALCULATE(
AVERAGE(ComplianceScore[fsi_overallscore]),
ComplianceScore[fsi_scoredate] = LatestDate
)
Pillar Scores¶
Pillar 1 Score =
VAR LatestDate = MAX(ComplianceScore[fsi_scoredate])
RETURN
CALCULATE(
AVERAGE(ComplianceScore[fsi_pillar1score]),
ComplianceScore[fsi_scoredate] = LatestDate
)
Pillar 2 Score =
VAR LatestDate = MAX(ComplianceScore[fsi_scoredate])
RETURN
CALCULATE(
AVERAGE(ComplianceScore[fsi_pillar2score]),
ComplianceScore[fsi_scoredate] = LatestDate
)
Pillar 3 Score =
VAR LatestDate = MAX(ComplianceScore[fsi_scoredate])
RETURN
CALCULATE(
AVERAGE(ComplianceScore[fsi_pillar3score]),
ComplianceScore[fsi_scoredate] = LatestDate
)
Pillar 4 Score =
VAR LatestDate = MAX(ComplianceScore[fsi_scoredate])
RETURN
CALCULATE(
AVERAGE(ComplianceScore[fsi_pillar4score]),
ComplianceScore[fsi_scoredate] = LatestDate
)
Score Trend Measures¶
Score Change 30D =
VAR CurrentScore = [Overall Score]
VAR PriorScore =
CALCULATE(
AVERAGE(ComplianceScore[fsi_overallscore]),
DATESINPERIOD(
DateTable[Date],
MAX(ComplianceScore[fsi_scoredate]) - 30,
1,
DAY
)
)
RETURN
CurrentScore - PriorScore
Score Trend Direction =
VAR Change = [Score Change 30D]
RETURN
SWITCH(
TRUE(),
Change > 2, "Improving",
Change < -2, "Declining",
"Stable"
)
Control Status Measures¶
Important: The naive
CALCULATE(COUNTROWS(ControlAssessment), ...)form below counts every historical assessment, which inflates results when assessments accumulate over time (90 days × N zones per control). For accurate "current state" counts, use theLatestAssessmentspattern in DAX Measures which filters to the most recent assessment per control. The version below is provided only as a quick smoke test against fresh sample data.
Total Controls = COUNTROWS(ControlMaster)
// See dax-measures.md for the production-quality "latest assessment per control" version of these three measures.
Compliant Controls =
CALCULATE(
COUNTROWS(ControlAssessment),
ControlAssessment[fsi_status] = 1
)
Partial Controls =
CALCULATE(
COUNTROWS(ControlAssessment),
ControlAssessment[fsi_status] = 2
)
Non-Compliant Controls =
CALCULATE(
COUNTROWS(ControlAssessment),
ControlAssessment[fsi_status] = 3
)
Exception Measures¶
Open Exceptions =
CALCULATE(
COUNTROWS(ComplianceException),
ComplianceException[fsi_exceptionstatus] IN {1, 2, 3}
)
Critical Exceptions =
CALCULATE(
COUNTROWS(ComplianceException),
ComplianceException[fsi_severity] = 1,
ComplianceException[fsi_exceptionstatus] IN {1, 2, 3}
)
SLA Compliance % =
VAR OnTrack =
CALCULATE(
COUNTROWS(ComplianceException),
ComplianceException[fsi_slastatus] = 1,
ComplianceException[fsi_exceptionstatus] IN {1, 2, 3}
)
VAR Total = [Open Exceptions]
RETURN
DIVIDE(OnTrack, Total, 1)
Note: Create all measures from dax-measures.md for full functionality. The above are minimum required measures.
Step 7: Create Report Pages¶
Switch to Report view (icon on left sidebar).
Page 1: Executive Summary¶
- Rename page: Right-click Page 1 > Rename >
Executive Summary
Visual 1: Overall Score Card¶
- Click Visualizations pane > Card visual
- Drag to top-left corner, resize to ~300x200px
- Add field: Drag
[Overall Score]from Measures to Fields - Format:
- Click Format (paint roller icon)
- Callout value > Font size:
48 - Callout value > Color:
#0078D4(blue) - Category label > Text:
Overall Compliance Score - Category label > Font size:
14
Visual 2: Score Trend Line Chart¶
- Add Line chart visual
- Position: Top-center, ~500x200px
- Fields:
- X-axis:
DateTable[Date] - Y-axis:
ComplianceScore[fsi_overallscore] - Format:
- X-axis > Type:
Continuous - Y-axis > Range:
0to100 - Data labels: Off
- Title > Text:
30-Day Compliance Trend
Visual 3: Pillar Scores Column Chart¶
- Add Clustered column chart visual
- Position: Top-right, ~400x200px
- Fields:
- X-axis:
PillarDimension[PillarName](thePillarDimensionDATATABLEis defined in DAX Measures § Helper Tables) - Y-axis:
[Pillar 1 Score],[Pillar 2 Score],[Pillar 3 Score],[Pillar 4 Score] - Format:
- Data colors: Blue gradient
- Title > Text:
Compliance by Pillar
Visual 4: Exception Count Card¶
- Add Card visual
- Position: Middle-left, ~250x150px
- Field:
[Open Exceptions] - Format:
- Callout value > Font size:
36 - Callout value > Color:
#D13438(red) - Category label > Text:
Open Exceptions
Visual 5: SLA Status Stacked Bar Chart¶
- Add Stacked bar chart visual
- Position: Middle-center, ~400x150px
- Fields:
- Axis:
ComplianceException[fsi_slastatus]exposes the integer option-set value; for friendly labels (On Track / At Risk / Breached) bind to the connector's*_labelalias column or join to a status dimension table - Values:
COUNTROWS(ComplianceException) - Format:
- Data colors: Green (On Track), Yellow (At Risk), Red (Breached)
- Title > Text:
Exception SLA Status
Visual 6: Zone Distribution Donut Chart¶
- Add Donut chart visual
- Position: Bottom-right, ~300x250px
- Fields:
- Legend:
ControlAssessment[fsi_zone] - Values:
COUNTROWS(ControlAssessment) - Format:
- Detail labels: Percentage
- Title > Text:
Assessment Distribution by Zone
Page 2: Pillar Overview¶
- Add new page, rename to
Pillar Overview
Visual 1: Pillar Score Cards (Multi-row card)¶
- Add Multi-row card visual
- Position: Left side, ~300x400px
- Fields:
- Add
[Pillar 1 Score],[Pillar 2 Score],[Pillar 3 Score],[Pillar 4 Score] - Format:
- Card title > Text:
Pillar Scores - Data labels > Font size:
24
Visual 2: Control Status Matrix¶
- Add Matrix visual
- Position: Center, ~600x400px
- Fields:
- Rows:
ControlMaster[fsi_pillar] - Columns:
ControlAssessment[fsi_status] - Values:
COUNTROWS(ControlAssessment) - Format:
- Conditional formatting on Values:
- Apply color scale: White (0) to Green (max)
- Title > Text:
Controls by Pillar and Status
Visual 3: Pillar Trend Line Chart¶
- Add Line chart visual
- Position: Top-right, ~400x300px
- Fields:
- X-axis:
DateTable[Date] - Y-axis:
[Pillar 1 Score],[Pillar 2 Score],[Pillar 3 Score],[Pillar 4 Score] - Legend: Will auto-populate with measure names
- Format:
- X-axis > Type:
Continuous - Y-axis > Range:
0to100 - Title > Text:
Pillar Trends Over Time
Visual 4: Non-Compliant Controls Table¶
- Add Table visual
- Position: Bottom, ~800x200px
- Fields:
ControlMaster[fsi_controlid]ControlMaster[fsi_name]ControlAssessment[fsi_status]- Filter:
ControlAssessment[fsi_status]= 3 (Non-Compliant) - Format:
- Title > Text:
Non-Compliant Controls
Page 3: Control Details¶
- Add new page, rename to
Control Details
Visual 1: Control List Table¶
- Add Table visual
- Position: Left side, ~500x600px
- Fields:
ControlMaster[fsi_controlid]ControlMaster[fsi_name]ControlMaster[fsi_pillar]ControlAssessment[fsi_status]ControlAssessment[fsi_zone]ControlAssessment[fsi_assessmentdate]- Format:
- Conditional formatting on
fsi_status:- Apply background color rules
- Title > Text:
Control Inventory
Visual 2: Assessment History Line Chart¶
- Add Line chart visual
- Position: Top-right, ~500x300px
- Fields:
- X-axis:
ControlAssessment[fsi_assessmentdate] - Y-axis:
ControlAssessment[fsi_score] - Format:
- Y-axis > Range:
0to100 - Title > Text:
Selected Control History - Enable Drill-through: from Control List table
Visual 3: Evidence List Table¶
- Add Table visual
- Position: Bottom-right, ~500x250px
- Fields:
ComplianceEvidence[fsi_name]ComplianceEvidence[fsi_evidencetype]ComplianceEvidence[fsi_collecteddate]ComplianceEvidence[fsi_collectedby]- Format:
- Title > Text:
Evidence Items
Visual 4: Regulatory Tags Slicer¶
- Add Slicer visual
- Position: Top-left, ~200x300px
- Field:
ControlMaster[fsi_regulatoryreference] - Format:
- Slicer settings > Style:
List - Title > Text:
Filter by Regulation
Page 4: Exception Tracker¶
- Add new page, rename to
Exception Tracker
Visual 1: Open Exceptions Card¶
- Add Card visual
- Position: Top-left, ~200x150px
- Field:
[Open Exceptions] - Format:
- Callout value > Font size:
48 - Category label > Text:
Open Exceptions
Visual 2: SLA Distribution Pie Chart¶
- Add Pie chart visual
- Position: Top-center, ~300x300px
- Fields:
- Legend:
ComplianceException[fsi_slastatus] - Values:
COUNTROWS(ComplianceException) - Format:
- Data colors: Green (On Track), Yellow (At Risk), Red (Breached)
- Detail labels: Category and percentage
- Title > Text:
SLA Status Distribution
Visual 3: Exception Table¶
- Add Table visual
- Position: Center, ~900x400px
- Fields:
ComplianceException[fsi_name]ComplianceException[fsi_severity]ComplianceException[fsi_exceptionstatus]ComplianceException[fsi_owner]ComplianceException[fsi_daysopen]ComplianceException[fsi_targetdate]ComplianceException[fsi_slastatus]- Format:
- Conditional formatting on
fsi_slastatuscolumn - Title > Text:
Exception Details
Visual 4: Age Distribution Histogram¶
- Add Column chart visual
- Position: Bottom-left, ~400x250px
- Fields:
- X-axis:
ComplianceException[fsi_daysopen](binned) - Y-axis:
COUNTROWS(ComplianceException) - Format:
- X-axis > Type:
Continuous - Title > Text:
Days Open Distribution
Visual 5: Owner Workload Bar Chart¶
- Add Bar chart visual
- Position: Bottom-right, ~400x250px
- Fields:
- Axis:
ComplianceException[fsi_owner] - Values:
COUNTROWS(ComplianceException) - Format:
- Data labels: On
- Title > Text:
Exceptions per Owner
Page 5: Trend Analysis¶
- Add new page, rename to
Trend Analysis
Visual 1: Overall Score Trend with Forecast¶
- Add Line chart visual
- Position: Top, ~1000x350px
- Fields:
- X-axis:
DateTable[Date] - Y-axis:
ComplianceScore[fsi_overallscore] - Enable Analytics:
- Click visual, expand Analytics pane (graph icon)
- Click Forecast > Add
- Set forecast length:
30days - Confidence interval:
95% - Format:
- X-axis > Type:
Continuous - Y-axis > Range:
0to100 - Title > Text:
90-Day Compliance Trend with 30-Day Forecast
Visual 2: Pillar Trends Multi-Line Chart¶
- Add Line chart visual
- Position: Middle-left, ~500x300px
- Fields:
- X-axis:
DateTable[Date] - Y-axis:
[Pillar 1 Score],[Pillar 2 Score],[Pillar 3 Score],[Pillar 4 Score] - Legend: Auto-populated with pillar names
- Format:
- Data colors: Assign unique color per pillar
- Title > Text:
Pillar Comparison Over Time
Visual 3: Month-over-Month Change KPI¶
- Add KPI visual
- Position: Top-right, ~300x200px
- Fields:
- Indicator:
[Overall Score] - Trend axis:
DateTable[MonthName] - Target goals:
[Overall Score](previous month) - Format:
- Trend axis > Direction:
High is good - Title > Text:
Month-over-Month Change
Visual 4: Control Status Changes Waterfall¶
- Add Waterfall chart visual
- Position: Bottom, ~800x300px
- Fields:
- Category: Create measure for status transitions
- Y-axis: Count of controls changing status
- Format:
- Data colors: Increase (Green), Decrease (Red)
- Title > Text:
Control Status Transitions
Step 8: Apply Theme¶
Option A: Use Built-in Theme¶
- Click View > Themes
- Select a neutral professional theme:
- Recommended: "Executive" or "Accessible"
- Theme applies to all pages
Option B: Create Custom Theme (Advanced)¶
- Create JSON theme file:
{
"name": "FSI Compliance Dashboard",
"dataColors": [
"#0078D4",
"#107C10",
"#FFB900",
"#D13438",
"#8764B8",
"#00B7C3"
],
"background": "#FFFFFF",
"foreground": "#252423",
"tableAccent": "#0078D4",
"good": "#107C10",
"neutral": "#FFB900",
"bad": "#D13438"
}
- Save as
ComplianceDashboardTheme.json - In Power BI Desktop: View > Themes > Browse for themes
- Select JSON file
- Click Open
Step 9: Configure Row-Level Security (Documentation Only)¶
Important: RLS roles are NOT pre-configured in the template. Customers must create roles matching their organizational structure after deployment.
Example RLS Roles (for customer reference)¶
Include these examples in template documentation, but do NOT implement:
Example Role 1: Zone Viewer (pseudocode — replace with your logic)¶
Restricts users to see only data from specific zones.
// PSEUDOCODE — VALUE(USERPRINCIPALNAME()) is invalid (UPN is not numeric).
// Replace with a join to a UserZoneMapping table you load into the model, e.g.:
// [fsi_zone] IN
// CALCULATETABLE(VALUES(UserZoneMapping[Zone]),
// UserZoneMapping[Upn] = USERPRINCIPALNAME())
[fsi_zone] = VALUE(USERPRINCIPALNAME())
Note to customers: Replace with actual zone assignment logic from your identity system — typically a Dataverse or SharePoint mapping table loaded into the report and joined by UPN.
Example Role 2: Pillar Owner (pseudocode)¶
Restricts users to see only data from specific pillars.
// PSEUDOCODE — illustrative only. The IF inside IN returns BLANK on the false
// branch which collapses the IN list. In production, replace with a UPN-to-pillar
// mapping table joined into the model.
[fsi_pillar] IN {
IF(USERPRINCIPALNAME() = "security@example.com", 1),
IF(USERPRINCIPALNAME() = "management@example.com", 2),
IF(USERPRINCIPALNAME() = "reporting@example.com", 3),
IF(USERPRINCIPALNAME() = "sharepoint@example.com", 4)
}
Note to customers: Customize based on your role assignment approach.
RLS Implementation Steps (for customers)¶
Provide these instructions in the template:
- Open report in Power BI Desktop
- Click Modeling > Manage roles
- Create roles with DAX filters matching your org structure
- Test roles using View as feature
- Publish report to Power BI Service
- Assign users to roles in workspace settings
Step 10: Export Power BI Template¶
Save Working Copy First¶
- Click File > Save
- Save as
ComplianceDashboard.pbix(working copy for testing)
Export as Template¶
- Click File > Export > Power BI template
- Dialog appears: "Create Power BI Template"
- Enter description:
Compliance Dashboard for FSI Agent Governance Framework v1.0.3 Provides aggregated compliance reporting across the controls loaded into Dataverse, with zone-based filtering. The shipped sample dataset contains 62 controls; load the validated 78-control framework baseline before describing the dashboard as full-framework coverage. Required parameters: - DataverseEnvironmentUrl: Your Dataverse environment URL - TenantId: Your Microsoft Entra ID tenant ID For deployment instructions, see: docs/deployment-checklist.md - Check Include sample data in the template:
No(unchecked) - Helps keep the template lightweight
- Customers connect to their own environment
- Click OK
- Save as:
ComplianceDashboard.pbit - Location:
/templates/directory in solution repository
Verify Template Export¶
- Close Power BI Desktop
- Navigate to
/templates/directory - Verify
ComplianceDashboard.pbitfile exists - Check file size (should be <5 MB without sample data)
Test Template Deployment¶
- Open
ComplianceDashboard.pbitin Power BI Desktop - Template prompts for parameters
- Enter test environment URL and tenant ID
- Verify data loads successfully
- Verify all 5 pages render correctly
- Verify measures calculate properly
Validation Checklist¶
Before finalizing template, verify:
- Both parameters (DataverseEnvironmentUrl, TenantId) are configured
- All 5 Dataverse tables connected and renamed
- DateTable created with correct DAX
- DateTable marked as date table
- All 4 relationships created and active
- Measures table created with all DAX measures
- All 5 report pages created and named correctly
- Each page has all required visuals
- Theme applied (neutral professional colors)
- RLS documented but NOT implemented
- Template exports successfully as .pbit
- Template file size < 5 MB
- Test deployment loads data successfully
- All visuals render without errors
Troubleshooting Template Creation¶
| Issue | Cause | Resolution |
|---|---|---|
| Parameter not prompting | Parameter not used in connection | Verify connection uses DataverseEnvironmentUrl formula |
| Tables won't load | Authentication failed | Re-authenticate with valid organizational account |
| Relationships auto-created wrong | Power BI guessed incorrectly | Delete auto relationships, create manually |
| Measures show errors | Missing relationship or table | Verify DateTable relationship to ComplianceScore exists |
| Theme won't apply | JSON syntax error | Validate JSON with linter |
| Export fails | Sample data too large | Clear data cache before export |
| Template prompts for credentials | Data source settings stored | Remove saved credentials before export |
Maintenance Notes¶
When to Update Template¶
Update the .pbit template when:
- New DAX measures added to measure library
- Dashboard page layout significantly improved
- New visuals added that provide value
- Dataverse schema changes (new tables/columns)
Version Control¶
- Store both
.pbix(working file) and.pbit(template) in repository - Tag template releases:
compliance-dashboard-v1.0.3 - Document template changes in CHANGELOG.md
Additional Resources¶
- DAX Measure Library: See dax-measures.md for complete measure definitions
- Power BI Setup Guide: See power-bi-setup.md for deployment instructions
- Dataverse Schema: See dataverse-schema.md for table structure
- Deployment Checklist: See deployment-checklist.md for validation steps
Compliance Dashboard v1.0.3 - Power BI Template Specification