Overview
Formal integrates with Business Intelligence applications to enable end-user identity propagation. This ensures that queries from BI tools are attributed to the actual end-user rather than a shared machine user, enabling accurate auditing and per-user policy enforcement.How It Works
When you set up a BI integration:- Sync: Formal Control Plane synchronizes with your BI application to fetch user identities
- Map: External IDs are automatically assigned to your Formal users
- Propagate: When BI tool users execute queries, their identity is passed to the Connector
- Enforce: Policies evaluate based on the end-user, not the BI tool’s machine user
Supported BI Applications

- Metabase
- Looker
- Omni
- Tableau
- Power BI
- Custom applications (via SQL commenter)
Setup
Metabase
Navigate to BI Integrations
Add Integration
Select Metabase
Enter Credentials
- Server Hostname: Your Metabase instance URL
- Admin Username: Metabase admin username
- Admin Password: Metabase admin password
Allow-list IPs
- 52.18.34.8
- 52.51.88.92
- 54.72.150.112
Terraform
Looker
Looker supports end-user identity propagation via JDBC connection parameters.Open Database Connection
Edit Connection
Add Parameter
Save
Omni
Omni supports connecting to Snowflake through the Formal Connector using a host override. Unlike other BI tools that embed end-user identity in SQL comments, Omni propagates identity at session login time via theQUERY_TAG session parameter containing the omniOrganizationUserId.
Connection Setup
Add a Snowflake Connection
Choose Host & Port
Configure Host Override
account.<connector-hostname>, where <connector-hostname> is your Formal connector hostname. For example:account. prefix is required for the connector to correctly route Snowflake requests.Set Port
1443).Set Database and Warehouse
Configure Authentication
SNOWFLAKE_JWT):- Select Key Pair Authentication as the authentication type
- Set the Username to your Formal machine user (e.g.,
idp:formal:machine:omni) - Add a keypair using the private key available via the Download Private Key button on the machine user details page in the Formal console
Test Connection
End-User Identity Setup
Create Omni Integration
Map External IDs
omniOrganizationUserId in Omni.Verify
Custom Applications
For internal applications or custom BI tools, use the formal-sqlcommenter library to propagate end-user identity.Python/Django
Install the package:Configuring External IDs
External IDs map end-users in external systems to Formal users.Create Formal User
Map External ID
12345, map 12345 to Katie’s
Formal user.Verify
Automatic Sync
For Metabase and other integrated BI tools, Formal automatically:- Fetches user lists from the BI application
- Matches them to Formal users by email
- Assigns external IDs
Policy Examples
End-User Access Control
Per-User Data Masking
Audit BI Tool Access
Monitoring
View End-User Attribution
- Navigate to Logs
- Filter by machine user (BI tool)
- Check “End User” column to see attributed end-users
- Verify queries are attributed correctly
Session Details
In Sessions, you’ll see:- User: Machine user (BI tool)
- End-User: Actual human user in the BI tool
- Queries: Full query history with end-user attribution
Troubleshooting
Queries not attributed to end-users
Queries not attributed to end-users
- BI integration not set up
- External IDs not mapped
- BI tool not passing end-user information
- Verify the BI integration is active in the Formal console
- On the Formal user → External Connections, confirm the external ID matches the BI tool user ID
- For Looker, verify JDBC parameters are configured
- Review Connector logs for end-user extraction errors
Metabase sync not working
Metabase sync not working
- Incorrect admin credentials
- IP allow-list blocking Formal workers
- Metabase instance not reachable
- Verify admin credentials are correct
- Allow-list Formal worker IPs (see above)
- Check Metabase logs for authentication attempts
- Ensure Metabase instance is publicly accessible or VPN-accessible by Formal
Policies not evaluating for end-users
Policies not evaluating for end-users
- Policy references
input.userinstead ofinput.end_user - End-user not in expected groups
- Update policies to use
input.end_userfor BI tool queries - Verify end-user’s group memberships in Formal console
- Test policy in dry-run mode and review logs
Best Practices
Always Use End-User Policies
Always Use End-User Policies
input.end_user attributes, not
input.user (which is the machine user).Implement Row-Level Security
Implement Row-Level Security
Audit BI Access
Audit BI Access
Sync Regularly
Sync Regularly