Hi Jeremy, this seems like an ideal case for GoodData actually.
The best way would be to use the workspace hierarchy as mentioned by Julius. Let me try to briefly describe how to click all the features together to make it work:
• define a “parent” workspace
◦ there connect your data and set up your logical data model
◦ within this parent workspace’s data model define a “Workspace Data Filter” and map it to the “tenant key” columns in your tables/datasets in the logical data model
◦ build your visualizations in this parent workspace
• define a child workspace (with “parent” being their parent workspace) for each of your tenants (for which you want to have siloed analytics)
◦ for each such child workspace define workspaceDataFilterSetting with value if the tenant-key
◦ your child workspace will inherit all the data model and visualizations from the parent workspace
◦ any query into the dataset with WorkspaceDataFilter performed from the child workspace will have a filter applied based on the tenant-key
• if you happen to have different databases for some (or all) your tenants, you can use the “
unique data source per tenant” feature to override the database connection (while keeping the model and mapping) for a particular child workspace
I hope this helps. Please let us know if you have any more questions. Thanks.