<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://www.highperformance.tech/blogs/tag/tableau-cloud/feed" rel="self" type="application/rss+xml"/><title>High Performance Technologies - High Performance Technologies Blog #tableau cloud</title><description>High Performance Technologies - High Performance Technologies Blog #tableau cloud</description><link>https://www.highperformance.tech/blogs/tag/tableau-cloud</link><lastBuildDate>Thu, 23 Apr 2026 06:37:47 -0700</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[Bring Tableau and Agentic Analytics Together with the VDS API]]></title><link>https://www.highperformance.tech/blogs/post/bring-tableau-and-agentic-analytics-together-with-the-vds-api</link><description><![CDATA[We talk with a lot of companies that want AI in their analytics practice, but aren't totally sure what that looks like. Many of them want it enough ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_RMAPxqigS92nnBj0B8_cOg" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_V1oLFlDNSM-to5AuuosMdQ" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content- " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_m0kg8GLPQxC9duxaZjzdwA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-8 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_74ibrWaaGUOh2W1vw4r7sA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>We talk with a lot of companies that want AI in their analytics practice, but aren't totally sure what that looks like. Many of them want it enough that they are tolerating some oddities they shouldn't be, especially as they're exploring feature sets that haven't yet proven their worth. Specifically, they're having to build/define the same data sources and metrics in the AI system, simply because the AI system can't handle connecting to what's already there.</div></div>
</div><div data-element-id="elm_70qtiLwgHa-FY-VkdqH8Rg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div style="text-align:left;">I've been working a lot with Ana, the agentic AI analyst made by TextQL, and have been extremely impressed by how it's able to navigate querying and connecting data from many different data sources, including APIs. Its command of Python and the iterative nature of analytics is the best I've seen. So I thought it might make sense for me to have Ana use Tableau's VizQL Data Service API to connect to Published Data Sources on Tableau Server (or Cloud), and see how it handles interacting with and querying the very same data sources that Tableau dashboards use. It took some iteration but worked out well. So I'm showing you how I did it!</div></div></div>
</div><div data-element-id="elm_aoW7YLHj1ghC5RoHo7Kxsw" data-element-type="text" class="zpelement zpelem-text zp-hidden-md zp-hidden-sm zp-hidden-xs "><style> [data-element-id="elm_aoW7YLHj1ghC5RoHo7Kxsw"].zpelem-text { background-color:#F3CECE; background-image:unset; border-style:solid; border-color:#D42B2B !important; border-width:1px; border-radius:4px; padding-inline-start:10px; } </style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><span style="font-style:italic;"><span style="font-weight:bold;">pssst.</span> if you'd like to see me&nbsp;actually&nbsp;do this live, register for the webinar on the right. i'd love to see you there</span></div>
</div><div data-element-id="elm_XYyrUMIK19BL3MSMHy9PLw" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Inline Snippet 1 - Compact Banner --><!-- For Zoho Sites: Add as Custom HTML element between paragraphs --><style> .hpt-webinar-inline-1 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #f7f7f7; border-radius: 10px; padding: 20px 24px; margin: 32px 0; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; position: relative; overflow: hidden; border: 1px solid #e8e8e8; } .hpt-webinar-inline-1::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: rgb(235, 77, 94); } .hpt-webinar-inline-1 .content { flex: 1; min-width: 250px; } .hpt-webinar-inline-1 .label { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; color: rgb(200, 60, 75); margin-bottom: 6px; } .hpt-webinar-inline-1 .label svg { width: 14px; height: 14px; } .hpt-webinar-inline-1 h4 { font-size: 16px; font-weight: 600; color: #2a2a2a; margin: 0 0 4px 0; line-height: 1.4; } .hpt-webinar-inline-1 .meta { font-size: 13px; color: #666; } .hpt-webinar-inline-1 .cta-btn { display: inline-block; background: rgb(235, 77, 94); color: #fff; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 14px; white-space: nowrap; transition: background 0.2s, transform 0.2s; } .hpt-webinar-inline-1 .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } </style><div class="hpt-webinar-inline-1"><div class="content"><div class="label"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"></polygon><rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect></svg> Live Webinar · Dec 18 </div>
<h4>Unlock AI-Powered Analytics on Your Existing Tableau Data</h4><div class="meta">Live demo of Ana + Tableau VDS Integration · 11:00 AM CST</div>
</div><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Free </a></div>
</div></div><div data-element-id="elm_32fGC8sMVPl4os-XJoYyGA" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">What's VDS?</h3></div>
<div data-element-id="elm_dqTBNg-2ryy0Hc9qpcNbbw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Tableau's&nbsp;<a href="https://help.tableau.com/current/api/vizql-data-service/en-us/index.html">VizQL Data Service</a>&nbsp;API (VDS) gives you programmatic access to Published Data Sources on Tableau Server/Cloud. Since it's the same data sources your dashboards use (and therefore the same data model), you can reuse the field names, calculations, and relationships you've already defined. It automatically respects row-level security and permissions. There's no need to download extracts or hit underlying databases directly, risking bypassing the governance you've already established in Tableau. Instead, everything goes through Tableau's governance.</div></div>
</div><div data-element-id="elm_QYCAokRwW-YjX9Ag3PzF3Q" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>In contrast to the REST API, which is powerful for managing metadata and performing administrative operations, VDS provides a more direct way to access data. While the REST API allows you to download detail or summary data from specific visualizations, it requires an extra step. VDS lets you query the Published Data Source itself, just like the dashboards do, making it a more seamless option for accessing data.</div></div>
</div><div data-element-id="elm_oPNX3X_uMOX2zFRIbXy5Rg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Who or What is Ana?</h3></div>
<div data-element-id="elm_k9w5bEuJmrBJp3ZSoi304g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Ana is an agentic AI analyst built by TextQL. It's excellent at querying and coding (especially making API requests), tool calling, and iterative analysis. It understands data structures and relationships intuitively, and can reason about analysis steps. It can hold context across many many steps, build on previous queries, and create artifacts like Streamlit apps, static visualizations, downloadable reports... even playbooks that email you or Slack you their results after they run. (Yes, it supports Teams too...)</div></div>
</div><div data-element-id="elm_RnPVsIw7Vpbvk3KbxYMfjQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div>And it's observable: you can see what it's doing, how it's doing it, and thanks to inline comments, <i>why</i> it's doing what it's doing.</div></div></div>
</div><div data-element-id="elm_GHb4XYkxtdXC_RHUoiFDaQ" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Connecting Ana to Tableau with the VDS API</h3></div>
<div data-element-id="elm_9X70gTY71aA-hwfUhl9KUQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>To connect Ana to Tableau's Viz Data Service, we need:<br/><ul><li>Tableau Server/Cloud with Published Data Sources</li><li>Ana (hosted by TextQL) as the AI analyst</li><li>VDS API to let Ana query Tableau's Published Data Sources</li></ul></div></div>
</div><div data-element-id="elm_r1nC5rUqZoCePiXcL-d6sw" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Setting Up</h4></div>
<div data-element-id="elm_u4gkPzT7u2O-6KWz9FQu7w" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h5
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true"><span>Teach Ana about the relevant technologies using the Context Library</span></h5></div>
<div data-element-id="elm_Aie2u0tRQWOidKHrU81ejg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><div></div><div></div><div style="text-align:left;"><div><div><div>To start out, we gave Ana some context that makes it better at using the relevant tools. Ana has a context library where you can store information that can be dynamically added to a chat's context based on user roles or which data connectors are selected for the chat. As TextQL admins, we can add this context from the &quot;Organization Context&quot; tab on the Settings page. It's quite straightforward:</div></div></div></div></div>
</div><div data-element-id="elm_zNk0W2i2Y9mzvmpj4NjiMg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_zNk0W2i2Y9mzvmpj4NjiMg"] .zpimage-container figure img { width: 730px ; height: 587.65px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/organization-context.gif" size="fit" alt="A visual walkthrough of creating a context snippet and associating it with the Admin and Member roles." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_YyGFZ-tSwu6kLn_TS7d6MA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div>To be clear, this context is not strictly required! It just allows Ana to cut through some repetition and trial-and-error, which saves us time and money. It took some iterating, and we ultimately landed on context that includes:<br/><ul><li>Authenticating to Tableau - using a Personal Access Token, in this case; more on that in a moment...</li><li>Finding the data source - using the good old-fashioned REST API</li><li>Exploring fields/metadata - using the new VDS API</li><li>Constructing queries</li><li>Analyzing results and iterating</li><li>Filtering strategies</li><li>Performance tips</li><li>Common patterns:</li><ul><li>Simple query</li><li>Searching with fuzzy matching</li><li>Complex filtering</li></ul><li>Error handling</li><li>Additional resources</li></ul>Here's the raw text we use that you can easily copy and paste into your own context library:</div><p></p></div>
</div><div data-element-id="elm_VmocnN6MRhzDHCQyk3CIzw" data-element-type="buttonicon" class="zpelement zpelem-buttonicon "><style></style><div class="zpbutton-container zpbutton-align-left zpbutton-align-mobile-center zpbutton-align-tablet-center "><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-link zpbutton-size-md zpbutton-icon-align-left " href="/files/ana-vds-api-context.txt" download rel="nofollow noopener"><span class="zpbutton-icon "><svg viewBox="0 0 24 24" height="24" width="24" aria-label="hidden" xmlns="http://www.w3.org/2000/svg"><path d="M11 5C11 4.44772 11.4477 4 12 4C12.5523 4 13 4.44772 13 5V12.1578L16.2428 8.91501L17.657 10.3292L12.0001 15.9861L6.34326 10.3292L7.75748 8.91501L11 12.1575V5Z"></path><path d="M4 14H6V18H18V14H20V18C20 19.1046 19.1046 20 18 20H6C4.89543 20 4 19.1046 4 18V14Z"></path></svg></span><span class="zpbutton-content">Download the Code Snippet</span></a></div>
</div><div data-element-id="elm_qXEunLlEUyj4yfSZ-RItVA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">With that in place, we need to ensure Ana can authenticate to the Tableau APIs when it needs to.</div>
</div><div data-element-id="elm_4-OcJY6ENpJ2rIqdYhpYdQ" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Setting Up Authentication</h4></div>
<div data-element-id="elm_Y0xFBmwQqL4dCoQNiqFs1Q" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div><div>Personal Access Tokens (PATs) are credentials you create in Tableau that let you authenticate to Tableau APIs without using your own username and password. They are revocable, and they keep you from exposing your actual credentials in various systems, scripts, or configuration files. If your Tableau account uses multi-factor authentication (MFA), like Tableau Cloud accounts often do, then PATs are&nbsp;<span style="font-style:italic;">required</span>&nbsp;for programmatic access since it can be difficult to complete an MFA challenge within an automated workflow.</div></div><p></p></div>
</div><div data-element-id="elm_KVi5iyfsDPIBb5EPxL5sHw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>Creating a PAT in Tableau is very straightforward, and you can see a step-by-step guide here if you haven't done it before, or if you need a refresher: <a href="https://help.tableau.com/current/pro/desktop/en-us/useracct.htm#create-and-manage-personal-access-tokens" title="create and manage personal access tokens" target="_blank" rel="">create and manage personal access tokens</a>.</div><div><br/></div><div><div><span style="font-weight:bold;">Note:</span> Personal Access Tokens <span style="font-weight:bold;">do</span>&nbsp;have an expiration date on them! Based on my personal experience, it's useful to create a reminder a week or two before a PAT expires so you have a chance to create a new one and switch them out before it simply stops working. &quot;A bit of prevention is worth a byte of cure&quot;, as they say.</div></div></div>
</div><div data-element-id="elm_bGLChkXbIE0bBbvY41jYcA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_bGLChkXbIE0bBbvY41jYcA"] .zpimage-container figure img { width: 730px ; height: 385.77px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/personal-access-token.png" size="fit" alt="Example of the Personal Access Token screen displaying a new PAT." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Ma79foOsNaqjc1xrtUcD5g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Now that we have a PAT from Tableau, we need to store that in a place Ana can find it: the Environment Secrets. As the name suggests, Environment Secrets behaves like a password manager for Ana, allowing it to reference sensitive information like credentials without having to type the details out in the code verbatim.</div>
</div><div data-element-id="elm_DrmGyRQes7RXBa1s5o_LWA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">These secrets don't necessarily have to follow an exact pattern, because Ana can inspect them and determine the most appropriate way to use them. I prefer to store them as JSON with a little extra helpful information. In fact, if you downloaded the context snippet from earlier in the post, you'll want to follow the same structure I do. The structure is documented in the snippet, and the snippet's code examples depend on it. Here's what that looks like:</div>
</div><div data-element-id="elm__bOcSr-vhamJCFG2nC6nNg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div></div><code>{&quot;server&quot;: &quot;https://tableau.example.com&quot;,&quot;tokenName&quot;:&quot;YOUR_TOKEN_NAME&quot;,&quot;tokenSecret&quot;:&quot;YOUR_TOKEN_SECRET&quot;}</code></div>
</div><div data-element-id="elm_CFgJDwErwrGNgyarA3DMpw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>From here, we navigate to the Settings &gt; Configuration &gt; Manage Secrets page, and create a new secret. We'll need to fill out:</div><div><ul><li>Secret Name - we refer to it as TABLEAU_PAT in our context snippet, so if you're following along, you should too.</li><li>Secret Value - the single line of JSON above, filled out with the relevant values.</li><li>Instructions - Ana sees these instructions in every chat context so it knows when to use which secret. Be sure to give it enough info to make those decisions! In this example, the instructions were: &quot;<span>Use this PAT to authenticate to Tableau Server using their REST API; the authenticated session can be used for other Tableau APIs as well.</span>&quot;</li><li>Docs Links - Any links to reference documentation that may be helpful when using the secret.</li></ul></div></div>
</div><div data-element-id="elm_0o-2fGPjqihK_LlmVbiahA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Here's what the screen looks like just before we click Create:</div>
</div><div data-element-id="elm_xBoJL4gv57460WkFBOPzmg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_xBoJL4gv57460WkFBOPzmg"] .zpimage-container figure img { width: 730px ; height: 422.03px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/secrets-manager.png" size="fit" alt="The &quot;Environment Secrets&quot; page with an open modal for adding a new secret." data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_u2pxtZheLU7NR7y5cSgTvQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><span style="font-weight:bold;">Note:</span> After you click save, you won't be able to edit or view the secret's details again. If that's a concern for you, there's an easy and more flexible solution we typically use, but that'll have to be a different blog post!</div>
</div><div data-element-id="elm_GkY9CC5JpbNDJeT3Uhi9zQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div>At this point, we've given Ana enough information to:</div><div><ul><li>connect to Tableau using the URL and PAT details from the secret, and</li><li>skillfully use the relevant APIs to authenticate, search for data sources, explore their metadata and data, and query!</li></ul></div></div>
</div><div data-element-id="elm_xLNFEnvddiLTI4GUzg6wfQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Let's see how it works by creating a new thread and asking a question.</div>
</div><div data-element-id="elm_9xFRh6Utgcew20LvxzRzEw" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Chatting With Our Data</h3></div>
<div data-element-id="elm_KRqiUVpV3Cc0XT5JmYIdxA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><div><div>For demo purposes, <a href="https://www.kaggle.com/datasets/bhanuthakurr/cleaned-contoso-dataset?phase=FinishSSORegistration&amp;returnUrl=%2Fdatasets%2Fbhanuthakurr%2Fcleaned-contoso-dataset%2Fversions%2F8" title="we're using a demo data set based on Microsoft's Contoso data set" rel="">we're using a demo dataset based on Microsoft's Contoso dataset</a>.</div></div><div><span style="font-weight:bold;"><br/></span></div><div><div><div><span style="font-weight:normal;">We have created a Published Data Source on Tableau Server that exposes the Online Sales fact table and all of the related dimensions, as well as some calculated metrics and KPIs. We have&nbsp;<span style="font-weight:bold;">not</span>&nbsp;included any details about the data source in Ana's context library, so it will have to explore a little bit to understand how to collect the data we ask it for. Here's that data model in Tableau, for your reference:</span></div></div></div></div>
</div><div data-element-id="elm_bRAeYxCj11TIInHQBz2D9g" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_bRAeYxCj11TIInHQBz2D9g"] .zpimage-container figure img { width: 730px ; height: 299.76px ; } } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/contoso-online-sales-model.png" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_TX0X0t0t9c6B-jjFIkq4BA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">To keep things interesting, I'm going to ask a question with an intentional but easy-to-resolve error in it:&nbsp;</div>
</div><div data-element-id="elm_cKwLENBK7PKSSZTd0ZsF2A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><blockquote style="margin-left:40px;">&quot;Using the Contoso Online Sales data source, show me the sales over time for the customer named Tom Miller.&quot;</blockquote></div>
</div><div data-element-id="elm_Ckds2SdE8ATE0nu-bW01Dw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">The dataset has a &quot;Thomas Miller&quot; in it, so it will be interesting to see how Ana handles the discrepancy there. And with that background information out of the way, let's see the chat!</div>
</div><div data-element-id="elm_bqrmR4h9ILl_bqfVqLQcHw" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_3g4K9B-7rERkCD1zf-sciQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-5 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container figure img { width: 200px ; height: 442.60px ; } } [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container[class*='zpimage-overlay-effect-'] figure:hover figcaption , [data-element-id="elm_g7CybuC8UNxpiDlqQkjSPw"] .zpimage-container[class*='zpimage-overlay-effect-'] figure figcaption { background:rgba(1,58,81,0.8) ; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-small zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit zpimage-overlay zpimage-overlay-effect-static-bottom hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/tom-miller-sales.png" size="small" data-lightbox="true"/></picture></span><figcaption class="zpimage-caption zpimage-caption-align-center"><span class="zpimage-caption-content">Click to expand</span></figcaption></figure></div>
</div></div><div data-element-id="elm_CQkDlIXbRGgyHpEjMQXGgg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-7 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_m4iPkWVxJPh0qPqq2rRVqA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">The chat has a few components to it:</div>
</div><div data-element-id="elm_qEdz7tFmoccuuXjFjOTNBw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><ul><li>The response messages</li><li>The tool call cells</li><li>Artifact previews</li><li>The summary response</li></ul></div>
</div><div data-element-id="elm_3PngwPocfEe0Ynj--cQ32g" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">In my mind, the interesting things happen in the tool call cells. We can see Ana follow the overall structure we detailed in the context library. It:<p></p></div>
</div><div data-element-id="elm_eCd2LYtSGRfUR-IksIBqbg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><ol><li>Authenticates</li><li>Lists Data Sources</li><li>Reads Metadata</li><li>Queries Data, and</li><li>Analyzes in Python</li></ol></div>
</div></div></div><div data-element-id="elm_ckS8y_zORhqXqgG-vd6xgg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Overall, everything went as well as we could hope, in seven individual API calls to Tableau! It handled the name issue pretty well. It queried using filters for the First and Last name, and found no results. Since it expected results but found none, it decided to look into the customer names to find similar names. There are a handful of approaches it could have used, but in this case it decided to search for similar names, found the full list of Millers. With the relevant names in context now, it determined that &quot;Thomas&quot; was likely the one I was asking about, and proceeded from there.</div>
</div><div data-element-id="elm_W2JAWZPjozooJb-PIPaNLg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">It then created and saved some visualizations of the data using python, as well as wrote the underlying data to a CSV. Finally, it responded with a summary of its findings.</div>
</div><div data-element-id="elm_D5BgyOIHQnpGWkBqcWri3w" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">It Works! Now What?</h3></div>
<div data-element-id="elm_cSGdNkiQ1HPUdINLxwHl5A" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">So we now have an agentic AI analyst capable of connecting to Tableau and querying the same Published Data Sources we use in our workbooks. We see it's capable of correcting course when things aren't exactly as it first thought. Where do we go from here? Below are a few use cases we've implemented already, and one we're about to implement:</div>
</div><div data-element-id="elm_kih1VnUoIEMggtW_TGAk-Q" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Playbooks - Executive Summaries via Email or Slack</h4></div>
<div data-element-id="elm_RKBMBXEN2rODMNhB1kLmfA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">I mentioned Ana has a playbooks feature that allows you to schedule these analyses to be delivered on a recurring basis over Email, Slack, or Teams. We've implemented operational playbooks that surface actionable information around deal flow and accounts receivable aging. Users enjoy getting the relevant data delivered to them directly in Slack, and&nbsp;<span style="font-weight:bold;">really enjoy</span>&nbsp;being able to ask follow-up questions in the same thread.</div>
</div><div data-element-id="elm_y8Op77dP_RFsoon25uqIvA" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Exploring Complicated Database Schemas</h4></div>
<div data-element-id="elm_mi5mkfs0fP0gK-axlf2CyQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">We've already seen that Ana is adept at course-correction if something seems off about its findings. Similarly, it's also very good at exploring database schemas and determining how data relates. We have implemented Ana for users who need to uncover specific data without spending a ton of time digesting complicated schemas and ERDs. Ana's iterative discovery process makes easy work of that, and the context library allows users to improve Ana's efficiency over time as it discovers the relevant relationships within the data. Of course, there are several great approaches to mapping out the data models in advance, but that's out of the scope of&nbsp;<span style="font-style:italic;">this</span>&nbsp;post.</div>
</div><div data-element-id="elm_5V6VQqmHVY8z6N8_vIO7Zg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h4
 class="zpheading zpheading-style-none zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">In-Dashboard Chats</h4></div>
<div data-element-id="elm_FqzcifuCjvMRVz1FOA5wkQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">This is the one we're most excited to try next: embedding Ana&nbsp;<span style="font-style:italic;">directly inside of a dashboard<span style="font-style:normal;">, giving users a way to ask relevant questions about the data that's right in front of them at the moment.</span></span></div>
</div><div data-element-id="elm_MBGL6Lh_U0H2rDbVKVvSDA" data-element-type="heading" class="zpelement zpelem-heading zp-hidden-md zp-hidden-sm zp-hidden-xs "><style></style><h3
 class="zpheading zpheading-style-type1 zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Come see this demo live!</h3></div>
<div data-element-id="elm_aj298wMsmnbq39GWJOJLuQ" data-element-type="text" class="zpelement zpelem-text zp-hidden-md zp-hidden-sm zp-hidden-xs "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p>Want to see a live end-to-end demonstration of what you just read above? Come see the process start-to-finish, so you can do this with your own Tableau environment! Click the big red button below to register. Even if you can't make it live, we'll send all registrants a recording of the webinar once it wraps up.</p></div>
</div><div data-element-id="elm_lA8Ml603zggkM998asKQUA" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Inline Snippet 1 - Compact Banner --><!-- For Zoho Sites: Add as Custom HTML element between paragraphs --><style> .hpt-webinar-inline-1 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #f7f7f7; border-radius: 10px; padding: 20px 24px; margin: 32px 0; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; position: relative; overflow: hidden; border: 1px solid #e8e8e8; } .hpt-webinar-inline-1::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: rgb(235, 77, 94); } .hpt-webinar-inline-1 .content { flex: 1; min-width: 250px; } .hpt-webinar-inline-1 .label { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; color: rgb(200, 60, 75); margin-bottom: 6px; } .hpt-webinar-inline-1 .label svg { width: 14px; height: 14px; } .hpt-webinar-inline-1 h4 { font-size: 16px; font-weight: 600; color: #2a2a2a; margin: 0 0 4px 0; line-height: 1.4; } .hpt-webinar-inline-1 .meta { font-size: 13px; color: #666; } .hpt-webinar-inline-1 .cta-btn { display: inline-block; background: rgb(235, 77, 94); color: #fff; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 14px; white-space: nowrap; transition: background 0.2s, transform 0.2s; } .hpt-webinar-inline-1 .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } </style><div class="hpt-webinar-inline-1"><div class="content"><div class="label"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"></polygon><rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect></svg> Live Webinar · Dec 18 </div>
<h4>Unlock AI-Powered Analytics on Your Existing Tableau Data</h4><div class="meta">Live demo of Ana + Tableau VDS Integration · 11:00 AM CST</div>
</div><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Free </a></div>
</div></div><div data-element-id="elm_GyJhhcV3Cy_d45TalujkWg" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-type1 zpheading-align-left zpheading-align-mobile-left zpheading-align-tablet-left " data-editor="true">Want to skip the line and get started now?</h3></div>
<div data-element-id="elm_W3wDcCHLRG0BaeKqXpwVFw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true">Schedule a time to talk with us about our Ana Quick Start, where we guide you and your users through the &quot;getting started&quot; phase so you can see immediate value.</div>
</div><div data-element-id="elm_4Zz-BA8vR-CKUALhQ3IHzw" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-secondary zpbutton-size-md zpbutton-style-none " href="https://calendly.com/highperformancetechnologies/quick-call?month=2025-12" target="_blank"><span class="zpbutton-content">Schedule a Call</span></a></div>
</div></div><div data-element-id="elm_r6c2HRP3XZnvwFAl4N6J-Q" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-4 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg zp-hidden-sm zp-hidden-xs zpsticky-enabled"><style type="text/css"> @media (min-width:992px) { [data-element-id="elm_r6c2HRP3XZnvwFAl4N6J-Q"].zpelem-col{ top:150px;z-index:1; } } </style><div data-element-id="elm_Q6c4tjahsq8JYJHZM403TQ" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_L5JHdlowE0ZB-3t5VFQp8A" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_qmHZhz5pM5QLGgy5DznhfA" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet zp-hidden-md zp-hidden-sm zp-hidden-xs "><div class="zpsnippet-container"><!-- Webinar Sidebar Snippet - Tableau VDS + Ana Integration --><!-- For Zoho Sites: Add as Custom HTML element in sidebar --><!-- NOTE: Replace the placeholder image src with Brad Fair's actual photo URL --><style> .hpt-webinar-sidebar { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: #ffffff; border-radius: 12px; padding: 24px; color: #333; position: relative; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border: 1px solid #e8e8e8; } .hpt-webinar-sidebar::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: rgb(235, 77, 94); } .hpt-webinar-sidebar .badge { display: inline-block; background: rgba(235, 77, 94, 0.1); color: rgb(200, 60, 75); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; padding: 4px 10px; border-radius: 4px; margin-bottom: 12px; } .hpt-webinar-sidebar h3 { font-size: 18px; font-weight: 700; line-height: 1.35; margin: 0 0 14px 0; color: #2a2a2a; } .hpt-webinar-sidebar .info-row { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; padding: 12px; background: #f7f7f7; border-radius: 8px; } .hpt-webinar-sidebar .date-box { background: rgb(235, 77, 94); color: #fff; text-align: center; padding: 8px 12px; border-radius: 6px; min-width: 50px; flex-shrink: 0; } .hpt-webinar-sidebar .date-box .month { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; } .hpt-webinar-sidebar .date-box .day { font-size: 22px; font-weight: 700; line-height: 1.1; } .hpt-webinar-sidebar .date-text { flex: 1; font-size: 14px; color: #666; } .hpt-webinar-sidebar .date-text strong { display: block; color: #2a2a2a; } .hpt-webinar-sidebar .host-photo { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.1); flex-shrink: 0; } .hpt-webinar-sidebar .description { font-size: 14px; line-height: 1.55; color: #555; margin-bottom: 18px; } .hpt-webinar-sidebar .cta-btn { display: block; width: 100%; background: rgb(235, 77, 94); color: #fff; text-align: center; padding: 14px 20px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 15px; transition: background 0.2s, transform 0.2s; box-sizing: border-box; } .hpt-webinar-sidebar .cta-btn:hover { background: rgb(210, 65, 80); transform: translateY(-1px); } .hpt-webinar-sidebar .host { margin-top: 16px; padding-top: 14px; border-top: 1px solid #eee; font-size: 12px; color: #888; } .hpt-webinar-sidebar .host strong { color: #555; } </style><div class="hpt-webinar-sidebar"><span class="badge">Free Live Webinar</span><h3>Unlock AI-Powered Analytics on Your Existing Tableau Data</h3><div class="info-row"><div class="date-box"><div class="month">Dec</div>
<div class="day">18</div></div><div class="date-text"><strong>Thursday</strong> 11:00 AM CST </div>
<!--
		<img src="https://www.highperformance.tech/files/img/brad-fair.jpg" alt="Brad Fair" class="host-photo"> --> </div>
<p class="description"> See how to connect TextQL's Ana directly to your Tableau data sources—no rebuilding metrics or governance policies required. </p><a href="https://go.highperformance.tech/ana-tableau-vds-webinar-dec-2025/" class="cta-btn" target="_blank" rel="noopener"> Register Now → </a><div class="host"> Hosted by <strong>Brad Fair</strong>, Principal Solutions Architect </div>
</div></div></div></div></div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 12 Dec 2025 13:17:21 -0600</pubDate></item><item><title><![CDATA[Tableau Cloud Migrations: Mapping Your Migration Journey]]></title><link>https://www.highperformance.tech/blogs/post/tableau-cloud-migrations-mapping-your-migration-journey</link><description><![CDATA[<img align="left" hspace="5" src="https://www.highperformance.tech/tableau-server-logo-1.jpeg"/>Migrating from Tableau Server to Cloud is like planning a road trip — you need to spot the roadblocks ahead. We've identified 6 common delays that can slow your migration. Our Content Readiness Dashboard maps your route and shows exactly what needs fixing before you move.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_lOg2PhGeSFGiHv4mm7d38Q" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_jIZwvUilSdeNJ_KNVSDw_A" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content- " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_ZoBzhSFoTEm7zH348FKLSw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_NXIBHryRzUaxkc4IRuyOyg" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_sw9ZiWAVBnto4Hzb3ma_Qw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-9 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_1qUZgsZHPzHpyuTukQRnEQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><div><div><p style="text-align:left;margin-bottom:10.6667px;"></p><div><p style="line-height:1.5;">In the age of GPS-enabled smartphones, it’s rare to plan a trip without first checking your favorite mapping app. Whether you’re avoiding tolls, aiming for a specific arrival time, or want the fastest route, the app gives directions to meet your needs.</p><p style="text-align:left;"><br/></p><p style="text-align:left;">Migrating from Tableau Server to Tableau Cloud works the same way. You know your starting point and your destination — but what about the delays that could slow you down?</p><p style="text-align:left;"><br/></p><p style="text-align:left;">When you’re mapping your route from Server to Cloud, considering the unique details of your Tableau environment will help you avoid the most common (and costly) slow-downs you could encounter. In this ongoing blog series, we will show you how to identify these road hazards ahead of time so you can travel with confidence (<i>and</i> have the right ETA).</p><p style="text-align:left;"><span style="font-style:italic;"><span><br/></span></span></p><p style="text-align:left;">So, buckle up, and let’s begin.</p></div>
<p></p></div><div><h3 style="text-align:left;margin-bottom:5.3333px;"></h3></div>
<div><h2 style="text-align:left;">The Route Overview</h2></div><div><p style="text-align:left;">We find that most Tableau Server --&gt; Tableau Cloud migration routes are made up of five key segments.&nbsp;<span>They're all important, but the first, Planning and Analysis, is essential so you can get the best possible route customized to your unique environment, avoiding any potential roadblocks along the way.</span></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><img src="/HPT%20Cloud%20Migration%20Process.png"/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"></p><div><p style="text-align:left;">During the Planning &amp; Analysis phase, you need to answer two critical questions:</p></div>
<p></p></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px;"><div><div><li style="text-align:left;">What is your strategy for data connectivity in Tableau Cloud?</li><li style="text-align:left;">Is your content compatible with Tableau Cloud?</li></div>
</div></blockquote><div><div><p style="text-align:left;"></p><div><p><br/></p><p style="text-align:left;line-height:1.5;">To answer those questions, you'll want to audit your Tableau Server content, looking for things that could cause you to veer from the standard route. Think of this phase like checking the route before departing on a road trip — this is where you spot the construction zones, detours, and traffic jams. With that visibility, you can adjust your timeline, reroute where needed, and plan smarter. The result: a clearer picture of what’s ahead and a more accurate ETA for reaching Tableau Cloud.</p><p style="text-align:left;"><br/></p><h1 style="text-align:left;">Potential Route Delays</h1><p style="text-align:left;"><span>Here are six </span>potential delays we’ve identified to be on the lookout for:</p></div>
<p></p></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px;"><ol><li style="text-align:left;">User License Dependencies</li><li style="text-align:left;">Unsupported Fonts</li><li style="text-align:left;">Broken URL Connections</li><li style="text-align:left;">Database Connection Failures</li><li style="text-align:left;">Flat File Refresh Failures</li><li style="text-align:left;">Private Data Connectivity</li></ol></blockquote><div><p style="text-align:left;">Each of these items may appear straightforward on the surface, but with the complexity of each dashboard and data source, they can end up being quite nuanced in how you approach a solution before and during migration.</p><p style="text-align:left;"><br/></p><div><p></p><h1 style="text-align:left;">Taking Inventory</h1><p style="text-align:left;">When we plan successful Cloud migrations for clients, we start by creating a complete Content Inventory&nbsp;of all the users, data sources (and their connections), and workbooks on the Server, looking for the six potential delays we listed above. Once we've gathered our inventory, we visualize it in a Tableau Dashboard. The Content Readiness Dashboard helps us quickly see areas where remediation, or a reroute, is needed and plan accordingly.</p></div></div>
</div></div></div><div data-element-id="elm_Qt-nT3vYyNeQAhGAnXuX6w" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-3 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_iVgbjve-BWIg9CzTmE_OQQ" data-element-type="text" class="zpelement zpelem-text zp-hidden-sm zp-hidden-xs "><style> @media (max-width: 767px) { [data-element-id="elm_iVgbjve-BWIg9CzTmE_OQQ"].zpelem-text { margin-block-start:99px; } } </style><div class="zptext zptext-align-left zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><div><p style="text-align:left;margin-bottom:10.6667px;"></p><div><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;">» We'll keep adding to this series as we uncover more potential delays to look out for.</p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;">»&nbsp;This blog series will dive into each of these in more detail, ensuring you have the knowledge and tools needed to prepare for your journey.&nbsp;</p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><span style="text-align:center;"><br/></span></p><p style="text-align:left;"><span style="text-align:center;">»&nbsp;</span>We get this information from the Tableau Server API, but you can also get the details from the Tableau Repository for your Tableau Server.<br/></p></div></div>
</div></div></div></div><div data-element-id="elm_8aI0s2juPlbVWlsyeoMZYg" data-element-type="imagetext" class="zpelement zpelem-imagetext "><style> @media (min-width: 992px) { [data-element-id="elm_8aI0s2juPlbVWlsyeoMZYg"] .zpimagetext-container figure img { width: 577.5px !important ; height: 385px !important ; } } [data-element-id="elm_8aI0s2juPlbVWlsyeoMZYg"].zpelem-imagetext{ margin-block-start:18px; } </style><div data-size-tablet="" data-size-mobile="" data-align="right" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimagetext-container zpimage-with-text-container zpimage-align-right zpimage-tablet-align-center zpimage-mobile-align-center zpimage-size-custom zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
            type:fullscreen,
            theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Content%20Readiness%20Dashboard%20Sample.png" size="custom" data-lightbox="true"/></picture></span></figure><div class="zpimage-text zpimage-text-align-left zpimage-text-align-mobile-left zpimage-text-align-tablet-left " data-editor="true"><div style="text-align:center;"><div><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;"><br/></p><p style="text-align:left;">The Content Readiness Dashboard breaks down:</p></div><div><p style="text-align:left;"><span style="font-size:14px;"></span></p><div></div><p></p><li style="text-align:left;"><span style="font-size:14px;">Content needing remediation vs. Content ready for migration</span></li><li style="text-align:left;"><span style="font-size:14px;">Content and remediation type needed by author</span></li><li style="text-align:left;"><span style="font-size:14px;">Recommended timeline for when to remediate certain roadblocks</span></li><p style="text-align:left;"><br/></p></div><div><div><p style="text-align:left;"><span>We also give each Tableau content author a custom checklist with their specific fixes and clear steps to take. Getting content ready for migration is a team effort. Migrations are most successful when everyone pitches in to clear the roadblocks ahead of time.</span></p></div><br/><br/></div></div></div>
</div></div><div data-element-id="elm_VETJNF-MwWo1LmdQUl9Frw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p></p><div><div style="text-align:center;"><p style="text-align:left;">Planning a migration without knowing what's ahead is like driving cross-country without checking traffic. Taking an inventory and identifying the potential roadblocks we've outlined will show you exactly what to expect from your unique environment as you plan your migration.</p></div><div><p><br/></p><p>Want to see what roadblocks might be waiting in your migration?&nbsp;We can help you out with your content inventory and provide you with a Content Readiness Dashboard for Server content.</p></div></div><p></p></div>
</div><div data-element-id="elm_YFixvbgDSQSVxpyIK07S-A" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-primary zpbutton-size-md zpbutton-style-none " href="https://calendly.com/highperformancetechnologies/quick-call?back=1&amp;month=2025-07" target="_blank" title="Schedule a call with an expert via Calendly"><span class="zpbutton-content">Talk to a Migration Expert</span></a></div>
</div></div></div></div></div><div data-element-id="elm_m9-KSHRc73mqUQevMT3WsQ" data-element-type="section" class="zpsection zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_MHO2Z-cburPgMYhwmSsdVA" data-element-type="row" class="zprow zprow-container zpalign-items-flex-start zpjustify-content-flex-start zpdefault-section zpdefault-section-bg " data-equal-column="false"><style type="text/css"></style><div data-element-id="elm_aF8u1P7V_YMeuNUprdWDHQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- zpdefault-section zpdefault-section-bg "><style type="text/css"></style><div data-element-id="elm_MVQMVDUHzZDqfh89Wz_YiQ" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"></style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-align-mobile-center zpdivider-align-tablet-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_-Cc8h3JxMRTt7n1-rVNiyg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left zptext-align-mobile-left zptext-align-tablet-left " data-editor="true"><p><span><span style="font-style:italic;"><span></span></span></span></p><div><div><i>This is part one of our ongoing series on creating your Tableau Cloud Migration Roadmap. Up next: <a href="https://www.highperformance.tech/blogs/post/understanding-user-license-dependencies-in-cloud-migrations" title="Understanding User License Dependencies in Cloud Migrations" rel="">Understanding User License Dependencies in Cloud Migrations</a></i><i>.</i></div></div><span></span><p></p></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 13 Aug 2025 11:11:08 -0500</pubDate></item></channel></rss>