Build a Profit and Loss Report

Build a reconciled Power BI profit and loss report from ledger exports.

Introduction

30 Second Summary

A list of account activity can be accurate while still hiding whether the business made money. Turning that list into a clear monthly story often takes more effort than producing the export.

In this project, you will turn a safe accounting export into a one-page interactive P&L report in Power BI Desktop. You will create reusable statement logic that traces each result back to the source.

What You'll Build

Your finished report lets you choose a month while the P&L matrix, profit cards, and trend update to match that period.

By the end of this project, you'll have:

  • A refreshable data workflow built with Power Query that turns another export with the same structure into an updated ledger.
  • An interactive P&L view that expands from statement lines to individual accounts. Its profit cards and monthly trend respond to the same date filter.
  • A reconciled report that exposes missing account mappings. You can compare each statement line with the source export.
  • Secret Mission: Add gross and operating margin percentages, then highlight negative operating margin.

Are there any prerequisites?

You'll need a Windows computer with Power BI Desktop installed. Your working accounting export needs a transaction date, account code, account name, plus either debit and credit columns or one signed amount column.

Before We Start

Before the hands-on work begins, lock in the entity and reporting period covered by your safe accounting export. This commitment keeps your simplified operating P&L focused and makes every reported number traceable to its source.

Prepare a Safe Local Workspace

Financial exports stay useful only when every number can be traced to its source. This step protects that trail before Power BI Desktop touches the data.

A masked one-to-three-month slice keeps private details outside the report. You will place that slice beside a saved blank report in one local project folder.

In this step, get ready to:
  • Create a local project folder for the report files.
  • Mask and scope the working accounting export.
  • Save a blank Power BI Desktop report in the project folder.
Create the local project folder

Accounting exports can include customer names, invoice references, or transaction descriptions that do not belong in a management P&L. Your project folder will hold only the working data needed for this report.

  • Press Windows key+E to open File Explorer.
  • Navigate to the location containing the safe working copy from earlier.
  • Create a new folder by pressing Ctrl+Shift+N.
  • Type Financial Statement Dashboard and press Enter.
  • Select the safe working copy of the accounting export.
  • Copy the selected file by pressing Ctrl+C.
  • Open the new Financial Statement Dashboard folder.
  • Paste the working export by pressing Ctrl+V.

You should see the copied export inside the Financial Statement Dashboard folder. Good. Your report now has a separate working file that you can prepare safely.

Mask and scope the working export

Deleting fields can feel risky. Your source export stays untouched because every edit happens in the copied working file.

  • Double-click the copied export inside the Financial Statement Dashboard folder to open it in its spreadsheet application.
  • Keep only rows from the one-to-three-month reporting period you identified earlier.
  • Keep only rows associated with active operating P&L accounts.
  • Filter the account code field to confirm the scoped file contains roughly 20 or fewer active P&L accounts.
  • Keep the columns that contain the transaction date, account code, account name, and debit plus credit or one signed amount.
  • Remove any other columns containing unnecessary names, references, or descriptions.
  • Mask sensitive values that remain in a required column with neutral labels.
  • Save the working export in the Financial Statement Dashboard folder.

That is the data boundary in place. The working export now covers the chosen period with a manageable set of P&L accounts.

Save the blank Power BI report

A .pbix file stores your local Power BI report. Saving it now anchors every later model change to the protected project folder.

  • Press the Windows key to open Windows search.
  • Type Power BI Desktop and press Enter to open it.

You will see an empty report canvas when Power BI Desktop is ready.

  • Select File in the top menu.
  • Select Save As.
  • Browse to the Financial Statement Dashboard folder.
  • Enter Financial Statement Dashboard.pbix as the file name.
  • Select Save.

Why Power BI Desktop?

Excel can create interactive summaries from accounting data. It remains a familiar option for spreadsheet reporting.

Power BI Desktop keeps transformation and modeling in the same application. It also gives your report dedicated interactive visuals.

Before you check, what two files do you expect to find in the project folder?

  • Check the Power BI Desktop title bar for Financial Statement Dashboard.pbix.
  • Switch back to the File Explorer window from earlier.
  • Confirm the Financial Statement Dashboard folder contains the saved report and the masked working export.
  • Return to Power BI Desktop.

You will see Financial Statement Dashboard.pbix open as a blank local report. The project folder will contain that report beside the scoped working export.

Can't find the saved report?

  • Repeat the File and Save As steps if the title bar does not show Financial Statement Dashboard.pbix.
  • Check the selected folder in Save As if the report appears somewhere else.

Help me locate my saved Power BI report.

Your protected workspace is ready. Next, you will load the working export into Power Query and turn the raw ledger into its first monthly statement.

Normalize the Ledger Data

Your safe accounting export is ready beside the blank report in Power BI Desktop. The next challenge is turning source-specific columns into one ledger shape that every visual can read.

A quick account summary can look useful at first glance. This step lets the raw source prove whether it already behaves like a management P&L.

In this step, get ready to:
  • Import the working export through Power Query.
  • Normalize the core ledger columns into consistent names plus data types.
  • Build a first monthly account summary in a Matrix visual.
Import the working export

Power Query creates a repeatable transformation layer between the source export and the report. Your original working copy remains in the project folder while the report receives a structured preview.

Excel export

  • Select Get Data from the Home ribbon.
  • Select Excel.
  • Choose the working export from your local project folder.
  • Select the worksheet or table containing the scoped ledger data in Navigator.
  • Open the selected data in Power Query Editor by selecting Transform Data.

CSV export

  • Select Get Data from the Home ribbon.
  • Select Text/CSV.
  • Choose the working export from your local project folder.
  • Open the selected data in Power Query Editor by selecting Transform Data.

You should see rows from the working export in Power Query Editor. The preview confirms that Power BI can read the local source.

Seeing the wrong data preview?

  • Return to Navigator if the preview shows the wrong worksheet.
  • Select the worksheet or table containing the scoped P&L transactions.
  • Confirm that the selected file is the masked working copy from your project folder.

If the expected rows are still missing, help me identify the correct source inside my accounting export.

Normalize the core ledger columns

Consistent column names give every later calculation a stable target. Data types also tell Power BI which values represent dates or numbers.

  • Rename the imported query to Ledger in the Queries pane.
  • Rename the transaction date field to Date.
  • Rename the account code field to AccountCode.
  • Rename the account name field to AccountName.
  • Set Date to the Date data type using the type icon beside its column header.

The preview should now show Date, AccountCode, and AccountName as column headers. These names form the common structure for either balance format.

Separate debit and credit fields

Separate debit and credit columns need one signed balance field. Subtracting credit from debit preserves the export's accounting sign convention.

  • Rename the debit field to Debit.
  • Rename the credit field to Credit.
  • Set Debit to a numeric data type.
  • Set Credit to a numeric data type.
  • Select Add Column on the Power Query Editor ribbon.
  • Select Custom Column.
  • Enter RawBalance in the New column name box.
  • Create the signed balance by entering this formula in the Custom column formula box:
[Debit] - [Credit]

What does this formula do?

  • The subtraction combines each transaction's debit value with its credit value.
  • The resulting RawBalance column becomes the common amount field used by the report.
  • Confirm that the dialog shows No syntax errors have been detected.
  • Select OK to create the custom column.
  • Set RawBalance to a numeric data type.

You should see one RawBalance value for every imported ledger row.

One signed amount field

A signed amount field already contains the row-level balance needed by the report. Giving it the common name keeps the rest of the model independent from the export's original labels.

  • Rename the existing signed amount field to RawBalance.
  • Set RawBalance to a numeric data type.

You should see the original signed values under the RawBalance header.

A month-start column gives every transaction in the same month one shared date. That common date becomes the monthly grouping field for the first report visual.

  • Select Add Column on the Power Query Editor ribbon.
  • Select Custom Column.
  • Enter MonthStart in the New column name box.
  • Create the monthly grouping field by entering this formula in the Custom column formula box:
Date.StartOfMonth([Date])

What does this formula do?

  • The formula reads each value from Date.
  • It returns the first date of that transaction's month in MonthStart.
  • Transactions from one month now share a consistent grouping value.
  • Confirm that the dialog shows No syntax errors have been detected.
  • Select OK to create the custom column.
  • Set MonthStart to the Date data type.
  • Load the normalized query into the report by selecting Close & Apply.

The report view returns after Power BI applies the transformations. Solid progress. Ledger now gives every visual a consistent set of fields.

  • Expand Ledger in the field list.
  • Confirm that Date, AccountCode, AccountName, RawBalance, and MonthStart are listed.

✔️ Ledger has all five fields

Your normalized table is loaded into the model. Each later visual can now use the same account, balance, and month fields.

ⓧ I'd like to double check the transformations

  • Confirm that the query name is Ledger.
  • Confirm that Date uses the Date data type.
  • Confirm that AccountCode identifies each ledger account.
  • Confirm that AccountName contains the readable account name.
  • Confirm that RawBalance is numeric.
  • Confirm that debit and credit exports calculate RawBalance with [Debit] - [Credit].
  • Confirm that signed amount exports use the renamed source amount as RawBalance.
  • Confirm that MonthStart uses Date.StartOfMonth([Date]) with the Date data type.

Missing a Ledger column?

  • Return to Power Query Editor with Transform Data.
  • Check the applied steps for the point where the missing column was renamed or created.
  • Confirm that the formula uses the exact source column names shown in the preview.
  • Select Close & Apply after correcting the transformation.

If the table still has the wrong columns, help me trace my Power Query transformations.

Build the first monthly matrix

A Matrix visual can summarize account balances across months with only three fields. This first version tests how much reporting meaning the raw ledger already contains.

Before you build the summary, do you think the source account order plus raw balance signs will already read like a finished P&L?

  • Select the Matrix visual in the Visualizations pane.
  • Drag Ledger[AccountName] into Rows.
  • Drag Ledger[MonthStart] into Columns.
  • Drag Ledger[RawBalance] into Values.

You'll see monthly balances split by account name. The rows follow the raw account structure while the values retain the source accounting signs.

Why does the matrix feel unfinished?

The matrix can group ledger rows without understanding their role in a financial statement. Account names alone provide no dependable statement hierarchy or presentation sign.

This shortfall is intentional. The raw summary has now exposed the exact reporting problem that the model needs to solve.

  • Select File in Power BI Desktop.
  • Select Save.

Your first visible statement slice is now saved in Financial Statement Dashboard.pbix. The report contains the imported Ledger table plus the naive monthly matrix.

Matrix not showing the expected monthly balances?

  • Confirm that Ledger[AccountName] is in Rows.
  • Confirm that Ledger[MonthStart] is in Columns.
  • Confirm that Ledger[RawBalance] is in Values.
  • Check that RawBalance uses a numeric data type if the matrix shows counts instead of balances.

If the visual still looks wrong, help me troubleshoot my naive Ledger matrix.

Your first matrix now responds to the normalized ledger. Next, you will add the business structure needed for readable rows plus dependable presentation signs.

Map Accounts and Correct Signs

The first Matrix visual in Power BI Desktop exposed two issues: the accounts have no business hierarchy. Their raw accounting signs are difficult to read.

A dimension table will classify each account into a financial statement line. A DAX measure will use a model relationship to apply the presentation sign.

In this step, get ready to:
  • Create an account mapping table with a statement line, display order, and sign rule for every account.
  • Connect the account mapping table to the Ledger table.
  • Replace the raw matrix with a sorted P&L hierarchy that uses corrected signs.
Create the account mapping table

The AccountMap table gives every unique account code a reporting category. It also stores the order and sign rule used by the P&L.

How the mapping fields work

  • The AccountCode field identifies each account. Every code must appear once in AccountMap.
  • The AccountName field supplies the readable account label for the hierarchy.
  • The StatementLine field classifies an account as Revenue, Cost of Sales, or Operating Expenses.
  • The StatementOrder field assigns 1 to Revenue. It assigns 2 to Cost of Sales. It assigns 3 to Operating Expenses.
  • The SignMultiplier field converts each raw account balance into its presentation sign.
  • Select Home on the Power BI Desktop ribbon.
  • Select Enter data.
  • Replace the generated column headers with the five mapping fields shown above.
  • Add one row for every unique Ledger[AccountCode] value.
  • Copy the matching Ledger[AccountName] value into each row.

You should now see one mapping row for every active P&L account. The account codes and names should match the Ledger table.

Choose the sign multiplier

When RawBalance is Debit minus Credit, revenue usually carries a negative raw balance. Set revenue accounts to -1.

Set cost and expense accounts to 1. For an existing signed amount, use 1 when the sign is presentation-ready. Use -1 when the sign needs to be flipped.

  • Classify every row using one of the three StatementLine values shown above.
  • Set each StatementOrder value according to its statement line.

You can now scan the mapping grid to confirm that every category has one consistent order value.

  • Set each SignMultiplier value using the source-sign rule above.
  • Name the table AccountMap.
  • Select Load.

You should see AccountMap in the field list with all five mapping columns. Good work. Your account classifications are now stored separately from the raw transactions.

Why enter the mapping manually?

This project has about 20 active P&L accounts, so Enter data keeps the first mapping small and visible. A larger chart of accounts belongs in a governed source file or database.

Connect AccountMap to Ledger

In a star schema, AccountMap acts as the dimension table. Ledger acts as the fact table that holds transaction values.

The relationship lets each account classification group and filter its matching Ledger rows. This keeps reporting logic separate from the imported export.

Why uniqueness matters

Each AccountMap[AccountCode] value must be unique because it sits on the one side of the relationship. Duplicate codes would give one Ledger account more than one possible classification.

  • Select Modeling on the ribbon.
  • Select Manage relationships.
  • Select New.
  • Configure Ledger[AccountCode] as the many side opposite AccountMap[AccountCode] as the one side.
  • Set the cardinality to Many to one (*:1).
  • Set the cross-filter direction to Single.
  • Keep the relationship active.
  • Select OK.

The relationship list should show an active connection between Ledger[AccountCode] and AccountMap[AccountCode].

Relationship not creating?

  • Confirm every account code appears only once in AccountMap.
  • Confirm Ledger[AccountCode] and AccountMap[AccountCode] use matching data types.
  • Remove any blank account-code row from AccountMap.

Help me fix my account relationship.

Create the signed measure and rebuild the matrix

The relationship makes each account's sign multiplier available while DAX scans the Ledger table. The new measure applies that multiplier before adding the rows together.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create Statement Amount by entering this formula:
Statement Amount =
SUMX(
    Ledger,
    Ledger[RawBalance] * RELATED(AccountMap[SignMultiplier])
)

What does this measure do?

  • The SUMX function evaluates the expression once for every row in Ledger.
  • The RELATED function retrieves the matching AccountMap[SignMultiplier] value through the relationship.
  • The multiplication converts each Ledger[RawBalance] value before the measure calculates the total.
  • Press Enter to commit the measure.
  • Confirm Statement Amount appears under Ledger in the field list.

Measure showing an error?

  • Confirm the relationship is active before using RELATED.
  • Confirm the mapping column is named exactly SignMultiplier.
  • Confirm every SignMultiplier value is numeric.

Help me debug the Statement Amount measure.

The statement lines also need a fixed business order. Sorting the label by StatementOrder keeps Revenue above costs and expenses.

  • Select AccountMap[StatementLine] in Report view.
  • Select Column tools.
  • Select Sort by Column.
  • Choose AccountMap[StatementOrder].

The corrected matrix combines the business hierarchy with the sign-adjusted measure. It replaces the raw account dump already on the report canvas.

  • Select the existing Matrix visual on the report canvas.
  • Replace the Rows field with AccountMap[StatementLine] followed by AccountMap[AccountName].
  • Keep Ledger[MonthStart] in Columns.
  • Replace Ledger[RawBalance] in Values with [Statement Amount].

Before you expand the rows, predict whether the hierarchy and account signs now match the mapping.

  • Expand the Matrix rows to the account level.
  • Compare one representative account from each statement line with its raw source sign.

You should see Revenue, Cost of Sales, and Operating Expenses in that order. Each representative account should show the presentation sign defined by its SignMultiplier.

That is the accounting model taking shape. Your matrix now reads like a P&L while preserving the raw Ledger values underneath.

✔️ My hierarchy and signs look correct

Your AccountMap, relationship, measure, and hierarchical Matrix are ready for the profit calculations.

ⓧ I'd like to double check the full code

Compare your measure with this exact definition:

Statement Amount =
SUMX(
    Ledger,
    Ledger[RawBalance] * RELATED(AccountMap[SignMultiplier])
)

What this measure confirms

This definition scans Ledger and applies the related account multiplier to every raw balance.

  • Confirm AccountMap contains one unique row per AccountCode.
  • Confirm the active relationship connects AccountMap[AccountCode] on the one side to Ledger[AccountCode] on the many side.
  • Confirm the relationship uses single-direction filtering from AccountMap to Ledger.
  • Confirm the Matrix uses AccountMap[StatementLine] and AccountMap[AccountName] in Rows.
  • Confirm the Matrix uses Ledger[MonthStart] in Columns.
  • Confirm the Matrix uses [Statement Amount] in Values.

Matrix still unordered or incorrectly signed?

  • Confirm AccountMap[StatementLine] is sorted by AccountMap[StatementOrder].
  • Confirm every Ledger account has a matching row in AccountMap.
  • Recheck SignMultiplier against one raw revenue account.
  • Recheck SignMultiplier against one raw cost account.

Help me trace an incorrect P&L sign or hierarchy.

Your statement hierarchy now groups accounts in business order with dependable presentation signs. Next up, you will turn those statement values into profit cards, a monthly trend, and an interactive date view.

Build Interactive Profit Insights

Your sign-corrected P&L matrix in Power BI Desktop now explains where money moved each month.

However, decision-makers need headline profit values. They also need a monthly view of performance.

Reusable DAX measures turn the validated statement amounts into management metrics. Interactive visuals make the reporting period easy to test.

In this step, get ready to:
  • Create a reusable DAX measure layer for the P&L.
  • Build KPI cards plus a monthly operating-profit trend.
  • Control the report period with a MonthStart slicer.
Create reusable profit measures

A measure recalculates within the current filter context. The date slicer later changes that context across the report page.

Why Reuse Statement Amount?

The existing [Statement Amount] measure already applies the account classifications. It also applies the presentation signs you validated earlier.

The new measures filter or combine that trusted result. Every visual can reuse the same financial logic.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create the Revenue measure by entering this formula:
Revenue =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Revenue"
)

How Does Revenue Work?

  • The measure begins with [Statement Amount] so the validated sign logic stays in effect.
  • The CALCULATE function evaluates that amount within a modified filter context.
  • The filter keeps accounts classified as Revenue in AccountMap[StatementLine].
  • Commit the measure by pressing Enter.
  • Confirm Revenue appears under Ledger in the field list.

Revenue Measure Missing?

  • Confirm you selected New measure from the Ledger table.
  • Check that the filter value matches Revenue in AccountMap[StatementLine].

Help me troubleshoot my Revenue measure.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create the Cost of Sales measure by entering this formula:
Cost of Sales =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Cost of Sales"
)

How Does Cost of Sales Work?

  • The measure reuses [Statement Amount] so cost balances retain their presentation signs.
  • The filter limits the result to accounts classified as Cost of Sales.
  • Commit the measure by pressing Enter.
  • Confirm Cost of Sales appears under Ledger in the field list.

Cost of Sales Measure Missing?

  • Check that the measure name is Cost of Sales.
  • Confirm the filter text matches the Cost of Sales classification in AccountMap.

Help me troubleshoot my Cost of Sales measure.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create the Operating Expenses measure by entering this formula:
Operating Expenses =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Operating Expenses"
)

How Do Operating Expenses Work?

  • The measure calculates the presentation value for the operating-expense statement line.
  • The Operating Expenses filter keeps the result aligned with the matrix hierarchy.
  • Commit the measure by pressing Enter.
  • Confirm Operating Expenses appears under Ledger in the field list.

Operating Expenses Measure Missing?

  • Check that the filter value is Operating Expenses.
  • Confirm the relevant accounts use the same statement-line value in AccountMap.

Help me troubleshoot my Operating Expenses measure.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create the Gross Profit measure by entering this formula:
Gross Profit =
[Revenue] - [Cost of Sales]

How Does Gross Profit Work?

The measure subtracts [Cost of Sales] from [Revenue]. Both inputs recalculate within the current report filters.

  • Commit the measure by pressing Enter.
  • Confirm Gross Profit appears under Ledger in the field list.

Gross Profit Measure Missing?

  • Confirm Revenue appears under Ledger.
  • Confirm Cost of Sales appears under Ledger.
  • Check that both measure references include square brackets.

Help me troubleshoot my Gross Profit measure.

  • Right-click Ledger in the field list.
  • Choose New measure.
  • Create the Operating Profit measure by entering this formula:
Operating Profit =
[Gross Profit] - [Operating Expenses]

How Does Operating Profit Work?

The measure subtracts [Operating Expenses] from [Gross Profit]. The result is the final headline value for this operating P&L.

  • Commit the measure by pressing Enter.
  • Confirm Operating Profit appears under Ledger in the field list.

Operating Profit Measure Missing?

  • Confirm Gross Profit appears under Ledger.
  • Confirm Operating Expenses appears under Ledger.
  • Check that the new measure is named Operating Profit.

Help me troubleshoot my Operating Profit measure.

✔️ Awesome, I've got everything!

Your reusable measure layer is complete. Confirm all six measures appear under Ledger before building the visuals.

ⓧ I'd like to double check the full code

  • Compare the complete measure layer with this reference:
Statement Amount =
SUMX(
    Ledger,
    Ledger[RawBalance] * RELATED(AccountMap[SignMultiplier])
)

Revenue =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Revenue"
)

Cost of Sales =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Cost of Sales"
)

Operating Expenses =
CALCULATE(
    [Statement Amount],
    AccountMap[StatementLine] = "Operating Expenses"
)

Gross Profit =
[Revenue] - [Cost of Sales]

Operating Profit =
[Gross Profit] - [Operating Expenses]

That is the calculation layer complete. Every report visual can now reuse the same validated financial logic.

Build the KPI view and trend

Headline values make the current result easy to scan. A monthly trend shows how operating profit changes over time.

  • Select an empty area of the report canvas.
  • Select the Card visual.

You should see an empty KPI card on the report canvas.

  • Drag [Revenue] into the Values field well.
  • Drag [Gross Profit] into the Values field well.

You should see the current Revenue value beside the current Gross Profit value.

  • Drag [Operating Profit] into the Values field well.

You should now see Revenue, Gross Profit, plus Operating Profit displayed together.

Card Values Missing?

  • Confirm the Card uses the three measures stored under Ledger.
  • Check the P&L matrix for values in the same reporting period.
  • Confirm each measure was committed with Enter.

Help me troubleshoot my KPI Card.

  • Select another empty area of the report canvas.
  • Select the line chart visual.

You should see an empty line chart on the report canvas.

  • Place Ledger[MonthStart] on the line chart's time axis.
  • Place [Operating Profit] in the line chart's value field.

You should see a monthly Operating Profit line across the dates in your working export.

What Does the Trend Show?

Each point calculates [Operating Profit] for one Ledger[MonthStart] value. The line makes month-to-month movement visible.

Trend Points Missing?

  • Confirm the time axis uses Ledger[MonthStart].
  • Confirm the value field uses [Operating Profit].
  • Check that MonthStart contains dates from the working export.

Help me troubleshoot my monthly trend.

Add the date slicer and test interactions

The slicer changes the reporting period for connected visuals. One selection can recalculate the complete P&L page.

  • Select an empty area of the report canvas.
  • Select the Slicer visual.

You should see an empty Slicer visual on the report canvas.

  • Add Ledger[MonthStart] to the slicer.

You should see the available reporting dates inside the slicer.

  • Select the MonthStart slicer.
  • Select the Format visual icon.
  • Select Visual.
  • Open Slicer settings.
  • Open Options.
  • Choose a suitable date style from the Style dropdown.

You should see the MonthStart dates displayed with the selected style.

  • Move the P&L matrix to the left side of the report page.
  • Move the KPI Card to the top-right area of the report page.

You should see the detailed statement beside the headline profit values.

  • Move the Operating Profit trend below the KPI Card.
  • Move the MonthStart slicer above the matrix.

You should see one readable page with a date filter, statement hierarchy, headline values, plus a monthly trend.

Before you change the date selection, which visuals do you expect to recalculate?

  • Change the reporting period in the MonthStart slicer.

You should see the matrix, Revenue card, Gross Profit card, Operating Profit card, plus monthly trend recalculate for the selected period.

That is the full interaction loop working. Your P&L now responds as one connected management report.

One Visual Not Responding?

  • Confirm the unresponsive visual is on the same report page as the MonthStart slicer.
  • Check that the slicer uses Ledger[MonthStart].
  • Confirm the affected visual uses fields or measures from the connected Ledger model.
  • Confirm the affected visual uses fields from the connected AccountMap model when needed.

Help me troubleshoot my slicer interactions.

Your interactive profit view is ready. Next, you will reconcile every statement line with the source export before treating the dashboard as finished.

Reconcile and Save the Report

Your one-page P&L now responds to the MonthStart slicer. Every visual moves with the selected reporting period.

A polished financial report is unsafe when an account is unmapped or signed incorrectly. In this step, reconciliation in Power BI Desktop helps you trace each statement line back to the source before the report becomes final.

In this step, get ready to:
  • Use a temporary reconciliation table to test the account mapping.
  • Compare each reporting month with filtered totals from the accounting export.
  • Finish the validated report as a readable saved file.
Build the reconciliation table

A temporary table places each raw balance beside its mapped statement line. This makes missing mappings or incorrect signs visible before they affect your final report.

  • Select an empty area of the report canvas.
  • Select the Table visual in the Visualizations pane.
  • Add Ledger[AccountCode] to the table.
  • Add Ledger[AccountName] to the table.
  • Add AccountMap[StatementLine] to the table.
  • Add Ledger[RawBalance] to the table.
  • Add [Statement Amount] to the table.

What does this table reveal?

  • A blank AccountMap[StatementLine] means the account code has no matching row in AccountMap.
  • A surprising difference between Ledger[RawBalance] and [Statement Amount] points to an incorrect SignMultiplier.
  • One account code assigned to multiple statement lines points to inconsistent mapping data.
  • Select the first month in the existing Ledger[MonthStart] slicer.
  • Scan AccountMap[StatementLine] for blank values.
  • Compare the raw balance with the statement amount for one Revenue account.
  • Repeat the sign comparison for one Cost of Sales account.
  • Repeat the sign comparison for one Operating Expenses account.
  • Check that every account code belongs to one statement line.

The mapping table is the source of your reporting logic. Any blank line or incorrect sign belongs in AccountMap.

If the temporary table exposes an issue, correct the entered mapping rows before continuing.

  • Select Transform data on the ribbon.
  • Select the AccountMap query in Power Query Editor.
  • Select the settings icon beside Source in the Applied Steps pane.
  • Correct every flagged row so each AccountCode appears once with the correct AccountName, StatementLine, StatementOrder, and SignMultiplier.
  • Select Close & Apply.
  • Return to the report canvas.
  • Confirm that the reconciliation table contains no blank statement lines or unexpected signs.

That is the mapping check complete. Every ledger account now reaches one presentation-ready statement line.

Still seeing a blank statement line?

  • Confirm that the account code uses identical text in Ledger and AccountMap.
  • Confirm that every ledger account code has exactly one row in AccountMap.
  • Confirm that the relationship between AccountMap[AccountCode] and Ledger[AccountCode] remains active.

Help me diagnose an unmapped account in my Power BI reconciliation table.

Reconcile every reporting month

A clean mapping proves that every account has somewhere to go. Source reconciliation proves that the resulting statement values are numerically correct.

How to Match the Report Calculation

For a debit and credit export, subtract Credit from Debit for each account. For a signed-amount export, use the signed amount as the raw balance.

Multiply each account balance by its SignMultiplier before adding the accounts into a statement line. This reproduces the logic behind [Statement Amount] outside the report.

  • Open the working accounting export from your local project folder.
  • Filter its transaction-date field to the first month shown in the report.
  • Filter its account-code field to the codes mapped to Revenue.
  • Calculate the presentation-ready Revenue total using the source convention explained above.

Before you compare the first month, do you expect the source Revenue total to match the report exactly?

  • Switch back to the report in Power BI Desktop.
  • Select the same month in the Ledger[MonthStart] slicer.
  • Compare the calculated export total with the [Revenue] card.

You should see the same presentation-ready Revenue value in both places. This match proves that the mapping and sign logic work for that statement line.

  • Repeat the source calculation for account codes mapped to Cost of Sales.
  • Compare that result with the Cost of Sales line in the P&L Matrix.
  • Repeat the source calculation for account codes mapped to Operating Expenses.
  • Compare that result with the Operating Expenses line in the P&L Matrix.
  • Repeat the complete three-line check for every remaining month.
  • Check the [Gross Profit] card after each slicer selection.
  • Check the [Operating Profit] card after each slicer selection.
  • Confirm that the Operating Profit trend redraws for each selected period.

Every monthly Revenue, Cost of Sales, and Operating Expenses total should match the filtered export. Those matches also validate the derived profit cards and the active model relationship.

Found a Difference?

  • Match the export date filter to the exact month selected in the report slicer.
  • Check that the export calculation includes every account code for the statement line exactly once.
  • Correct any inaccurate StatementLine or SignMultiplier value in AccountMap.
  • Repeat the comparison after selecting Close & Apply.

Help me trace a difference between my filtered accounting export and my Power BI statement total.

Format, save, and reopen the report

Your numbers now trace back to the source. Consistent formatting and a clear title make the validated report ready to read without changing its financial logic.

  • Switch back to the report page in Power BI Desktop.
  • Select [Statement Amount], [Revenue], [Cost of Sales], [Operating Expenses], [Gross Profit], and [Operating Profit] one at a time in the field list.
  • Apply the entity's reporting currency through each measure's formatting controls.
  • Set each financial measure to 0 decimal places.

The matrix and KPI cards should now use one readable currency style. Whole-number formatting keeps the report focused on management-level values.

  • Add a text box from the report ribbon.
  • Enter a title containing the entity name, Operating P&L, and reporting period.

You should now see the entity and reporting period identified at the top of the page.

  • Position the title at the top of the report canvas.
  • Select the temporary reconciliation table.
  • Delete the temporary reconciliation table from the report page.

Your final page should contain the P&L Matrix, KPI cards, Operating Profit trend, MonthStart slicer, and report title. The temporary validation visual should be gone.

Closing a financial report can feel risky after this much checking, so save the reconciled changes before testing the file.

  • Select File.
  • Select Save.

The reconciled report is now stored in Financial Statement Dashboard.pbix.

  • Close Power BI Desktop.
  • Press the Windows key to open the search bar.
  • Type File Explorer and press Enter.
  • Navigate to the local project folder containing Financial Statement Dashboard.pbix.

Before you reopen the file, do you expect the reconciled totals and final page layout to remain unchanged?

  • Double-click Financial Statement Dashboard.pbix.

Power BI Desktop should reopen the saved report with the title, formatting, and validated visuals intact.

  • Select each month in the Ledger[MonthStart] slicer one at a time.
  • Confirm that Revenue, Cost of Sales, and Operating Expenses still match the reconciled source totals.
  • Confirm that Gross Profit and Operating Profit recalculate for each month.
  • Confirm that the P&L Matrix, KPI cards, and Operating Profit trend respond to every slicer selection.

You should see the same reconciled results that appeared before closing the file. That is the final trust check complete: your local P&L report is saved, traceable, and reusable.

Report Reopened with Different Results?

  • Confirm that you reopened Financial Statement Dashboard.pbix from the same local project folder.
  • Confirm that the slicer uses the same reporting month as your source comparison.
  • Confirm that the temporary reconciliation table was removed only after every account was mapped.

Help me diagnose why my saved Power BI report reopened with different totals or filters.

Secret mission

Add Margin Intelligence

Absolute profit can rise while margins weaken. Add gross and operating margin percentages, then make negative operating margin stand out.

Clean Up Your Resources

Clean Up Your Resources

Your local Power BI Desktop report has no ongoing cloud costs. Use the tabs below to keep your work open, pause it for later, or delete the local project files.

Resources you used:

  • The saved Financial Statement Dashboard.pbix report containing the validated model and report page.
  • The safe working copy of your accounting export containing the scoped P&L data.

Keep everything running

No action is needed. Choose this if you are still testing slicer selections or refining the report layout.

  • Keep Power BI Desktop open while you continue editing the report.
  • Keep Financial Statement Dashboard.pbix in the local project folder.
  • Keep the working accounting export in the same local project folder so the report retains its source file.

Pause - I'll come back to this later

Close Power BI Desktop to free up memory while keeping the report and working export available for later.

  • Select File in the currently open Power BI Desktop report.
  • Select Save.
  • Close Power BI Desktop.

Your validated model, visuals, measures, formatting, and source data remain stored in the local project folder.

Delete - I don't want to use this again

Remove all local project resources when you no longer need this report.

Deleting the folder becomes final when you clear it from the Windows Recycle Bin. Your original accounting-system export remains untouched because this project removes only the safe working copy.

  • Close Power BI Desktop.
  • Return to the local project folder from Step 1 in File Explorer.
  • Delete the local project folder containing Financial Statement Dashboard.pbix and the working accounting export.
  • Open the Windows Recycle Bin from your desktop.
  • Permanently delete the local project folder from the Recycle Bin.
  • Confirm the permanent deletion when Windows asks.

The report file and its safe working export are now removed from your computer.

Nice Work!

Nice Work!

You did it! Your saved Financial Statement Dashboard.pbix now turns a safe accounting export into a reconciled, interactive P&L report in Power BI Desktop.

You've learned how to:

  • Shape a safe accounting export into a normalized Ledger table with Power Query. Model account grouping through AccountMap. Keep financial calculations reusable with DAX measures.
  • Present a hierarchical P&L matrix beside KPI cards plus a monthly Operating Profit trend. Use the MonthStart slicer to update the whole report for each selected period.
  • Reconcile every statement line to filtered totals from the source export. Resolve blank mappings. Correct unexpected signs in AccountMap before saving the report.
  • Complete the Secret Mission by adding Gross Margin %. Add Operating Margin % with a negative-margin alert.

Ready to quiz yourself?