Team DataFam Tableau User Group 02 Sep 2026
48 min 8,192 words transcribed
Summary
Emilie Smith, Senior Business Intelligence Developer at EnlivenHealth, repeats her Tableau Conference 2026 talk on taking a pharmacy SaaS business from emailing PDF dashboards to genuine self-service embedded analytics. She walks through the six-step checklist she developed — configuring Tableau Cloud projects and groups, building the JWT and connected-app authentication flow, embedding with the Embedding API, adding row-level security with user attribute functions, getting Tableau Bridge to refresh reliably, and controlling which client sees which dashboard — and is unusually candid about what went wrong at each stage. The blank-dashboard scare, the Tableau Bridge run of one success and seventeen errors, the undocumented 1 GB limit on embedded extracts, and the discovery that acceleration silently negates the user attribute filter are all covered in detail. The result: from a single customer live in November to 88 clients and 188 activated dashboards, with no Tableau users to create or manage. Hosted by Chris McClellan, with a Q&A on where embedded users actually live and what the model really costs.
Listen to this TUG
Prefer to listen? This meeting is also an episode of the Tableau TUG recordings podcast.
Key points
- Tableau Cloud Embedded Analytics is billed on on-demand usage rather than per-licence, which is what made analytics for 100+ external clients affordable in the first place.
- You never create the users. Permissions ride in on a JSON Web Token built from a connected app, so there is no identity store on the Tableau side — the sessions are ephemeral.
- Restrict the connected app to a single project and to your own domain. Separating prod from non-prod is what makes that restriction meaningful.
- Missing permissions on the workbook's user group are the single most common cause of embedding errors — the 'content not found' and 'you do not have permission' messages almost always trace back to it.
- A user attribute filter will blank your own dashboards, because your company has no rows in a dataset collected for clients. Add an ISMEMBEROF('Admins') clause to the calculation.
- User attribute functions remove the need for a messy entitlement table joined into every data source.
- An embedded extract over 1 GB will fail to refresh through Tableau Bridge. The fix is a published data source.
- User attribute functions do not work with a published data source until Tableau enables the feature on your site — it is not on by default, so ask.
- Do not use acceleration on a workbook with a user attribute filter: it negates the filter.
- Tags plus the REST API worked for content management at small scale but did not scale; a small database mapping client to dashboard replaced it.
- Install Tableau Bridge and test extract refreshes early. Leaving it late cost roughly a month of the project timeline.
Jump to a chapter (29)
- 0:00 Welcome to Team DataFam TUG meeting 90
- 0:48 Emilie Smith: from a chemistry PhD to BI development
- 1:51 Agenda
- 2:40 Introducing EnlivenHealth and the e360 platform
- 3:35 The problem: 160+ dashboards delivered as PDFs
- 4:59 The vision: embed the dashboards in e360
- 5:20 Why Tableau Cloud Embedded Analytics
- 5:58 Potential challenges, and a multi-team effort
- 8:07 Step 1: configure Tableau Cloud projects and user groups
- 9:47 Don't forget permissions on the workbook
- 10:23 Step 2: authentication, single sign-on and the JWT flow
- 11:55 Creating a connected app and restricting its access
- 13:58 What the JSON Web Token actually contains
- 15:02 Step 3: embedding via HTML or the Embedding API
- 16:51 Step 4: row-level security with user attribute functions
- 18:05 What happened to my dashboards? They're now blank
- 19:02 Step 5: Tableau Bridge, and the refresh nightmare
- 21:05 Root cause: the 1 GB embedded extract limit
- 22:24 Step 6: content management, from tags to a database
- 26:46 Project timeline: proof of concept in 2021 to go-live
- 28:45 And today: 88 clients and 188 dashboards
- 29:06 Lessons learned
- 30:01 Resources
- 30:40 Demo: what a client sees in the reporting module
- 33:02 Demo: permissions and the 'content does not exist' error
- 35:01 Q&A: where are the embedded users defined?
- 40:01 Q&A: what embedded analytics actually costs
- 41:08 Q&A: formatting and sizing for embedding
- 41:44 Wrap-up, quiz and next meeting
Transcript
0:01 Chris McClellan: So welcome to TeamDataFam Tableau User Group Meeting Number 90. This TUG works a little bit differently to others. We are aiming to capture all the in-person and unrecorded presentations and give them a wider audience. So I don't really mind where you've presented before. I actually don't care if you've never presented before. If you've got a Tableau related topic, please get in touch.
0:22 We'll find a slot for you. My email is team.DataFam@Gmail.com.
0:27 But talking about conferences, today we've got Emilie, uh, as a repeat of TC'26. Her presentation is called From PDFs to Self-Service: A Six-Step Embedded Framework.
0:40 Um, all about embedded analytics, JWTs. She's the expert, so I'll hand it over to Emilie and she can take it from here.
0:48 Emilie Smith: So thank you so much for having me here today to do a repeat of my talk on embedded ana- analytics that I presented at a Tableau Conference.
0:57 Um, so a little bit about myself. I am originally from France. I came to study, um, abroad my junior year of college at UNC Chapel Hill, uh, in North Carolina, which, uh, is why, I mean, I've been living in North Carolina for the past 30 years now. I then, um, got a PhD in chemistry from NC State, and I worked for 10 years as a research scientist in drug discovery.
1:20 But then after 10 years, I had enough of the lab, so I retrained myself in the field of data analytics and data visualization.
1:27 And I kind of discovered Tableau while I was doing a lot of Coursera, uh, certifications, and, and I've been a BI developer for the past nine years now. Um, yeah, coming on 10, I think. I attended my very first Tableau Conference in 2019, and I've attended, uh, every year since. And that was the first time I was a presenter this year, and I was, uh, very excited about it.
1:49 So I hope you enjoy my talk. So here's a brief agenda.
1:54 First, I'm gonna, um, introduce EnlivenHealth to kind of give you some background about, uh, what kind of company we are and why we wanted to embed, uh, our dashboards. Uh, next I'm gonna go through, through a checklist that I developed, and I'm gonna go through each of these steps and really show you how I implemented those steps, so that's gonna be the bulk of the presentation.
2:13 Uh, next I will go through a project timeline to kind of give you an idea of how long a project like that, um, can take. Uh, finally, we'll go through some lessons learned and resources, and then at the end, I have a recorded demo where you can really see how this all works, um, in our, uh, websites and how, um, some of the concepts that, um, I'm gonna show you, you're gonna see them in, um, action during that recorded demo.
2:40 So first things first, EnlivenHealth. So EnlivenHealth is a division of Omnicell, which provides software as a service solution for retail pharmacies.
2:49 Uh, and we have three key areas. So in patient experience, clinical experience, and financial experience.
2:57 Uh, about a couple of years ago, EnlivenHealth launched its, uh, E360 platform or Enliven 360 platform, where all our products are now available under a single website and a single sign-on. Prior to this, uh, our customers would have to, uh, log in to separate websites to get, depending on the products that they have.
3:21 And, uh, so they had different login information. So that is a much better way, uh, for them to view all their products, and we thought that would be a great idea to add some analytics component now that everything was at the, the single sign-on.
3:36 So when I started at EnlivenHealth, uh, we had two Tableau servers with around 60 users and some creator licenses. We don't have that many developers.
3:44 Over 160 dashboard with just about as many subscriptions, and we really couldn't, um, uh, share our dashboards directly with our clients because, uh, number one, we have over, um, 100 clients, so, um, getting all these licenses for even just one user for one of these clients would be, uh, cost prohibitive.
4:08 And number two is we handle, um, retail pharmacy data, which is extremely sensitive. We have all kinds of, uh, PHI or protected health information, uh, so we have to be HIPAA compliant. So we have to, to make sure that the data doesn't get exposed to someone who shouldn't ha- have access to. And also all our data sets pull all our clients together, um, so when people wanna screen share, you know, uh, our, uh, dashboards, really I have to be, be careful that they select the correct client.
4:39 So of course we will need some kind of row level security or something like that if we wanted our, um, customers to view directly, uh, to view these dashboards, interact with them. So really, when I joined, the only way our dashboards were shared, yeah, wa- was via PDF or the Excel file.
4:58 Um, and we wanted to change that. So our vision was to embed the dashboards directly into the E360 platform, so the clients would log in once, they would click on s- a reporting tab. That tab would launch any dashboards available for them.
5:12 They will not need to enter any, any credentials in Tableau, and then the dashboards would have row level security, so they would only see their own data.
5:20 So we selected Tableau Cloud Embedded Analytics, uh, because the, the main reason was the on-demand usage. So we only pay for usage and not for licenses. So we can have as many licenses as we want, and we're only gonna get paid if they actually click on the dashboard.
5:39 Uh, we also don't need to create and manage users in Tableau Cloud, which is great. Uh, Tableau Cloud Embedded Analytics, um, allows for authentication and single sign-on.
5:50 We know we can do row level security to control the, the data, and also, uh, you can embed with minimum code.
5:58 Uh, some challenges were we were all new. We had Tableau Server, but not, uh, Tableau Cloud, so that would require Ta- new Tableau Cloud and Tableau Bridge implementation. Um- And also, uh, this, uh, Tableau Cloud embedded analytics is only available for external users. Um, you cannot, uh, have internal users ac- uh, access this Tableau Cloud, so that means we still have our internal, um, Tableau Server for all our internal reports.
6:28 And also because we don't manage users in Tableau Cloud, so there's no possibility for our users to create custom user subscriptions.
6:36 Um, so that is kind of a challenge sometimes we get asked, "Hey, can I subscribe to that?" Not if they're only embedded.
6:45 Uh, so before I get into my checklist, I wanted to recognize that this is… this was a multi-team effort. We are a very small BI team, and, um, if you wanna start a project like that, you're probably gonna need to collaborate with other teams. So the first team was the IT team. They implemented Tableau Cloud and Tableau Bridge for us. But the BI team was responsible for the permissions on Tableau Cloud, the dashboard designs, and the role of security.
7:11 Um, at the same time that we started this project, our data engineering was, um, uh, in the process of migrating our data sources to the AWS cloud. So we really had to work closely with them to make sure that the data that we needed was being migrated. And also we decided to create some data sets that wouldn't, wouldn't have PHI, um, in order to avoid any PHI exposure, and also to aggregate as much as possible, um, to have a better performance.
7:41 And another team that we really collaborated a lot with were our software engineering and the UI and UX team.
7:47 Because really, they were the one responsible for designing what the reporting tab is gonna look like in the E360 to do any UI and UX test.
7:56 They also implemented the authentication and single sign-on, and they controlled all the user permissions at the E360 level, so on the website.
8:05 All right. So, um, gonna get started through my checklist, checklist. And you're gonna see this checklist a lot throughout the presentation. So the first step was configure Tableau Cloud. So we had this brand-new Tableau Cloud, so the first thing that I did was to create projects and sub-projects. So when, um, I started this project, they were building the E360 website, and they had four different stages.
8:33 Uh, the dev, QA, staging, and prod. So we decided to create it four projects that replicate, replicate, replicated those stages. And then I, uh, created sub-projects that would match, uh, our products.
8:47 Um, so depending on the setup that you have, uh, I would recommend at least having a prod and a non-prod, uh, project, 'cause that's gonna, um, be important later on. And you wanna make sure that the, um, the dashboards you publish in lower environment, uh, do not accidentally get embedded into, like, the prod, uh, website, uh, if it hasn't been properly tested.
9:12 So that's the whole reason behind that.
9:14 Um, so it's important to know that. Then you have to create user groups. So even though we not creating new users, you still have to create groups and make sure that to allow the on-demand access, you just have that to, uh, click that little, uh, check box here.
9:32 And then same thing. I created four user groups, uh, the dev, QA, staging, and prod, and, um, added them to the corresponding, um, uh, projects and sub-projects.
9:47 Now, even though I did all that, you still have to make sure when you publish a workbook that the correct group is, um, has indeed the permission that you need. So you need at least the viewer. I have found that was the w- most common mistake when I was embedding, when, uh, a user would get an error, like content n- content not found or something like that, or you do not have permission.
10:12 That all comes back to these, uh, user groups not being assigned. So that's… Always double check before publishing that you have the correct group.
10:21 All right. That was it for step one.
10:23 Next step, I'm gonna talk about authentication and single sign-on. So first I'm gonna go through this diagram to kind of explain what's gonna happen, uh, in the background. So when a user logs into the E360 webpage and click into the reporting module, so that's the first step, uh, the E360 API is gonna construct what's called a JSON Web Token, or JWT, which contains value from something called a connected app.
10:50 And I'm gonna talk about that step right after this slide. So, uh, if you don't know what a connected app i- is, you're gonna see that, uh, pretty soon. And it contain also user attributes. In our case, it's the client ID, which is our, um, which is how we can then, um, b- uh, apply role over security, and we also have any Tableau permissions. And you can really have many more attributes.
11:15 You could sh- you could have state, you could have division, whatever, um, region, uh, whatever else you, you might need for role over security. So that's the important step there f- for the role of the security.
11:29 Uh, so on step three, the E360 is gonna response, uh, with the authentication token. So it gives it back to the webpage, and now the webpage is gonna request content from Tableau.
11:41 Uh, Tableau is gonna validate the token, and based on the token, it's gonna return the content based on, uh, based on the J- JWT, so based on those, uh, user attributes or anything else, um, on the connected app. So how do you create a connected app? Uh, pretty simple. You're gonna go to settings, and you can create multiple apps. So we did have a test app and then a production app.
12:09 Um, so once you create it, you can select, uh, the authentication mete- method. In our case, it was direct trust.
12:18 And then very important, you can restrict the access level. So for our prod, uh, connected app, we only, uh… our prod connected app is only allowed to view the prod, uh, project. So that's why it's kind of important to have, to separate prod and non-prod. And also very important, you should always restrict the domain allowed. So in our case, only people from, uh, enliven360.com, uh, are allowed to access anything, 'cause we don't wanna, I don't know, by some weird accident, somebody, uh, being able to access, uh, that is not part of EnlivenHealth or should not have access to that.
13:00 All right.
13:01 So next step, once you've created those, um, apps, you can, um, click on them, and then it's gonna give you some values that are gonna be, um, used to construct the JSON web, uh, token. So these values are called the secret ID, and I've kind of whited out. I mean, this was a test connected app, but still I whited out some of these values, so, uh, we're good here.
13:27 So there's a secret ID, a secret value, and then the client ID, but that's the Tableau client ID, not, not to be confused with some of the client ID that is, uh, part of a database, um, you know, that is internal to EnlivenHealth.
13:42 And, uh, see for the test, um, connected app, for example, we, that test connected app had, has access to all, uh, project levels, but our prod was restricted.
13:54 Um, so once you have those values, um, that's what those values are gonna be used to construct that JSON web token, and that's the example of what a token looks like. You have an iss value, which that's the Tableau client ID, a kid value, that's a Tableau secret ID, and once again, in the payload you have that iss, uh, um, value.
14:17 And then here at the bottom are the user attributes.
14:21 So one of them is that report_op_client_id, which is what we refer to the client ID in our database, and that's how you can, uh, uh, identify our clients. And then here at the bottom, these are the Tableau user groups. So that, in this case, that token says that these users, uh, um, has a client ID of 1, and it is allowed, uh, it is part of the prod, uh, uh, user group.
14:50 So, um, once we did that step, we could, we were now ready to do, to, uh, start embedding dashboards and to see, uh, what they would look like in our website.
15:03 So to embed dashboards, you have two different ways.
15:06 You can do that via HTML. So that's the s- simplest way to do it. So after you publish a workbook, if you click on the share button, you can copy the entire embed code and paste it into HTML.
15:21 Um, and that method is best for like simple embedding, embedding such as blogs, internal websites. But in our case, we, uh, have a more complicated setup because we have the full, um,
15:37 uh, role of a security, we have, you know, filters and all that. So in our case, we- it's best to use the embedding API, API. So same principle, after you publish your workbook, click on the share button, and then in this case, you're gonna copy the link of a view. So very important here, do not copy a full workbook link. So if you have, uh, a workbook with, uh, several dashboards in it, you have to copy the f- uh, link of the first view that you want the users to see.
16:11 So that's the best thing to do. So then you can copy that link, and then you paste it into the embedding API.
16:17 And you have some options, um, now, that you can actually customize a lot of these objects. So you can customize the height and the width, for example.
16:26 Uh, by default, the toolbar is gonna be at the bottom. We want it to be on top, so we change that to toolbar, toolbar=top. And also the tabs are gonna be hidden, but in our case we wanted to show them, so you just have to do height tabs=false. There's many other things that you can customize, but that's, uh, the ones, uh, we, uh, customized in our case.
16:47 All right, so that was really easy for embedding. That's probably the easiest thing to do.
16:52 Um, next, we were ready to add the role of a security. So, uh, we use something called a user attribute function.
17:00 So it's great because, uh, we don't need to use any messy entitlement table. I know that in my, uh, previous job we had a gigantic entitlement table that we had to add to all our, uh, data sets, and it was, it would slow down all the dashboards. So in this case, it's very simple.
17:20 Uh, you create something, uh, like this. So user attribute includes. It's gonna have, um, two arguments. So the first one is the report_op_client_id. If you remember, that's from the JWT, and that has to match the client ID from our data source.
17:36 So two things to, uh, note.
17:38 First of all, make sure that client ID is in your, uh, in your data source. Uh, if it's not, it's gonna try to find something that doesn't exist. And also, uh, make sure that, uh, the data types match, that this report_op_client_id is a string. Client ID in our data source is an integer, so that's why I have to pass the string argument.
18:00 Next, uh, you place that user filter as a data source filter and set it to true.
18:05 So I did that to my dashboard, uh, we published it, and when I went to open the dashboard, what happened? It was completely blank. I could see the titles, but everything else was blank. So I was thinking, "Uh-oh, something went very wrong." But then I thought about it, and, um- Actually, the, uh, user filter was working exactly as expected because I, um, uh, the system recognized I was from EnlivenHealth, and EnlivenHealth does not have any data in our data sets 'cause we collect data for our clients.
18:40 So of course, everything is null, therefore, um, the dashboards are completely blank.
18:46 So then I made sure, but I was like, "Well, I do wanna see my dashboard," so I made sure to add, uh, since I'm an admin, uh, is member of admins or the rest of the user filter, and that worked like a charm. Now I can see all my dashboards again.
19:02 All right. Uh, the next step, uh, was to finally see if we could refresh our dashboards.
19:09 Uh, as I mentioned earlier, I wish we could have done that step a little bit earlier, but we were waiting for some, uh, migration onto AWS.
19:16 So we were finally ready at that step to do that. So why do we need Tableau Bridge? Well, pretty much, um, anything that sits behind a fi-firewall, uh, whether it's on premise or on a, on a private cloud data, you will need to use Tableau Bridge.
19:33 Um, so supposedly it can handle embedded data source and publish data sources.
19:39 Uh, we install that on a virtual machine within our network. We had no issue connecting to our data sources. And you have to cr-create, uh, some, um, Bridge clients and all that stuff. And we were even able to refresh that first dashboard, uh, once. But then that was what Tableau Bridge looked like after, uh, what was that? Two weeks or something like that, after the initial success.
20:05 We only had one success, seventeen errors, and it was the same dashboard I was trying to refresh over and over.
20:11 So we really had to start investigating and, uh, trying to understand what could be the problem.
20:18 So we tried changing parameters, so the connect timeout in Tableau Bridge and the operation timeout, we kind of increased that, wanting to make sure that wasn't the issue.
20:27 We tried emptying our temp folders in cloud.
20:30 We tried restarting Bridge, downgrading Bridge, installing Bridge on the Linux VM. I removed the user filter, didn't do anything.
20:39 At some point, I was refreshing every hour, and I was checking with our, um, data engineer to see if they could see any activity on the database side. And finally, we limited our data to three months, and oh, that worked, uh, uh, consistently, but really we need more than three months of data.
20:56 Uh, so at the same time that we're trying all that, we had, uh, opened a ticket with, uh, Tableau support.
21:02 So we had someone who was really monitoring, uh, what was going on, and we were able to determine that the root cause was the data extract was too big. It was about, uh, one and a half gigabyte.
21:15 And then Tableau told us that anything above a gigabyte will fail if it's embedded in the workbook. The solution was to use a published data source instead of the embedded data source. And yes, I was able to, uh, publish the data source, and it was able to refresh it consistently, but all of a sudden, the user attribute function stopped working. So…
21:36 or, uh, it di- it never worked, I guess, with the published data source.
21:40 So the Tableau engineer, uh, was able to come to the rescue, and they were able to enable the user attribute with a published data source on our Tableau Cloud. So if you're ever into that situation where you know you're gonna need to use a user attribute function and you need a published data source because your, uh, embedded extract is gonna fail, go ahead and ask Tableau to turn on that, uh, that feature, 'cause it's not by default.
22:07 And, um, that would have saved us a lot of time if that had been by default.
22:11 Um, so Tableau Bridge now, it's a lot better. We only have one error for, you know, a hundred and sixty-three success.
22:18 So really, uh, switching to published, uh, data sources did the trick.
22:24 Okay. We're almost to the end. We had one final step to do, and that was around, uh, control content or content management.
22:32 So what do I mean by, uh, controlling content? So when, uh, a user clicks on the Reporting, uh, tab, um, there is a, uh, like some tiles that launched, uh, and that represent the products, uh, that have dashboard available. So for example, for these clients, they have products. Then if you click on View, it will, uh, open up all the different dashboards available for that one product.
23:01 And so we wanted to put in place a mechanism and, and, and that will be automated, where as soon as the dashboard is released into the prod environment, um, the, uh,
23:14 the E360 website knows where to put that dashboard, like under which, uh, tile, I guess, and which product.
23:21 So we were able to do that using, uh, tags. So, uh, didn't know you, we could create tags in Tableau, but, uh, if you open the workbook details, uh, there is a tags, um, field here that you can, if you click on Edit Tags, you can create all the tags, and then you can use the Tableau REST API to parse those tags. So in this case, that's an example of a tag here.
23:46 So we're telling the Tableau Res-REST API to put this, uh, dashboard in the prod environment, so that's what you see, the Stage Prod. If you had said Stage Dev, that would have been meaning to go into the dev environment, and the module represent the product tile. So it's saying, "Okay, put this dashboard into the personalized communicati-communications, um, uh, tile." And that worked great at first when we only had, like, maybe a f- a few dashboards and a few clients, but it requires multiple cli-qui-queries, and it was really not, uh, scale, scalable.
24:21 And also, it didn't allow for the le-level of details that we were looking for. Because really, if you think about it- In our case, not every client has access to all products, so we don't want a client to view blank dashboards for, uh, if they don't have a product.
24:37 And also within the product, um, we have, like, several dashboards, and sometimes some of these dashboards are not relevant to them because we have some customization for some of our products. So if they don't subscribe to that, uh, customization, th- it doesn't make sense to view that dashboards. So we couldn't achieve that with the tags, so then we switched to, uh, building our own database where we can activate a client to a specific dashboard.
25:01 So this is, um, kind of what our database looks like. We have three tables.
25:07 The first one is what's called a report group. So think about it as our product. So you have that represent those initial tiles, where you can have nav- name and description.
25:19 The second, uh, table is a report or dashboard.
25:23 So that's where we, we put the name of the dashboard description and then the, the, that visUrl, which is that, um, link of the, uh, the view that you want the, uh, user to land on, and notice how they're related, uh, to the report group or the report provider. And then finally, we have an organization report table. That's where we put our clients, um, o- and, um, so each client, your, an organization, and report ID.
25:57 So that's how you can achieve, uh, this at the bottom, where the Client A has access to that, uh, to two dashboards within that connected VR product. And Client D, for example, has access to only one dashboard on the connected VR, but also has access to a dashboard in that IDR, IQ, um, uh, product. And this, as soon as we enter, um, uh, this information, uh, like, so for example, if I add new data to that organization report, it's, like, instantaneous.
26:32 Then I can go into V360, uh, website, and I'm gonna see, uh, that that client is activated.
26:41 All right, so that's it for all our, uh, all our steps.
26:46 So now I'm gonna give a brief timeline. So the project actually kicked off in 2021. I had just started working at EnlivenHealth, and we did a very, uh, crude proof of concept. So we didn't even have our Tableau Cloud Embedded Analytics, so we did a proof of concept with our Tableau Server. Uh, so we didn't have SSO, and we didn't even have Enliven 360 yet 'cause it was still being built, so we just used it on one of our legacy products, so one of the website of a legacy product.
27:14 But we just wanted to prove that, hey, um, yes, uh, it can work. Uh, I mean, sure, you still have to log back into Tableau, but, uh, at least we could put a dashboard in there. But in December, the project was paused for competing, uh, priorities, so, and at that point, I didn't even know if the project was gonna get, uh, kicked back off again.
27:37 But in August 2023, uh, I was informed that Tableau Cloud Embedded Analytics was installed, so I started, um, um, playing around i- with it and organizing it with the projects on Projects.
27:51 Um, but the website was still being built, so I had to wait until January '24, 2024, to kind of, uh, do that, uh, JWT connected app set up.
28:03 By March, we had, uh, completed the UI/UX, and by May, I had finished the dashboard design, and we had tested that single sign-on, and everything was working correctly. Um, finally, by July, we, our tables mi- migrated to AWS, so then I spent quite a few weeks repointing all the dashboards to the new tables.
28:25 And then it took about a month for the Tableau Bridge ma- mail down to be resolved.
28:30 Uh, and at that point, I was getting a little bit nervous because our first customer was supposed to be live in October. Luckily, they went live in November, so I had time in October to do the publ- the published data source set up, and then our first customer went live in November.
28:45 So today, though, so from that first client, now we have 88 clients, uh, in our E360 that have access to dashboards. We have eight unique dashboards available, and s- it's total of, uh, 188 dashboards that are activated since most clients have, have at least two dashboards that are activated.
29:06 Um, so some lesson learned.
29:09 Because it involves a lot of team, I would make sure that all the teams have the same priority. We had a lot of stop and go. Uh, but while I was waiting on some things to be finished, I really made sure that, um, I was working on my part so that when people were ready for me to test something, uh, we'd be ready for them.
29:28 I wish we could have tested Tableau Bridge earlier. That's the big lesson there. Um, I talked about the embedded extract. Uh, if it's more than a gigabyte, go ahead and use a published data source. Always double-check your permissions, since that is the number one cause of error, I think, in embedding. And also some- something that I found, um, when I was trying to improve performance on some of that, our dashboards, I tried using acceleration, but it will negate the user attribute filter, uh, once again.
29:55 So you cannot use acceleration if you have a us- user attribute filter.
30:01 Okay. And I have some resources for you. Uh, I actually used those quite a bit when I was doing that project. But one of the main, uh, one of the best thing you can do, uh, if you're going to TC'27, is to attend a hands-on training on Embedded Analytics. I attended that training in, um, I think a few years ago, and that really helped me, uh, 'cause you're gonna go through that c- creating a connected app, um, creating JWT, uh, embedding, and changing some of those, uh-
30:32 Customizable fields there. So I recommend it if you wanna start a project like that.
30:38 And now we're gonna have a demo.
30:40 I am now going to do a quick demo of our Enliven 360 platform.
30:45 So here, imagine that customer A just logged into our E360 website.
30:52 The left panel and the middle section show all the products that are available for this client.
30:59 If the client clicks on the reporting module, it will launch a new window.
31:05 You can see that this client has access within the reporting module to two different products: Adira IQ and Connect.
31:14 If you click on Connect, for example, it launches the list of all the dashboards that are a- available for the selected product.
31:22 In this case, this client has three dashboards available for Connect.
31:27 And if we go back to Adira IQ, it only has one dashboard available.
31:34 Now let's take a look at a different client. Now, this client has only one product available, Connect, and within that product, he only has one dashboard. And finally, let's take a look at yet another client. This client, once again, only has one product available, Connect, but under Connect, it has three available dashboards. This illustrates how content management is enabled, and ensures that only clients see relevant dashboards.
32:05 Now let's take a look at what happens when we launch a dashboard.
32:09 Go to Adira IQ.
32:11 I'm gonna click on View, and the lash- dashboard launches, and the client did not have to log back into Tableau Cloud.
32:21 It was all single sign on.
32:23 So for this particular demo, we are using demo data, which is an aggregate of data that has been de-identified, and that is safe to use.
32:33 To make the dashboard bigger, you can collapse the left panel, or you can make into a full screen here. And here the dashboard perform exactly as if the client are logged into our Tableau Cloud. You can use filters. You can navigate between different tabs. You can, uh, click on the Download button here that are created in the dashboard, or if you exit the full screen, uh, there's more option under the Download option.
33:03 Now I want to show you what happens on the permission side. I'm going to hop on to our Tableau Cloud.
33:10 So this is our Tableau Cloud, and these are the four groups that I mentioned during my presentation: Sales, Prod, QA, Stage. Let's take a look at the Stage group and confirm that this group is enabled for on-demand users.
33:25 So it is available for on-demand users, and that's why you are now going to have a list of users, 'cause everything is happening on demand.
33:35 So now let's see what happens if I remove the permission for the Stage group for one of the dashboards.
33:49 I'm going to select this demo dashboard.
33:54 Go to the permission.
33:57 That's the Stage group, and I'm going to deny access to that group.
34:04 Now let's go back to E360.
34:08 Personalized AVR Performance Summary Demo is the dashboard where I changed permission, so let's see what happens if I click on View.
34:18 "The content you are looking for does not exist," which is a classic error of permission not being enabled, so always check your permissions, uh, before you publish. So let's fix that.
34:30 Gonna go back here.
34:33 Select View.
34:35 So we do not allow explore for our on-demand users, because we do not want them to have…
34:42 to be able to download the full data, uh, which is an extra layer of protection, um, to protect our data.
34:50 So now let's go back here, and the dashboard loads normally, and this is it for the quick demo.
35:00 Uh, does anyone have any, have any question?
35:03 Jeff Hancock: Yeah, I had a question.
35:04 Emilie Smith: Yeah.
35:04 Jeff Hancock: Um, all of your users are in Active Directory already, right? So you are synchronizing that-
35:10 Emilie Smith: No, no
35:10 Jeff Hancock: No?
35:10 Emilie Smith: They're not. It's all on-demand. So, like, w- we don't…
35:15 I, I don't deal with any Active Directories.
35:18 So somebody on the E360 side, like the website, we have users there, because when they-
35:22 Jeff Hancock: Okay
35:22 Emilie Smith: … subscribe to our product. But, uh, from the, the Tableau Cloud perspective, I don't have to, to do anything except creating those groups and select the on-demand usage, and that's it. They're gonna be permission v- via the JWT. That JWT, that's what carries all that information about, uh, uh, like, kind of who the… well, not who the user is, but, like, what client ID, what attribute that, uh, client ha- that user has, and so what they, what they can see, I guess, in, uh, Tableau based on that attribute.
35:57 So based on the client ID, ba- ba- based on the if they're a prod or a dev user, that kind of stuff. But yeah, no, we don't have to do a… Yeah. I didn't have to create a single user-
36:08 Jeff Hancock: Okay
36:08 Emilie Smith: … in Tableau Cloud.
36:10 Jeff Hancock: So what's your identity store in Tableau then?
36:14 Emilie Smith: I, I don't… Yeah, I don't have… Uh, in Tableau, I don't store that, uh, that… I mean, so I can see their activity, because it has a weird so- whatever comes from the JWT.
36:27 Jeff Hancock: Mm-hmm.
36:27 Emilie Smith: Uh, if I look at who has seen the dashboard, but it's like, it doesn't have a username or anything. It's just, like, a, a string, I guess. And that I could probably, um- Be able to, uh, if I went into the E360 users and knew who the users are, I could see who had viewed the dashboard. But yeah, in Tableau i- it's kind of masked, if you know what I mean.
36:51 Like, it's not gonna-
36:53 Jeff Hancock: Yeah
36:53 Emilie Smith: … I'm not gonna see, like, so and so from this company has viewed that. I can't see that from the Tableau side.
36:59 Jeff Hancock: Okay.
36:59 Chris McClellan: Be- because it's embedded analytics, right? You're not creating the user. You're just saying-
37:03 Emilie Smith: Yeah, you're not creating the users
37:03 Chris McClellan: … you've got access.
37:04 Emilie Smith: Yeah.
37:05 Chris McClellan: Yeah.
37:05 Emilie Smith: Yeah.
37:05 Jeff Hancock: Right. But on the Tableau side, it has to link to something, so you probably have a local identity store, and-
37:11 Emilie Smith: Oh
37:11 Jeff Hancock: … with predefined users that you're connecting these-
37:15 Emilie Smith: Yeah
37:15 Jeff Hancock: … uh, JWTs to
37:16 Emilie Smith: So these users are created in the, in the website itself, so in the E360, which I don't manage that. I don't have that level of permission. We have somebody else who manages those users, but I don't have to do anything in Tableau. I just say allow on-demand and, um, and yes, and I think they use, uh, Cognito, is… That's what they use for the E360.
37:37 Jeff Hancock: Mm-hmm.
37:37 Emilie Smith: Uh, but it's compatible. That's the thing, the Tableau Embedded, uh, Tableau Clouds, uh, Tableau Embedded Cloud is compatible with a bunch of different methods. So, you know, like, um… But yes, from the Tableau side, somebody from the E360 side has to do that, but not me. I just put that on-demand access and yeah.
37:56 Jeff Hancock: Okay.
37:58 Chris McClellan: I, I, I know, Jeff, even when I saw this, it was, it was hard at first. It's like you're not creating a user in Tableau-
38:04 Emilie Smith: Mm-hmm
38:04 Chris McClellan: … but you've got authentication to s- to know-
38:07 Emilie Smith: Yes
38:07 Chris McClellan: … who that is enough-
38:09 Emilie Smith: Which, which
38:09 Chris McClellan: … so they can log in-
38:10 Emilie Smith: Yeah
38:10 Chris McClellan: … and see stuff.
38:10 Emilie Smith: That's the JWT part.
38:12 Chris McClellan: Yeah.
38:12 Emilie Smith: That's important, uh, 'cause they, yeah, they have to be authorized. 'Cause if a user is not authorized to view reporting, they will have an error. Like, Tableau's gonna be like-
38:21 Chris McClellan: Right
38:21 Emilie Smith: … "No, you're not authorized. You can't," you know, get… Yeah, it works.
38:26 Jeff Hancock: Yeah, it, it sounds like you've got predefined user types that belong to certain groups and have certain attributes, and you're just linking that JWT to those predefined user types which aren't actually defined users on the Tableau side.
38:40 Emilie Smith: Yeah, they're not defined users. That's why, um, like, like I said, when I go to look at the activity, uh, yeah, this stuff don't make sense. Like, I don't know who's really viewed. Uh, but we can see that 'cause we track activity on our E360 website, so I can… I see the activity-
38:56 Jeff Hancock: Sure
38:56 Emilie Smith: … somewhere else, but not, not really in Tableau Cloud. Yeah.
38:59 Jeff Hancock: Oh, understood. Yeah, they… I… We're trying to solve a similar problem, uh, but it doesn't sound like this solution would work for us just based on the, the reporting needs that we have. And I don't think, I don't know if, if our equivalent to your 360 would provide enough, uh, reporting, uh, detail for our use case. But it is, it is interesting, and, and it will give me something to investigate further.
39:24 Emilie Smith: Yeah. And the good thing is we don't pay for licenses, 'cause I know I get… I have that question a lot, even from our internal stakeholders, like, "How much is that gonna cost us?" I'm like, "It's… You know, you can have a limited-
39:35 Jeff Hancock: Free.
39:35 Emilie Smith: Yeah. Well, not free, but like- They don't… You know what I mean. People are not on the dashboards all the time, you know? So it's like-
39:42 Jeff Hancock: Yeah
39:42 Emilie Smith: … yeah, it's
39:43 Jeff Hancock: Yeah, they're ephemeral users.
39:44 Emilie Smith: Yeah.
39:44 Chris McClellan: Mm-hmm.
39:44 Emilie Smith: It's very cost-effective, so.
39:47 Jeff Hancock: Yeah. Yeah, you have… You only need as many licenses as you have predefined user types, and then you have-
39:54 Chris McClellan: Mm-hmm
39:54 Jeff Hancock: … the, the JWTs that connect to those user types.
39:57 Emilie Smith: Yeah, that's the con… Yeah, that's the connector. Yeah.
40:02 Chris McClellan: So I, I don't expect you to sort of say exactly how much it costs you, but when I've done the calculations before for Embedded Analytics, it feels really expensive.
40:11 And you were saying-
40:12 Emilie Smith: Mm
40:12 Chris McClellan: … it's a lot cheaper than actually buying a license for every, every different client in your list.
40:15 Emilie Smith: Oh, yeah, because we have 88 clients already.
40:18 Chris McClellan: Yeah.
40:18 Emilie Smith: And they each have two or three users.
40:21 Chris McClellan: Mm-hmm.
40:21 Emilie Smith: So, I mean, that's, you know, uh… It's pretty expensive. So, uh, I don't know. For, for us, I mean, I didn't do the calculation 'cause I wasn't the one making that decision.
40:32 Chris McClellan: No.
40:32 Emilie Smith: But I know they were like, "Yeah, we're gonna do that 'cause it's gonna be cheaper." And we're still enrolling people. Like, we've grown, like I said, from, you know, one client to 88, and we still have a lot to go. So.
40:43 Chris McClellan: Yeah.
40:44 And, and that might be the distinction, 'cause when I was looking at it, it was a, it was a client that was gonna do public-facing dashboards. Like-
40:50 Emilie Smith: Mm
40:51 Chris McClellan: … the general public, anyone in the world can-
40:52 Emilie Smith: Oh, if it's public-facing, then yes
40:54 Chris McClellan: … can, yeah.
40:54 Emilie Smith: If it's always on, yes, you're gonna have a lot of impressions. That might not be the case. But in our case-
40:58 Chris McClellan: Yeah
40:58 Emilie Smith: … they have to log in. I mean, they have to be intentional about, "Oh, you know, I have to-"
41:03 Chris McClellan: You've locked it down to-
41:04 Emilie Smith: Yeah
41:04 Chris McClellan: … it has to be that, that group of users-
41:06 Emilie Smith: Mm
41:06 Chris McClellan: … rather than anything else.
41:07 Emilie Smith: Yeah.
41:08 Chris McClellan: Yeah. And John's question was, "Do you have any tips or resources on formatting and sizing for embedding?"
41:15 Emilie Smith: Ooh, that… I don't know if the, um… Hmm.
41:20 Check one of the, the link to my resources maybe that I shared. May have had some of that.
41:28 Chris McClellan: I think, John, I don't know if you wanna unmute, but sometimes that's related to responsive website design and things like that.
41:34 Emilie Smith: I know we had to play around with the height and width, and even then it's not perfect, but if you click on that, uh, view full screen, then they can see the, the whole thing. But-
41:44 Chris McClellan: Awesome. We'll move on. That… But that, that was great. It was, um, it was a, a really good walkthrough of how Embedded Analytics works.
41:51 Emilie Smith: Yeah.
41:51 Chris McClellan: How to set up the tokens. Um, you know, when I first saw this, I'm a bit like Jeff. It's just like, but how do you define the users? Where are the users defined? And they're, they're not. As you said, they're ephemeral. They- The s- the session, the session exists while they're logged in, and then they're not there anymore.
42:09 Emilie Smith: Mm-hmm.
42:10 Chris McClellan: But it's cool. It's a better way of using Tableau for, for your situation.
42:15 Emilie Smith: Yeah, it worked for us. That was a good use case.
42:17 Chris McClellan: Yeah.
42:17 Emilie Smith: But yeah.
42:18 Chris McClellan: Awesome. And we can keep typing in the chat if there's any more questions.
42:22 Here's Emilie's contact details, so LinkedIn and Tableau Public obviously, if you need to get in touch with her as well.
42:29 And, uh, survey time. So I'll start the quiz timer to give you three minutes to either click on the link in the chat, if you haven't done that already, uh, or just scan the QR code on your phone. The quiz has changed today because you'll see that there's the standard few questions that we ask at the beginning and the end, and, uh, and the t- the questions are timed now, so it's basically fastest finger works, not trying to get a, your name with the number of As in the front so you get sorted at the top.
42:59 And while we're waiting for that, Noe says, uh, "Embedding it on our website was tricky, but I was glad we got it done. It does help with saving on users' licenses." So yeah, if you've got a, if you've got a, a restricted group of, as Emilie said at the start, they have to be external users, not within your company, and, um, and if you can set it up like that, then it works perfectly.
43:21 There's a few standard questions in here, and obviously we have some, a few quiz questions that change every day. But where do you live? We've got people from Canada, the US, Australia, uh, as always.
43:32 Uh, what industry do you work in? Just to sort of show where Tableau can be used. Obviously a lot of different, uh, ones in there. IT and education stand out for today.
43:44 And how many years have you, have you been using Tableau? So a good range there as well. Um, as I said, everyone starts off at zero and you just work your way up as you go through.
43:53 And, um, it's September, right? So it's now my anniversary. I think I've been using Tableau for more than 12 years. Well, I first learned it 12 years ago.
44:03 Um, questions for today. In Tableau, which filter type is applied before the data is aggregated and can improve performance when working with large extracts? That would be the data source filter.
44:15 All these questions are generated by AI, but I did check them. I'm sure that's the right answer there.
44:21 And when you create a calculated field using a fixed LOD expression, at what point in Tableau's order of operations it is evaluated?
44:30 After the context filters but before the dimension filters.
44:34 And question three was: Which statement about Tableau's Show Me panel is true?
44:39 The true answer was, it suggests visualizations that are possible with the selected fields, 'cause none of those other ones make sense.
44:48 And the next question was, in Tableau, what is the default aggregation for a newly added numeric field placed on rows or columns? That's sum. Obviously those other ones, you can change the default aggregation to be that, but if we haven't customized that, then that's the right answer. It's always sum at the start.
45:08 And, uh, interesting responses. Which level of detail calculation returns the average sales per customer across the entire data source, ignoring view filters except for context filters?
45:20 So that has to be a fixed based on customer ID average sales.
45:26 Um, those are all the quiz questions for today. The other questions, obviously, what topics would you like to see in future meetings?
45:33 TC26, AI, and Tableau.
45:37 Had a little bit of AI last week with the MCP presentation, but Tableau Next would be good.
45:43 And who would like to see presentation or who would you like to see present at future ones? Anyone. Okay. That's, that's, um, something for me to look at. And the leaderboard is different for today because it's based on times.
45:56 Um, okay.
45:58 That's interesting.
46:00 So I deliberately answered slowly, but, uh, but obviously I'm still answering too fast. Maybe I shouldn't compete in the quiz. The, the funny thing is I know all the answers because I basically vetted the questions, but it's good to see that we can now rank in order of speed of reply.
46:17 Um, I've just got to not reply as fast, right? But I'm cheating. Take me out of it. Emilie wins. Cam will come second. Anne comes third.
46:26 Jost and Jeff's fourth. That's good.
46:29 Noe did it twice. That's good. Coming back to our presentation, obviously, as I said, all, all those questions, the quiz questions, are generated by AI usually. If you want to submit your own questions, just scan the QR code, use that link, um, contact me on anywhere to, um, to get those details as well. You can use those for, that system for your TUG at the same time.
46:53 And our next TUG meeting is Nathan talking about becoming a Tableau Triple Threat.
46:58 So if you're here today, then in eight days' time from now, Europe's still a little, a little bit hard, it's in the middle of the night, but it's a, a good, it's an okay time for Australia and the US to attend that. Or you can watch that recording, you can watch this meeting again recorded. A whole heap of other TUG stuff is on YouTube at TeamDataFam.
47:19 Uh, there's the full length videos, the shorts. You can also listen to the podcast on Spotify or Apple.
47:25 And email me at team.DataFam@Gmail.com if you've got any questions.
47:30 But thank you, Emilie, for that. It was awesome to see that. Sort of better than being at TC because we can ask you questions as, as we go.
47:37 But it was great to see how you've in, how you've used Embedded Analytics in your application to provide dashboards to your clients as well.
47:45 Emilie Smith: Thank you. Thank you for having me.
47:47 Chris McClellan: Awesome. Um, and if anyone wants to unmute and say anything, or that's the end of the meeting for today.
Shorts for this TUG
- From drug discovery to dashboards 1:13
- Why we stopped emailing PDF dashboards 4:49
- Pay for usage, not licenses 5:20
- The #1 mistake when embedding Tableau 10:01
- Row-level security made everything blank 18:05
- Tableau Bridge: 1 success, 17 errors 20:05
- Embedded extracts over 1 GB will fail 21:15
- User attributes with a published data source 21:40
- From 1 client to 88 in embedded Tableau 28:48
- Don't use acceleration with user attributes 29:44
- The users don't exist in Tableau at all 41:57