Sumboard

Embedded Analytics Cross-Filtering: Two Switches, Not One

Setting a relationship to filter in both directions does not make the security filter travel both ways. Microsoft documents that as a separate checkbox with its own default, and it documents separately what a viewer is shown when a report references a row that row-level security has configured. Reading the two together is what changes the decision for anyone whose dashboard sits inside another product.

Embedded Analytics Cross-Filtering: Two Switches, Not One

Cross-filtering is the smallest feature on the list. A customer clicks a bar, the other charts follow, and it rarely gets a design document.

That is accurate right up until the dashboard is inside somebody else's product. Then the same feature stops being an interaction and becomes three decisions that are made somewhere other than the interface.

Search for it and the first page confirms how small it looks. Metabase's glossary defines it in one sentence, three of the ten results are vendor community threads, and four embedded analytics pages rank without mentioning the term.

The Word Filter Suggests the Query Gets Smaller. Two-Way Filtering Does the Opposite

The word filter suggests the scope gets smaller. Microsoft describes its own tabular models doing the opposite: "Internally, two-way filtering expands filter context to query a superset of your data." A superset is a statement about logical scope, not a measurement of what an engine reads.

Microsoft attaches a cost caution to the security side of the same setting, warning that enabling bi-directional security filtering "can negatively impact query performance, especially in models with many relationships or large datasets."

Neither sentence tells you what your own workload will do, and that is the point worth carrying. A dashboard two analysts open at lunchtime, and the same dashboard behind forty thousand of your customers' users, put very different weight behind whatever that expansion costs, so it is a number to measure on your data rather than to assume from a vendor's caution.

Two tracks run along one relationship, and changing the relationship direction moves only the upper one.Scroll the diagram sideways to see all of it.

The Direction Setting Has a Modelling Use, and Clicks Are Not Part of It

Microsoft names a use for two-way filters that has no interface in it at all. They "can be an easy fix to the many-to-many query design problem that has challenged tabular and Power Pivot developers in the past," and the same page warns against reading the fix as the thing it resembles: "bi-directional cross-filtering is not a many-to-many construct."

How often teams reach for it that way is not something these documents measure, and we did not measure it either. The narrower thing they do establish is still useful: the setting has a purpose unrelated to interaction.

That is enough to make one question worth asking on your own model. When the direction on a relationship last changed, was the interaction surface part of the decision, or a side effect of it?

The two ends are far apart in an embedded product. A modelling change sits in your backlog and its effect sits in somebody else's product, under their logo.

The Security Filter Is a Separate Switch and Its Default Is Off

Microsoft documents this part in plain words, and it is the part that changes the decision.

"By default, row-level security filtering uses single-directional filters, whether the relationships are set to single direction or bi-directional." Setting a relationship to filter both ways moves the data filter. The security filter stays where it was.

Moving it is a second, deliberate action: "You can manually enable bi-directional cross-filtering with row-level security by selecting the relationship and checking the Apply security filter in both directions checkbox."

Two constraints come attached. Microsoft limits the scope: "If a table takes part in multiple bi-directional relationships, you can only select this option for one of those relationships." And it attaches a caution about cost, noting that enabling bi-directional security filtering "can negatively impact query performance, especially in models with many relationships or large datasets." The scope limit is conditional: it applies when a table takes part in more than one bi-directional relationship.

Read those together and the shape of the decision changes. You are not switching a feature on. You are choosing, per relationship, whether a viewer's permissions travel the same path their selections do.

The general case, and the paths that get missed when no one has enumerated them, is covered in row-level security rather than repeated here.

Embedded, a Blocked Row Does Not Look Like a Permission. It Looks Like a Bug

The failure mode is the reason this matters more inside someone else's application than inside your own.

Microsoft records what a viewer is shown in one specific case: where a report "references a row with RLS configured," the same message displays "as for a deleted or non-existing field," and "to these users, it looks like the report is broken."

That is the whole of the documented part, and cross-filtering does not appear in it. We are putting the two together because a selection is one of the ordinary ways a report comes to reference a row the viewer is not entitled to, and we have not verified that path in a running tenant.

The rest of this paragraph is our reasoning rather than Microsoft's. Put that screen inside a customer's product and the person looking at it does not know your name, so the report they file is a bug report to their vendor. Whether it then reaches you quickly is a question about your support chain, and it is worth answering before the interaction ships.

Microsoft documents a second trap for the same context. In a report reached through an application that authenticates with a service principal, USERPRINCIPALNAME() and USERNAME() return "the service principal's application ID or an empty string, not an end user's identity."

Microsoft draws the consequence itself rather than leaving it to the reader: those two functions "can't be used for per-user filtering in service principal embedding scenarios," and "dynamic RLS filters based on these functions won't filter data per user in embedded scenarios." The documented remedy is the effective identity feature of the Power BI REST API.

Filters Go In Through the SDK. We Read Two Vendors on Whether Anything Comes Back Out

The third decision is about state, and the inbound direction is the better documented one in both SDKs we read.

We read two embedding documents on 2 September 2026 and found the same asymmetry in both. Passing filters in is covered thoroughly. Getting the resulting state back out is covered thinly, or skipped.

Metabase's embedded chart documentation lists several inbound routes: initialSqlParameters for values at load, sqlParameters for the current set, hiddenParameters, and a signed JWT payload that locks parameters for a guest embed. Going the other way it names one callback for parameter values, onSqlParametersChange, described as a way of "holding the values in your app and get a callback whenever they change," alongside an onSave for a saved question. It does not document a callback for filter changes, drills or selections, and its mapQuestionClickActions plugin adjusts what the click menu offers rather than reporting the click to the host.

Our own documentation sits further along the same axis. It covers passing filters in at initialisation, through sumboard.init({ token, filters, dashboardId }), and changing them afterwards with a changeFilters method, and it documents no event travelling the other way.

Those are statements about two documents rather than about two products. An undocumented capability and an absent one look identical from outside, and only one of them is the vendor's fault.

The pair does establish where to aim the question. The outbound direction is the thinnest part of both SDKs, and cross-filtering is the interaction that generates outbound state.

The direction matters for a reason that is ours rather than the vendors'. Three ordinary features are built in the host application: a deep link that reopens a filtered view, a browser back button that steps back through selections, and a saved view someone wants to send to a colleague.

A host-side implementation of any of those needs the current selection available on the host side. Absent that, the work is not harder, it is somewhere else, and the question is worth settling before the interaction ships rather than after.

What to Settle Before You Turn It On

Four questions, in the order that makes each one answerable.

  1. Which relationships need to filter both ways? Microsoft's guidance is to resist the blanket answer, warning that enabling two-way filters everywhere can over-filter data "in ways that you might not expect" and can "inadvertently introduce ambiguity by creating more than one potential query path."
  2. On those relationships, does the security filter travel too? A separate checkbox with a separate default, and where a table sits in more than one bi-directional relationship, the option is available on only one of them.
  3. What does a viewer see when a selection reaches rows they cannot? If the answer is an empty state that reads as a malfunction, that is a product decision to make now rather than a support incident to receive later.
  4. Does filter state leave the embed? Ask for the outbound event by name, not for the feature by name.

The first three are data model questions and the fourth is an integration question. None of the four is answered by which chart type carries the interaction, which is a separate decision and a real one.

What This Page Does Not Cover

The primary sources here are five documents read on 2 September 2026: two Microsoft documentation pages, Metabase's cross-filtering glossary entry and its embedded chart documentation, and our own embedding documentation. Microsoft's tabular model page does not mention row-level security, which is why the security behaviour is cited from the row-level security page instead.

We did not test these behaviours in a running Power BI tenant, and we did not survey how other embedded analytics vendors handle the security direction. This establishes what those five documents say, not what the category does.

One source we wanted was closed to us. The Power BI community thread on using multiple cross-filter interactions in Power BI Embedded ranks second for this query and returned a 403 to our reader, so none of the above reflects its contents.

A team evaluating an embedded analytics platform should put question two to the vendor directly, because a product that has one switch instead of two has made the decision for you either way.

Where to Go Next

Ready to launch customer-facing analytics?

Stop losing customers to competitors with better analytics. Sumboard's customer-facing analytics platform lets you launch self-service dashboards in days, not months.

Frequently asked questions

What is cross-filtering in embedded analytics?
Clicking a value in one chart filters the other charts on the same dashboard. The definition is the same whether the dashboard is yours or embedded in another product. Embedding changes who absorbs the consequences: the data-model decision lands on your tenant boundary, and a viewer who cannot interpret what they are shown reaches your customer's support queue rather than yours.
Does setting a relationship to bi-directional also make row-level security bi-directional?
No, and Microsoft's own documentation is explicit about it. Row-level security filtering uses single-directional filters whether the relationship is set to single direction or bi-directional. Making security travel both ways is a separate checkbox called Apply security filter in both directions, and it is unchecked by default. Two switches on one relationship, and only one of them moves when you change the relationship.
Why is cross-filtering a performance question?
Because of what the direction setting does to the filter context. Microsoft describes the mechanism directly: internally, two-way filtering expands filter context to query a superset of your data. That is a statement about the logical scope of the query rather than a measurement of how much data an engine ends up reading. It also cautions that enabling bi-directional security filtering can negatively impact query performance, particularly in models with many relationships or large datasets. Neither statement predicts your own workload, so treat both as reasons to measure the setting on your data rather than as a number you can carry over.
What happens when a cross-filter lands on rows the viewer is not allowed to see?
Microsoft documents one case, and it is not a case about cross-filtering: where a report references a row with row-level security configured, the same message displays as for a deleted or non-existing field, and to those users it looks like the report is broken. Connecting a selection to that case is our inference and we have not verified it in a running tenant. Whatever else the platform does, that is what the viewer is given to interpret. Embedded, they are interpreting it inside somebody else's product, so the report that follows is a bug report about their vendor rather than a question about permissions.
Who owns the filter state in an embedded dashboard?
It depends on what the SDK exposes in each direction, and in the two documents we read the directions were not symmetric. Metabase's embedded chart documentation names an outbound callback for parameter values and does not document one for filter changes, drills or selections. Sumboard's embedding documentation covers passing filters in, through an init call and a changeFilters method, and documents no event travelling the other way. That outbound direction is what a deep link, a browser back button or a saved view would need, so ask a vendor for both directions by name rather than for the feature by name.

Written by

N

Nicolae Guzun

Founder & CEO, Sumboard

Ship analytics faster

Build customer-facing dashboards 10x faster with Sumboard.

Get started for free