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.
Power BI custom visual
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.
Preview
The control below works like the Compare With switch in the visual's own toolbar. Pick a view and the chart changes.
See pay distributions against internal bands
Employee pay distributions compared with supplied internal band minimum, midpoint and maximum.
Compare distributions across companies
Mixed bands display a calculated range and an employee-weighted mean of supplied midpoints.
Put employee pay in market context
Compare employee pay with separately supplied grade market percentiles.
Explore descriptive pay gaps by job family
Compare women and men using median pay. Results are unadjusted and descriptive.
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
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.
Separately supplied job and grade benchmarks from P10 to P90. Grade references stay separate from job references, and nothing is estimated from other values.
Women and men compared by median or mean within any grouping, unadjusted by design, with the exclusions shown rather than hidden.
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
01
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 template02
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
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
| Column | Field well | Type | Requirement | Rule |
|---|---|---|---|---|
| Identity and snapshot · used in Every view | ||||
| EmployeeKey | Employee key | string | Required | Unique, nonblank synthetic/stable key. No names. |
| SnapshotDate | Snapshot date | date | Required | Exactly one snapshot per view. |
| Currency | Currency (EUR) | string | Required | EUR only. All pay and reference columns use this currency. |
| Core pay amounts · used in Every view, as the selected compensation | ||||
| BasePayFteAnnual | Annual FTE base salary | number | One of these | Supply normalised annual base salary. Zero is valid, negative/missing excluded. |
| ActualCashFteAnnual | Annual FTE actual cash | number | One of these | Actual paid cash including cash bonuses. Already annual/FTE normalised upstream. Excludes equity/noncash benefits. |
| CashPeriodStart | Actual cash period start | date | One of these | Required with actual cash. Common 12-month period. |
| CashPeriodEnd | Actual cash period end | date | One of these | Required with actual cash. No later than SnapshotDate. |
| Pay Gap · used in Pay Gap | ||||
| Gender | Gender | string | For Pay Gap | Optional 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) | ||||
| BandKey | Band key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| BandLabel | Band label | string | Optional | Display label only. Never used as grouping identity. |
| GradeKey | Grade key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| GradeLabel | Grade label | string | Optional | Display label only. Never used as grouping identity. |
| JobKey | Job key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| JobLabel | Job label | string | Optional | Display label only. Never used as grouping identity. |
| PositionKey | Position key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| PositionLabel | Position label | string | Optional | Display label only. Never used as grouping identity. |
| JobFamilyKey | JobFamily key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| JobFamilyLabel | JobFamily label | string | Optional | Display label only. Never used as grouping identity. |
| CompanyKey | Company key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| CompanyLabel | Company label | string | Optional | Display label only. Never used as grouping identity. |
| DepartmentKey | Department key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| DepartmentLabel | Department label | string | Optional | Display label only. Never used as grouping identity. |
| LocationKey | Location key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| LocationLabel | Location label | string | Optional | Display label only. Never used as grouping identity. |
| StepKey | Step key | string | One of these | Stable grouping key. Scope steps to their parent band. |
| StepLabel | Step label | string | Optional | Display label only. Never used as grouping identity. |
| Internal band references · used in Internal | ||||
| BandReferenceKey | Band reference key | string | Optional | Required when supplying this reference. Consistent values per key and measure. |
| BandReferenceLabel | Band reference label | string | Optional | Optional. Used as supplied. |
| BandBaseMin | Band · Base · Min | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| BandBaseMid | Band · Base · Mid | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| BandBaseMax | Band · Base · Max | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| BandCashMin | Band · Actual cash · Min | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| BandCashMid | Band · Actual cash · Mid | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| BandCashMax | Band · Actual cash · Max | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| Step references · used in Internal, grouped by Band with Separate Steps | ||||
| StepReferenceKey | Step reference key | string | Optional | Required when supplying this reference. Consistent values per key and measure. |
| StepReferenceLabel | Step reference label | string | Optional | Optional. Used as supplied. |
| StepBaseMin | Step · Base · Min | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| StepBaseMid | Step · Base · Mid | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| StepBaseMax | Step · Base · Max | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| StepCashMin | Step · Actual cash · Min | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| StepCashMid | Step · Actual cash · Mid | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| StepCashMax | Step · Actual cash · Max | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| Job market references · used in Market, grouped by Job, Position or Job family | ||||
| MarketReferenceKey | Market reference key | string | Optional | Required when supplying this reference. Consistent values per key and measure. |
| MarketReferenceLabel | Market reference label | string | Optional | Optional. Used as supplied. |
| MarketBaseP10 | Market · Base · P10 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketBaseP25 | Market · Base · P25 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketBaseP50 | Market · Base · P50 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketBaseP75 | Market · Base · P75 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketBaseP90 | Market · Base · P90 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketCashP10 | Market · Actual cash · P10 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketCashP25 | Market · Actual cash · P25 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketCashP50 | Market · Actual cash · P50 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketCashP75 | Market · Actual cash · P75 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| MarketCashP90 | Market · Actual cash · P90 | number | Optional | EUR, annual FTE, same compensation basis. Optional. Never imputed. |
| Grade market references · used in Market, grouped by Grade | ||||
| GradeMarketReferenceKey | Grade market reference key | string | Optional | Separately supplied grade benchmark. Never derived from job percentiles. |
| GradeMarketReferenceLabel | Grade market reference label | string | Optional | Separately supplied grade benchmark. Never derived from job percentiles. |
| GradeMarketSource | Grade market source | string | Optional | Separately supplied grade benchmark. Never derived from job percentiles. |
| GradeMarketDate | Grade market date | date | Optional | Separately supplied grade benchmark. Never derived from job percentiles. |
| GradeMarketBaseP10 | Grade market · Base · P10 | number | Optional | Optional. Used as supplied. |
| GradeMarketBaseP25 | Grade market · Base · P25 | number | Optional | Optional. Used as supplied. |
| GradeMarketBaseP50 | Grade market · Base · P50 | number | Optional | Optional. Used as supplied. |
| GradeMarketBaseP75 | Grade market · Base · P75 | number | Optional | Optional. Used as supplied. |
| GradeMarketBaseP90 | Grade market · Base · P90 | number | Optional | Optional. Used as supplied. |
| GradeMarketCashP10 | Grade market · Cash · P10 | number | Optional | Optional. Used as supplied. |
| GradeMarketCashP25 | Grade market · Cash · P25 | number | Optional | Optional. Used as supplied. |
| GradeMarketCashP50 | Grade market · Cash · P50 | number | Optional | Optional. Used as supplied. |
| GradeMarketCashP75 | Grade market · Cash · P75 | number | Optional | Optional. Used as supplied. |
| GradeMarketCashP90 | Grade market · Cash · P90 | number | Optional | Optional. Used as supplied. |
| GradeMarketTargetCashP10 | Grade market · TargetCash · P10 | number | Optional | Optional. Used as supplied. |
| GradeMarketTargetCashP25 | Grade market · TargetCash · P25 | number | Optional | Optional. Used as supplied. |
| GradeMarketTargetCashP50 | Grade market · TargetCash · P50 | number | Optional | Optional. Used as supplied. |
| GradeMarketTargetCashP75 | Grade market · TargetCash · P75 | number | Optional | Optional. Used as supplied. |
| GradeMarketTargetCashP90 | Grade market · TargetCash · P90 | number | Optional | Optional. Used as supplied. |
| Target cash references · used in Any view, when Total cash target is the selected compensation | ||||
| BandTargetCashMin | Band · Target cash · Min | number | Optional | Optional. Used as supplied. |
| BandTargetCashMid | Band · Target cash · Mid | number | Optional | Optional. Used as supplied. |
| BandTargetCashMax | Band · Target cash · Max | number | Optional | Optional. Used as supplied. |
| StepTargetCashMin | Step · Target cash · Min | number | Optional | Optional. Used as supplied. |
| StepTargetCashMid | Step · Target cash · Mid | number | Optional | Optional. Used as supplied. |
| StepTargetCashMax | Step · Target cash · Max | number | Optional | Optional. Used as supplied. |
| MarketTargetCashP10 | Market · Target cash · P10 | number | Optional | Optional. Used as supplied. |
| MarketTargetCashP25 | Market · Target cash · P25 | number | Optional | Optional. Used as supplied. |
| MarketTargetCashP50 | Market · Target cash · P50 | number | Optional | Optional. Used as supplied. |
| MarketTargetCashP75 | Market · Target cash · P75 | number | Optional | Optional. Used as supplied. |
| MarketTargetCashP90 | Market · Target cash · P90 | number | Optional | Optional. Used as supplied. |
| Reference bases and provenance · used in Internal and Market with actual cash | ||||
| BandCashBasis | Band/step cash basis (actual) | string | Optional | Literal actual required for cash band/step comparisons. |
| MarketCashBasis | Market cash basis (actual) | string | Optional | Literal actual required for market cash comparisons. Target values are not comparable. |
| MarketSource | Market source | string | Optional | Optional. Used as supplied. |
| MarketDate | Market reference date | date | Optional | Optional. Used as supplied. |
| Additional pay components · used in Any view, as the selected compensation | ||||
| VariableActualFteAnnual | Variable pay · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| VariableTargetFteAnnual | Variable pay · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| StiActualFteAnnual | STI · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| StiTargetFteAnnual | STI · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| LtiActualFteAnnual | LTI · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| LtiTargetFteAnnual | LTI · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| AllowancesFteAnnual | Allowances | number | Optional | Prepared annual FTE EUR amount. snapshot. Never summed into a total by the visual. |
| CommissionActualFteAnnual | Commission · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| CommissionTargetFteAnnual | Commission · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| OvertimeFteAnnual | Overtime · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| BenefitsFteAnnual | Benefits | number | Optional | Prepared annual FTE EUR amount. snapshot. Never summed into a total by the visual. |
| EmployerPensionFteAnnual | Employer pension | number | Optional | Prepared annual FTE EUR amount. snapshot. Never summed into a total by the visual. |
| OtherPayFteAnnual | Other pay · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| TotalFixedFteAnnual | Total fixed | number | Optional | Prepared annual FTE EUR amount. snapshot. Never summed into a total by the visual. |
| TotalCashTargetFteAnnual | Total cash · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| TotalDirectActualFteAnnual | Total direct · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| TotalDirectTargetFteAnnual | Total direct · target | number | Optional | Prepared annual FTE EUR amount. target. Never summed into a total by the visual. |
| TotalRemunerationActualFteAnnual | Total remuneration · actual | number | Optional | Prepared annual FTE EUR amount. actual. Never summed into a total by the visual. |
| TotalRemunerationTargetFteAnnual | Total remuneration · target | number | Optional | Prepared 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 | ||||
| TestScenario | Demo scenario | string | Optional | Demo-only report slicer. Not needed in the visual. |
| DemoPayNote | Pay note | string | Optional | Synthetic explanation. Explicitly enabled in the demo popup. |
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
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.
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.
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.
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.
Not inside the visual. Convert upstream and supply EUR in every row, including the reference columns.
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.
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.
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.
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
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.
ask@workforce-studio.comWe read every message but make no response-time commitment. Do not send employee pay records, personal identifiers, passwords or access tokens.
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.
Legal
Page last updated 1 October 2026.