When to use shared extensions
Shared extensions may be a good fit when:- You manage a multi-tenant environment and need to give each customer a tailored data experience
- You have a core set of metrics and joins that should be consistent across all customers
- You want customers to build their own content without affecting other tenants
- You need to programmatically provision and route users to siloed data views at scale
- Environments where every customer requires a completely different schema or data source with no common logic
- Situations where changes made by one customer should flow back up and be visible to everyone else
Requirements
To follow the steps in this guide, you’ll need:- To have shared extension models enabled. Contact Omni support to have this feature enabled.
- Organization Admin or Connection Admin permissions for the connection you want to work with in Omni.
Creating shared extensions
Create the extension model
- Navigate to the Develop menu and select your parent connection.
- Open the model and click Model > New Shared Extension.
- Enter a name for the extension (e.g.,
customer_3). - Optional: Select the checkbox to allow the extension to be explored. Enable this option if you want users to build their own content off the extension rather than viewing existing dashboards.
Define model visibility with user attributes
Next, you’ll use user attributes to control which model extension a user sees when accessing or building content.
- Navigate to Settings > Attributes.
- Click New Attribute.
- Define a name and a reference (e.g.,
customer_attribute). - Assign the appropriate attribute value to your users.
Map user attributes in the model
To route users to the correct extension, you’ll add a mapping to the parent model using the
dynamic_shared_extensions parameter.- Click Develop in the left navigation.
- Navigate to the parent model.
-
In the model file, create the attribute mappings:
- Manual mapping
- Programmatic mapping
In this approach, you use themappingsparameter to create individual mappings to user attributes:Manual mappingOnly one of themappingsormap_patternparameters can be used at a time. - Save the changes.
Define default access for users
Setting default access levels ensures users only see the data intended for them.To start, set your parent connection base access to No Access. This prevents users from building off any extensions until you explicitly grant permission.
- Click Settings > Connections.
- In the list of connections, click the parent connection of the extension model.
- Click the Permissions tab.
- Set the connection’s Base Access to No Access.
- Click Save changes.
-
Choose how to approach permissions:
Option 1: Shared content access (preferred)
Creates an experience that allows shared content
Option 2: Siloed content access
Creates a completely isolated experience without shared content
When implemented, users can build off their assigned extension but will not see any shared instances or content from the parent level.To implement this approach, grant explicit access only to the specific child extension (e.g.,Customer 3) and set the parent model to No Access.
Testing access with user impersonation
To verify that your access controls are working as expected, we recommend impersonating a test user.
- Navigate to your user list and select a test user.
- Change their user attribute to the extension you wish to test.
- Use the Impersonate feature to view the Omni instance through their eyes.
- Verify that the topics, tables, and metrics match the expected siloed or shared configuration.
Applying changes to extended models
Changes to a parent model propagate to all extensions automatically. Changes to a child extension stay within that extension only.| I want to… | Do this |
|---|---|
| Apply global changes | Modify the parent model. Any updates—such as removing a join or adding a shared metric—will automatically propagate to all extensions once saved. |
| Apply changes to one extension | Edit the specific child extension. Actions like hiding a sensitive table or customizing a metric stay siloed within that extension. |
Troubleshooting
If users are seeing incorrect data orNo Access errors, check the following:
User sees parent model, not extension
User sees parent model, not extension
- Potential cause: Incorrect attribute reference in model file
- Solution: Verify the user attribute reference (ex:
my_user_attribute) matches the exact string in Settings > Attributes.
User sees 'No Access' error
User sees 'No Access' error
- Potential cause: Attribute value does not match any mapping
- Solution: Check the user’s attribute value against the
mappingskeys in the model YAML file
Changes not appearing in extension
Changes not appearing in extension
- Potential cause: Parent model changes not saved
- Solution: Ensure you have clicked Save in the parent model. Changes flow downstream automatically.
Extension data looks like parent data
Extension data looks like parent data
- Potential cause: Extension-specific overrides are missing
- Solution: Edit the extension model directly to apply overrides (like hiding tables) that shouldn’t affect the parent