Power BI Gantt Visual (Preview): First Look and Workarounds

I left project controls a few months ago, just in time for Microsoft to release a native Gantt visual for Power BI. Did that stop me from testing it the moment it landed? Of course not. Leaving project controls analytics doesn’t mean I’ve stopped being curious about the tools we use!

So I built a small sample report with two dummy projects and put the new visual through its paces, looking at it through the lens of someone who’s spent years working with project data and reporting.

The short version? It’s a real improvement on the Gantt custom visuals we’ve had in AppSource, and it looks great for a straightforward project overview. But if you’re working in project controls analytics, there are still some gaps worth knowing about.

I wanted to see what works, what’s missing, and where a bit of DAX could help. Here’s what I found, including the workarounds I came up with along the way.

Tested in October 2026. It’s a preview, so things change fast. Some of this may already be out of date by the time you read it (and honestly, I hope it is).

Power BI Gantt chart titled “Project Schedule and Progress”. Tasks are grouped by project and phase, with a Status column and timeline bars from September to November. “DAX measures” shows “At risk ⚠️”, and a milestone appears as a diamond.

The sample data

I created a dummy schedule with 25 work items across two projects: Sales Dashboard Revamp and Conference Talk Prep, running from September to November 2026.

Each row includes the project, phase, work item, type (Task or Milestone), owner, start and end dates, progress, status and dependencies.

I stored milestones with the same date in both Start and End, as you might find when exporting data from a scheduling tool. Remember that detail, because it becomes relevant when we get to the DAX workarounds.

You can download the dataset here: Schedule.csv.

What works, what’s missing, and what I tried

Let’s start with the good stuff. There’s quite a lot to like about the native visual straight out of the box.

You get progress bars, milestone markers, up to three grouping levels, and additional columns alongside the task list for information such as owner or status. You can customise colours by category or individual row, apply conditional formatting to the bars, shade particular days (weekends, for example), and zoom in and out of the timeline.

For communicating a project timeline to stakeholders, these features are useful. A native option is a welcome addition to Power BI.

The limitations become more apparent when you start looking at the requirements of project controls analytics.

Baselines are missing

One of the first things I looked for was the ability to compare current start and end dates against a baseline.

I couldn’t find an option for this. For projects and programmes where performance is measured against an approved baseline, that’s a significant limitation. Showing where an activity sits on the timeline is useful, but understanding how the current schedule compares with the original plan is a different matter.

Unfortunately, I couldn’t find a DAX workaround for this one.

Milestones need a workaround

This is where the way I structured my sample data came back to bite me.

The visual draws a milestone marker when the End field is blank. That’s documented behaviour, but it can be awkward if your source data stores milestones with the same date in Start and End, as mine does.

The solution was to create a measure that returns a blank end date for milestones:

TaskEnd =
IF (
SELECTEDVALUE ( Schedule[Type] ) <> "Milestone",
MAX ( Schedule[EndDate] )
)

I then used StartDate in Start and TaskEnd in End.

That sorted it for my sample.

If your data distinguishes between Start and Finish milestones, you’ll need to handle things slightly differently. A Finish milestone’s date usually sits in the End column, so your Start measure needs to pick up that date, while your End measure should return a date only for tasks.

It’s nothing particularly complicated if you’re comfortable with DAX, but it’s worth knowing before you start wondering why your milestones aren’t showing up.

The extra columns behave like a matrix

Adding fields to the Columns section lets you display extra information alongside the timeline. The problem is that a field such as Status also appears against the Project and Phase rows, even when that information doesn’t apply at those levels.

Technically, that makes sense. The visual is displaying a hierarchy, much like a matrix. But for a project schedule, it isn’t the result I wanted.

Thankfully, this one has a simple fix. I used ISINSCOPE to display the status only at work-item level:

WorkItemStatus =
IF (
ISINSCOPE ( Schedule[WorkItem] ),
SELECTEDVALUE ( Schedule[Status] )
)

Much better. Sometimes a small DAX measure makes all the difference.

No line for today’s date

I might have missed something, but I couldn’t find an option to display today’s date as a line on the timeline or automatically scroll to the current date. The documentation doesn’t mention one either.

When you’re looking at a project timeline, knowing where you are today helps put everything else into context. What’s already happened? What’s coming up? Are we looking at activities that should already be complete?

I’d love to see this added.

Conditional formatting stops at the bars

You can apply conditional formatting to the Gantt bars, but that flexibility doesn’t extend to the fields displayed in Columns.

I wanted to highlight activities at risk with a warning icon next to their status. In a table or matrix, conditional formatting gives you several ways to achieve something similar. Here, right-clicking a field in Columns gives you options such as Remove field, Rename, Move to, and New quick measure. No conditional formatting.

So I tried a different approach and added the warning emoji directly to the status text using a measure:

WorkItemStatusIcon =
VAR s = SELECTEDVALUE ( Schedule[Status] )
RETURN
IF (
ISINSCOPE ( Schedule[WorkItem] ),
IF ( s = "At risk", s & " ⚠️", s )
)

Now, activities at risk appear as At risk ⚠️.

There’s an accessibility benefit here, too. Keeping the words “At risk” alongside the icon means the message doesn’t rely on the icon or its colour alone to communicate its meaning. That’s a small detail, but it matters when you’re designing reports for different people and different ways of accessing information.

What happens when your schedule grows?

According to the documentation, the visual supports up to 1,000 rows and three grouping levels.

That’s enough for a straightforward overview, but real project schedules can contain thousands of activities and much deeper work breakdown structures. Depending on the size and complexity of your projects, those limits could become a problem.

For me, these are the main gaps between a visual that communicates a timeline and one that supports the wider requirements of project controls analytics.

One extra trick: a dynamic subtitle

While testing the visual, I also wanted to give stakeholders a quick summary of what’s happening without expecting them to scan every activity.

The formatting options are limited, so I decided to put the key message in the subtitle instead.

This measure counts the items at risk and identifies the next upcoming milestone:

GanttSubTitle =
VAR AtRisk =
CALCULATE (
COUNTROWS ( Schedule ),
Schedule[Status] = "At risk"
)
VAR NextMilestone =
CALCULATE (
MIN ( Schedule[StartDate] ),
Schedule[Type] = "Milestone",
Schedule[StartDate] >= TODAY ()
)
RETURN
"Project Timeline: "
& IF (
AtRisk > 0,
AtRisk & " item"
& IF ( AtRisk > 1, "s", "" )
& " at risk",
"all on track"
)
& IF (
NOT ISBLANK ( NextMilestone ),
" · Next milestone "
& FORMAT ( NextMilestone, "d mmm" )
)

To use it, go to Format visual > Title > Subtitle > fx and bind the subtitle to the measure.

With my sample data, it displays:

Project Timeline: 2 items at risk · Next milestone 12 Nov

The subtitle updates as the underlying statuses and dates change, while the main title stays simple: Project Schedule and Progress.

I like this approach because it gives stakeholders a useful summary straight away, without adding more clutter to the visual. It also reminds us that even when a visual doesn’t offer every formatting option we’d like, there may be another way to present the information.

My verdict

I’m genuinely pleased to see Microsoft investing in a native Gantt visual for Power BI. It’s a welcome addition, and for straightforward project timelines, it already provides a good-looking way to communicate progress and upcoming activities.

But there is a difference between showing a schedule and supporting the analysis needed to manage a project.

If you need a clear timeline for stakeholder reporting, I’d give it a try. If your work involves baseline comparisons, dependencies, critical path analysis, large schedules, and more complex project controls requirements, I’d keep your existing scheduling tool close for now.

It’s a preview, after all, and I’m interested to see how it develops, but I have something cooking and coming soon! So watch this space!

I’ve moved on from project controls analytics, but I’ll always be interested in what Power BI can do with project data. Clearly, some habits are harder to leave behind than others!

Have a play

You can find the sample report, dataset and DAX measures in the power-bi-gantt-preview GitHub repo. The README also explains how to set up the visual from scratch if you’d prefer to build your own.

For the official documentation, see Gantt visual in Power BI (preview) on Microsoft Learn.

Thank you for joining me on this journey. Until next time, let’s keep crafting accessible and ethical insights that make a difference

Leave a Reply

Discover more from Data Tides

Subscribe now to keep reading and get access to the full archive.

Continue reading