Interactive embedding filters not working

Hey everyone :waving_hand:

I’m currently implementing Interactive Embedding in my system, where each client accesses Metabase dashboards embedded in our application.

I’m already passing the Organization ID from our backend to Metabase as part of the embedding context, and inside the “People” table everything looks fine — I can see that the parameter is being sent and received correctly.

However, I’m having trouble applying this Organization ID to filter other datasets (for example, the “Categories” table) so that users only see categories belonging to their organization.

When I try to configure permissions or filtering based on the Organization ID:

  • If I define the parameter as required via the Admin panel, Metabase blocks the entire table, and I can’t see any data at all.

  • If I leave it open, then users see all data, including categories from other organizations — which obviously breaks the isolation between tenants.

So I’m looking for the correct way to:

  1. Pass the Organization ID via embedding parameters (I already have that working).

  2. Use it to dynamically filter queries or dashboards, limiting data access per organization.

  3. Keep the dashboards interactive (i.e., still using Interactive Embedding).

Any guidance, examples, or best practices on how to properly handle this row-level filtering setup would be super helpful :folded_hands:

Thanks in advance!

SSO code →

// Create JWT payload for Metabase

    const metabasePayload = {

userId,

organization_id: organizationId,

email: email,

    };

// Sign JWT with Metabase secret

const metabaseSecret = new TextEncoder().encode(metabaseSecretKey);

const metabaseToken = await new jose.SignJWT(metabasePayload)

      .setProtectedHeader({ alg: 'HS256' })

      .setIssuedAt()

      .setExpirationTime('10m')

      .sign(metabaseSecret);

// Metabase UI customization parameters

const metabaseParams = {

logo: false,

new_button: true,

    };

// Build query string from parameters

const queryString = Object.entries(metabaseParams)

      .map((\[key, value\]) => \`${key}=${value}\`)

      .join('&');

// Build SSO URL with custom parameters

const returnTo = `/?${queryString}`;

const ssoUrl = `${metabaseSiteUrl}/auth/sso?jwt=${metabaseToken}&return_to=${encodeURIComponent(returnTo)}`;

If you have access to Interactive Embedding, you’re a paid customer, you have access to priority support direct from Metabase.

It also seems like you should be doing this using sandboxing/RLS rather than a hidden parameter.