A custom theme is the fastest way to make a Power BI report look like it belongs to your company instead of a default template. Instead of formatting every chart by hand, you set your colors, fonts, and defaults once in a JSON file and apply them across the whole report. This guide covers what a theme controls, the two ways to build one, and how to wire in your brand colors correctly.
What a Power BI theme actually controls
A theme is a single JSON file that defines the default appearance of an entire report. When you apply it, Power BI uses those defaults for every page and visual unless you manually override a specific element. A theme controls three layers:
- The data color palette — the ordered set of colors used for series, categories, and slices in your charts. This is the part most people care about and the easiest to get right.
- Structural colors — the report background, primary text/foreground color, table accents, and the standard semantic colors for good/bad/neutral states (used by KPIs and conditional formatting).
- Per-visual defaults — font family and sizes, title formatting, gridlines, data labels, borders, padding, and dozens of other properties, set globally or per visual type.
A theme does not change your data, your semantic model, or your relationships. It is purely presentation. It also doesn't lock anything down — you can still override any single visual after the theme is applied, and those manual overrides win.
Two ways to build a theme
You have two paths, and they're complementary, not either/or.
View > Themes > Customize (no code)
This is the right starting point for most people. In Power BI Desktop:
- Go to the View ribbon and open the Themes dropdown.
- Choose Customize current theme.
- Use the dialog tabs — Name and colors, Text, Visuals, Page, Filter pane — to set your palette, fonts, and defaults visually.
- Click Apply.
You never touch JSON, and you see changes live. The catch: the dialog only exposes a subset of what a theme file can do. You can set the main data colors, sentiment colors, fonts, and common defaults, but you can't reach every per-visual property.
Editing theme.json directly (full control)
For anything the dialog can't reach — fine-grained per-visual styling, more data colors, exact padding, specific border radii — you edit the JSON file. The workflow is export, edit, re-import:
- In the Themes dropdown, choose Save current theme to export your current settings to a
.jsonfile. - Edit that file in any text editor (VS Code with JSON validation is ideal).
- Choose Browse for themes to import the edited file back in.
The two approaches stack: build the bulk in the dialog, export, then hand-tune the JSON. A theme is also report-level — it travels inside your .pbix or .pbip file, so once it's applied you don't re-import it every session.
The structure of a theme.json file
The minimum valid theme needs just a name, but a useful one adds a palette and a few structural colors:
{
"name": "My Brand Theme",
"dataColors": ["#1A3D6D", "#E8743B", "#19A979", "#945ECF", "#13A4B4"],
"background": "#FFFFFF",
"foreground": "#252423",
"tableAccent": "#1A3D6D"
}
The key fields:
| Key | What it controls |
|---|---|
name |
Theme name shown in the Themes gallery (the only required field). |
dataColors |
Ordered array of series colors. Color 1 is used first, then 2, and so on. |
background |
Default visual/page background. |
foreground |
Default text color. |
tableAccent |
Accent color for table and matrix visuals. |
good / neutral / bad |
Sentiment colors for KPIs and conditional formatting. |
maximum / center / minimum |
Diverging palette endpoints for gradients and heatmaps. |
visualStyles |
The deep object for per-visual and global defaults. |
Colors must be valid hex strings (#RRGGBB). The most common mistake is a missing # or a typo in the hex — Power BI rejects the whole file with a vague error, so validate your JSON before importing.
Structural classes and visualStyles
visualStyles is where the real power lives. It's a nested object keyed by visual type, then by style name, then by property. The wildcard "*" means "all visual types," and a "*" style name applies to the default style:
{
"name": "My Brand Theme",
"dataColors": ["#1A3D6D", "#E8743B", "#19A979"],
"visualStyles": {
"*": {
"*": {
"title": [{ "fontColor": { "solid": { "color": "#1A3D6D" } }, "fontSize": 12 }],
"background": [{ "show": true, "color": { "solid": { "color": "#FFFFFF" } } }]
}
},
"columnChart": {
"*": {
"dataPoint": [{ "fill": { "solid": { "color": "#1A3D6D" } } }]
}
}
}
}
A few rules that trip people up:
- Property values are almost always wrapped in a single-element array (the
[{ ... }]pattern), even when there's one setting. - Solid colors use the
{ "solid": { "color": "#hex" } }shape, not a bare hex string. - Visual type names are the internal API names (
columnChart,clusteredBarChart,lineChart,tableExfor the modern table,pivotTablefor matrix), which don't always match the friendly names in the visuals pane.
You don't need to memorize every property name. The reliable trick: format one visual exactly how you want it in Desktop, then export the theme — Power BI writes those overrides into the JSON for you to copy into the "*" defaults.
Applying your brand colors the right way
Getting brand colors in is mostly about ordering and contrast, not volume.
- Lead with your primary brand color. Put it first in
dataColorsso single-series charts and the first category use it automatically. - Sequence by usage, not by preference. The first two or three colors get used constantly; pick ones that read well side by side. Bury low-contrast or near-duplicate colors lower in the array.
- Set
tableAccentandtitlefontColor to your primary. This quietly carries the brand into tables and headers, which the data palette alone won't touch. - Mind accessibility. Aim for clear contrast between adjacent palette colors and against the background — many brand palettes have two blues that are indistinguishable in a stacked chart.
- Don't overload the palette. Eight to ten well-chosen colors beat twenty. If a visual has more categories than colors, Power BI cycles back to the start of the array.
If you'd rather not hand-write hex arrays, the free Power BI theme generator builds a valid theme.json from your brand colors — paste your palette, get a file you can drop straight into Browse for themes.
A practical workflow
Here's a sequence that produces a clean, reusable theme with the least friction:
- Gather your exact brand hex codes (from a brand guide or by sampling your logo).
- Generate or hand-write a starter
theme.jsonwithdataColors,background,foreground, andtableAccent. - Import it via View > Themes > Browse for themes.
- Format one of each visual type the way you want, then Save current theme to capture those defaults.
- Open the exported JSON, move the good overrides into the
"*"wildcard so they apply everywhere, and re-import. - Save the
.pbix/.pbip— the theme now travels with the report.
Keep the final theme.json in version control or a shared folder so every report in your organization starts from the same baseline. A shared theme file is one of the highest-leverage things you can do for visual consistency across reports.
Where this fits in a finished report
A theme is the styling layer on top of good underlying work — a clean star schema, sensible relationships, and well-named measures. A polished palette can't rescue a tangled model, and a great model still looks generic without a theme. For more on the layers underneath, see our guides on building a star schema in Power BI and writing your first DAX measures.
Skip the JSON entirely
Don't want to fuss with dataColors arrays and visualStyles at all? With Instant PowerBI, you send your raw CSV or Excel data and get back a fully modeled Power BI report styled in your brand colors — relationships, measures, and theme already wired in. It opens in free Power BI Desktop, so there's nothing extra to install. Get started, or grab the free theme generator any time you just need the colors.
Frequently asked questions
What is a Power BI theme?
A Power BI theme is a JSON file that sets the default colors, fonts, and formatting for an entire report. It controls the data color palette plus structural elements like background, text, borders, and individual visual defaults, so every chart looks consistent without formatting each one by hand.
How do I import a custom theme into Power BI?
In Power BI Desktop, go to the View ribbon, open the Themes dropdown, and choose 'Browse for themes'. Select your theme.json file and it applies to the whole report. You can also pick 'Customize current theme' to edit colors and fonts in a dialog, then 'Save current theme' to export the JSON.
Where do I set brand colors in a Power BI theme JSON?
Brand colors go in the 'dataColors' array, the ordered palette used for series in charts. Put your primary brand color first. Structural colors (background, foreground, table accents) are set with top-level keys like 'background', 'foreground', and 'tableAccent', and per-visual defaults live under the 'visualStyles' object.
Is a Power BI theme free to use?
Yes. Themes work in Power BI Desktop, which is free to download, and importing or editing a theme.json file costs nothing. You only need a paid Power BI Pro license (publicly listed at roughly $14 per user per month at the time of writing) to publish and share reports in the Power BI Service, not to build or apply a theme.
Build Power BI reports for a living? Do this part in minutes.
Studio turns a data export and a sentence into a valid .pbip project — TMDL model, PBIR report pages, DAX measures, branded theme. You keep the judgment calls; the clicking is done.
See Studio →