wrkfrcstdio

Power BI custom visual

Compensation Explorer

See where every employee sits against your pay bands, the market and each other, inside the Power BI reports you already have.

Compensation Explorer is a free Power BI custom visual for compensation and people-analytics teams. It draws pay distributions per group, lays the internal bands and market percentiles you supply over them, and shows a descriptive pay gap between women and men. It works in English and German, runs entirely inside Power BI and makes no external requests, so your data stays where it is.

Version 1.8.2.0, release candidate. Microsoft AppSource listing and Power BI certification pending.

Compensation Explorer logo

Preview

Click through the views.

The control below works like the Compare With switch in the visual's own toolbar. Pick a view and the chart changes.

Compare with

See pay distributions against internal bands

Employee pay distributions compared with supplied internal band minimum, midpoint and maximum.

Development preview of the packaged visual in a mock host with synthetic data. Not a Power BI Desktop or Service screenshot. No certification is claimed. Click the image to enlarge it.

What it is for

Four questions, one chart.

Position against internal bands

Every employee is a dot, with a violin and a box plot for the group, laid over the band minimum, midpoint and maximum you supply. A group that mixes several bands gets a clearly marked calculated summary.

Context from the market

Separately supplied job and grade benchmarks from P10 to P90. Grade references stay separate from job references, and nothing is estimated from other values.

A descriptive pay gap

Women and men compared by median or mean within any grouping, unadjusted by design, with the exclusions shown rather than hidden.

Data that stays where it is

The visual runs inside Power BI, makes no external requests, sends no telemetry and keeps no storage of its own. Access to the data is governed by your Power BI permissions.

Get started

From table to chart in three steps.

01

Prepare the table

One row per employee for one snapshot date, amounts in EUR on an annual full-time-equivalent basis, stable keys instead of names. The Excel template has every column, a comment on each header and six example rows.

Download the Excel template

02

Load and bind

In Power BI Desktop choose Get data, Excel workbook, and load the table named Compensation. Add the visual and bind five fields: Employee key, Snapshot date, Currency, Annual FTE base salary and one grouping key. The chart appears.

03

Add references and settings

Bind band or market references for benchmarks and Gender for Pay Gap. In the format pane, Compensation Fields and References lets you pick a field and shows its mappings. Decide which views, groupings and identifiers readers may see. Hiding a field is a display choice, not an access control.

Reference

The details, when you need them.

Data rulesGrain, amounts, references, Pay Gap, limits
  • Grain and keys. One row per employee for exactly one snapshot date. Grouping uses the Key columns, never the labels. A duplicate or blank employee key, a second snapshot date or a currency other than EUR rejects the whole population.
  • Amounts. Annual, full-time-equivalent EUR. Zero is valid, while blank, negative or non-numeric values are excluded per field. Actual cash additionally needs one common twelve-month period that ends no later than the snapshot.
  • References. They sit on every employee row and must be identical for the same reference key. Band and step references need a key and an ordered minimum and maximum, with an optional midpoint between them. Market references need at least P50, or both P25 and P75. A reference is only read when its basis matches the selected compensation.
  • Pay Gap. Gender is read as Female, Male, Other or Unknown, case-insensitive. Blank or unrecognised values become Unknown and are never inferred. The view needs at least one woman and one man with valid pay in the filtered population.
  • Limits. Up to 10,000 complete employees per view. Larger populations are rejected rather than sampled. One currency, one snapshot, and at least 480 by 320 pixels on the page.
Field referenceAll 109 columns of the template
ColumnField wellTypeRequirementRule
Identity and snapshot · used in Every view
EmployeeKeyEmployee keystringRequiredUnique, nonblank synthetic/stable key. No names.
SnapshotDateSnapshot datedateRequiredExactly one snapshot per view.
CurrencyCurrency (EUR)stringRequiredEUR only. All pay and reference columns use this currency.
Core pay amounts · used in Every view, as the selected compensation
BasePayFteAnnualAnnual FTE base salarynumberOne of theseSupply normalised annual base salary. Zero is valid, negative/missing excluded.
ActualCashFteAnnualAnnual FTE actual cashnumberOne of theseActual paid cash including cash bonuses. Already annual/FTE normalised upstream. Excludes equity/noncash benefits.
CashPeriodStartActual cash period startdateOne of theseRequired with actual cash. Common 12-month period.
CashPeriodEndActual cash period enddateOne of theseRequired with actual cash. No later than SnapshotDate.
Pay Gap · used in Pay Gap
GenderGenderstringFor Pay GapOptional for Pay Gap: Female, Male, Other, Unknown. Case-insensitive. Blank/unrecognized becomes Unknown, never inferred.
Grouping keys and labels · used in Internal and Pay Gap (all keys), Market (Grade, Job, Position, Job family)
BandKeyBand keystringOne of theseStable grouping key. Scope steps to their parent band.
BandLabelBand labelstringOptionalDisplay label only. Never used as grouping identity.
GradeKeyGrade keystringOne of theseStable grouping key. Scope steps to their parent band.
GradeLabelGrade labelstringOptionalDisplay label only. Never used as grouping identity.
JobKeyJob keystringOne of theseStable grouping key. Scope steps to their parent band.
JobLabelJob labelstringOptionalDisplay label only. Never used as grouping identity.
PositionKeyPosition keystringOne of theseStable grouping key. Scope steps to their parent band.
PositionLabelPosition labelstringOptionalDisplay label only. Never used as grouping identity.
JobFamilyKeyJobFamily keystringOne of theseStable grouping key. Scope steps to their parent band.
JobFamilyLabelJobFamily labelstringOptionalDisplay label only. Never used as grouping identity.
CompanyKeyCompany keystringOne of theseStable grouping key. Scope steps to their parent band.
CompanyLabelCompany labelstringOptionalDisplay label only. Never used as grouping identity.
DepartmentKeyDepartment keystringOne of theseStable grouping key. Scope steps to their parent band.
DepartmentLabelDepartment labelstringOptionalDisplay label only. Never used as grouping identity.
LocationKeyLocation keystringOne of theseStable grouping key. Scope steps to their parent band.
LocationLabelLocation labelstringOptionalDisplay label only. Never used as grouping identity.
StepKeyStep keystringOne of theseStable grouping key. Scope steps to their parent band.
StepLabelStep labelstringOptionalDisplay label only. Never used as grouping identity.
Internal band references · used in Internal
BandReferenceKeyBand reference keystringOptionalRequired when supplying this reference. Consistent values per key and measure.
BandReferenceLabelBand reference labelstringOptionalOptional. Used as supplied.
BandBaseMinBand · Base · MinnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
BandBaseMidBand · Base · MidnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
BandBaseMaxBand · Base · MaxnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
BandCashMinBand · Actual cash · MinnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
BandCashMidBand · Actual cash · MidnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
BandCashMaxBand · Actual cash · MaxnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
Step references · used in Internal, grouped by Band with Separate Steps
StepReferenceKeyStep reference keystringOptionalRequired when supplying this reference. Consistent values per key and measure.
StepReferenceLabelStep reference labelstringOptionalOptional. Used as supplied.
StepBaseMinStep · Base · MinnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
StepBaseMidStep · Base · MidnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
StepBaseMaxStep · Base · MaxnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
StepCashMinStep · Actual cash · MinnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
StepCashMidStep · Actual cash · MidnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
StepCashMaxStep · Actual cash · MaxnumberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
Job market references · used in Market, grouped by Job, Position or Job family
MarketReferenceKeyMarket reference keystringOptionalRequired when supplying this reference. Consistent values per key and measure.
MarketReferenceLabelMarket reference labelstringOptionalOptional. Used as supplied.
MarketBaseP10Market · Base · P10numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketBaseP25Market · Base · P25numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketBaseP50Market · Base · P50numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketBaseP75Market · Base · P75numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketBaseP90Market · Base · P90numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketCashP10Market · Actual cash · P10numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketCashP25Market · Actual cash · P25numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketCashP50Market · Actual cash · P50numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketCashP75Market · Actual cash · P75numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
MarketCashP90Market · Actual cash · P90numberOptionalEUR, annual FTE, same compensation basis. Optional. Never imputed.
Grade market references · used in Market, grouped by Grade
GradeMarketReferenceKeyGrade market reference keystringOptionalSeparately supplied grade benchmark. Never derived from job percentiles.
GradeMarketReferenceLabelGrade market reference labelstringOptionalSeparately supplied grade benchmark. Never derived from job percentiles.
GradeMarketSourceGrade market sourcestringOptionalSeparately supplied grade benchmark. Never derived from job percentiles.
GradeMarketDateGrade market datedateOptionalSeparately supplied grade benchmark. Never derived from job percentiles.
GradeMarketBaseP10Grade market · Base · P10numberOptionalOptional. Used as supplied.
GradeMarketBaseP25Grade market · Base · P25numberOptionalOptional. Used as supplied.
GradeMarketBaseP50Grade market · Base · P50numberOptionalOptional. Used as supplied.
GradeMarketBaseP75Grade market · Base · P75numberOptionalOptional. Used as supplied.
GradeMarketBaseP90Grade market · Base · P90numberOptionalOptional. Used as supplied.
GradeMarketCashP10Grade market · Cash · P10numberOptionalOptional. Used as supplied.
GradeMarketCashP25Grade market · Cash · P25numberOptionalOptional. Used as supplied.
GradeMarketCashP50Grade market · Cash · P50numberOptionalOptional. Used as supplied.
GradeMarketCashP75Grade market · Cash · P75numberOptionalOptional. Used as supplied.
GradeMarketCashP90Grade market · Cash · P90numberOptionalOptional. Used as supplied.
GradeMarketTargetCashP10Grade market · TargetCash · P10numberOptionalOptional. Used as supplied.
GradeMarketTargetCashP25Grade market · TargetCash · P25numberOptionalOptional. Used as supplied.
GradeMarketTargetCashP50Grade market · TargetCash · P50numberOptionalOptional. Used as supplied.
GradeMarketTargetCashP75Grade market · TargetCash · P75numberOptionalOptional. Used as supplied.
GradeMarketTargetCashP90Grade market · TargetCash · P90numberOptionalOptional. Used as supplied.
Target cash references · used in Any view, when Total cash target is the selected compensation
BandTargetCashMinBand · Target cash · MinnumberOptionalOptional. Used as supplied.
BandTargetCashMidBand · Target cash · MidnumberOptionalOptional. Used as supplied.
BandTargetCashMaxBand · Target cash · MaxnumberOptionalOptional. Used as supplied.
StepTargetCashMinStep · Target cash · MinnumberOptionalOptional. Used as supplied.
StepTargetCashMidStep · Target cash · MidnumberOptionalOptional. Used as supplied.
StepTargetCashMaxStep · Target cash · MaxnumberOptionalOptional. Used as supplied.
MarketTargetCashP10Market · Target cash · P10numberOptionalOptional. Used as supplied.
MarketTargetCashP25Market · Target cash · P25numberOptionalOptional. Used as supplied.
MarketTargetCashP50Market · Target cash · P50numberOptionalOptional. Used as supplied.
MarketTargetCashP75Market · Target cash · P75numberOptionalOptional. Used as supplied.
MarketTargetCashP90Market · Target cash · P90numberOptionalOptional. Used as supplied.
Reference bases and provenance · used in Internal and Market with actual cash
BandCashBasisBand/step cash basis (actual)stringOptionalLiteral actual required for cash band/step comparisons.
MarketCashBasisMarket cash basis (actual)stringOptionalLiteral actual required for market cash comparisons. Target values are not comparable.
MarketSourceMarket sourcestringOptionalOptional. Used as supplied.
MarketDateMarket reference datedateOptionalOptional. Used as supplied.
Additional pay components · used in Any view, as the selected compensation
VariableActualFteAnnualVariable pay · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
VariableTargetFteAnnualVariable pay · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
StiActualFteAnnualSTI · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
StiTargetFteAnnualSTI · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
LtiActualFteAnnualLTI · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
LtiTargetFteAnnualLTI · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
AllowancesFteAnnualAllowancesnumberOptionalPrepared annual FTE EUR amount. snapshot. Never summed into a total by the visual.
CommissionActualFteAnnualCommission · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
CommissionTargetFteAnnualCommission · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
OvertimeFteAnnualOvertime · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
BenefitsFteAnnualBenefitsnumberOptionalPrepared annual FTE EUR amount. snapshot. Never summed into a total by the visual.
EmployerPensionFteAnnualEmployer pensionnumberOptionalPrepared annual FTE EUR amount. snapshot. Never summed into a total by the visual.
OtherPayFteAnnualOther pay · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
TotalFixedFteAnnualTotal fixednumberOptionalPrepared annual FTE EUR amount. snapshot. Never summed into a total by the visual.
TotalCashTargetFteAnnualTotal cash · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
TotalDirectActualFteAnnualTotal direct · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
TotalDirectTargetFteAnnualTotal direct · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
TotalRemunerationActualFteAnnualTotal remuneration · actualnumberOptionalPrepared annual FTE EUR amount. actual. Never summed into a total by the visual.
TotalRemunerationTargetFteAnnualTotal remuneration · targetnumberOptionalPrepared annual FTE EUR amount. target. Never summed into a total by the visual.
Demo and report helpers · used in Not read by the visual, or opt-in in the employee card
TestScenarioDemo scenariostringOptionalDemo-only report slicer. Not needed in the visual.
DemoPayNotePay notestringOptionalSynthetic explanation. Explicitly enabled in the demo popup.
How the numbers are computedCompa-ratio, market ratio, band summary, Pay Gap
  • Position against a band. Each employee is compared with their own supplied reference, and endpoints count as within. The compa-ratio is pay divided by the positive midpoint. The group value shown is the median of the individual ratios.
  • Market ratio. Pay divided by the positive market P50. Quartiles without a P50 give no ratio. Coverage counts employees with a comparable reference among those with valid pay.
  • Calculated band summary. When a group mixes two or more supplied bands: the lowest minimum, the highest maximum and the mean of the supplied midpoints weighted once per employee, drawn with a dashed outline and an asterisk. Three employees at a 50,000 midpoint and one at 90,000 give 60,000, not 70,000. It is never used as an individual’s reference.
  • Pay Gap. Per group, the men’s statistic minus the women’s statistic, divided by the men’s statistic, using the median by default or the mean. A positive value means women earn less. Totals are recomputed from employees, not averaged from groups. A missing cohort gives no value.
Release notesCurrent version 1.8.2.0

1.8.2.01 October 2026

Simpler authoring: one compensation-field selector, reference mappings shown when bound or configured with a Show All option, and clearer view and layer groups. Field roles, settings and calculations are unchanged. A five-field starter report accompanies the sample.

1.8.1.02026

Corrected label alignment on Windows fonts, deterministic sample generation and a Hints page in the sample report.

1.8.0.02026

Presentation only: number-only labels in two collision lanes, legend help, dashed edges for calculated band summaries.

Percentiles

Inclusive and interpolated. Zoom and scrolling never change a statistic, and sorting uses the full filtered population.

Components

Used exactly as supplied and never added together. Keep amounts and references on a comparable basis.

Pay Gap

Unadjusted for role, seniority or other factors. Not a causal, legal or statutory assessment, for example under EU Directive 2023/970.

Questions

Common questions.

Which fields do I need to see anything at all?

Five: Employee key, Snapshot date, Currency, one pay amount such as Annual FTE base salary, and one grouping key. Everything else is optional and only extends what the visual can show.

Why is a grouping or a reference unavailable?

Check that the corresponding key and pay fields are bound, enabled and valid. Market comparisons need compatible references for the chosen grouping and compensation basis. Grade references do not fall back to job references, and target values are never used in place of actual pay.

Why is Market not offered for Company or Department?

Market compares against job or grade benchmarks, so it is limited to Grade, Job, Position and Job family. Internal and Pay Gap work with all eight grouping keys.

What does the message about 10,000 employees mean?

The visual asks Power BI for the complete population in windows of 1,000 rows and refuses to draw a sample. Above 10,000 employees, or when Power BI cannot deliver all rows, it asks you to narrow the report filters instead of showing partial statistics.

Can I use a currency other than EUR?

Not inside the visual. Convert upstream and supply EUR in every row, including the reference columns.

Does the visual send report data to Workforce Studio?

No. The visual uses the data supplied by Power BI and makes no external network requests or telemetry calls. Power BI permissions, sharing and platform processing still apply. Information you choose to email to support is separate from the visual.

Which languages and accessibility features are supported?

English and German, following the Power BI language or set explicitly in the format pane. Keyboard navigation between points, named marks for screen readers, dismissible hover help and the Power BI high contrast colours are supported.

Why does my organisation block the visual?

Your Power BI administrator controls which visuals your organisation can use. Ask them to check the tenant settings and the organisational visual store. A marketplace listing or certification does not override those settings. The identifier of this visual is CompensationExplorer8A12CC387F8146B998529A1C49A7D642, current version 1.8.2.0.

Is the visual certified or already on AppSource?

Not yet. The current version is a release candidate. The AppSource listing, Microsoft certification and acceptance testing in Power BI Desktop and Service are pending.

Support

Need a hand?

Write to Alexander Hilbrig, who handles product support personally. Include your visual and Power BI versions, the steps to reproduce, what you expected and what happened, and a synthetic example if it helps.

We read every message but make no response-time commitment. Do not send employee pay records, personal identifiers, passwords or access tokens.

We can set it up in your organisation.

If you would rather not start from scratch, we prepare your extract to the template, configure the visual, map your bands and market references, set the author options and hand over a working report your team can keep.