# Tableau

![TableauLogo_RGB.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6616633340813.png)
Tableau is a web-based software company that offers collaborative data visualization and business intelligence software for organizations working with business information analytics. It helps build visual dashboards that make it easier for non-technical analysts and end users to convert data into understandable, interactive graphics.

Only Tableau Cloud is currently supported.
In order to integrate Tableau with Relyance AI you will need a Tableau **Personal Access Token Name**, **Personal Access Token**, **Subdomain,** and a **Content URL**.

Relyance uses Personal Access Tokens to Authenticate with Tableau Online or Tableau Server. This Access Token grants Relyance automation access to Tableau’s API based on the user’s “Site Role” that created the Access Token. For that reason we recommend creating the Token from a User with at least Explorer or ideally Site Admin Explorer permissions to ensure all data sources are properly accounted for.

For more information about Personal Access Tokens you can review Tableau’s documentation on the subject here:

 Tableau Server: Security - [Personal Access Tokens](https://help.tableau.com/current/server/en-us/security_personal_access_tokens.htm)
 Tableau Online: Security - [Personal Access Tokens](https://help.tableau.com/current/online/en-us/security_personal_access_tokens.htm)

You may need to ask your administrator to enable personal access tokens before following the steps in this guide.

#### In Tableau:

1. Login to Tableau Online or Tableau Server as a User with sufficient permissions (Explorer+).
2. Navigate to Account Settings by clicking your user icon in the upper right corner of the screen followed by **My Account Settings**.
3. Scroll down until you find **Personal Access Tokens** in the Security section.

![Tableau-1.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6654499949197.png)

![Tableau-2.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6654501343629.png)

4. Create a new token by entering a token name in the text box and clicking the **Create new token** button. We recommend a descriptive name like “relyance-api” for clarity when managing integrations in the future.
5. Copy the **Token Name** and **Token Secret** to be used as your **Personal Access Token Name** and **Personal Access Token** in Relyance AI.

![Tableau-4.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6654571177229.png)

6. To find the **Content URL**, navigate back to your Tableau dashboard and in the address bar, copy the name in the URL after “site/” and before “/user” for example:

![Tableau-3.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6655224894861.png)

7. Copy the **Subdomain** from the url found before '*online*' keyword. In the example below, this would be "10ax".

![Tableau-8.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/20060514163469.png)

#### In the Relyance AI application:

1. Login to your Relyance account.
2. Navigate to the **Settings** Menu in the bottom left-hand side.
3. Select **Integrations**.
4. Click on the **Vendor Integration** tab.
5. Find the **Tableau** integration card and click it to open its connections.
6. Under **Authentication Method**, choose **Custom**.
8. Paste the **Personal Access Token Name**, **Personal Access Token**, **Subdomain**, and **Content URL** into their respective fields.

![Tableau-5.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6655326515597.png)

9. Click **Authenticate**.
10. If you wish to include more than one Tableau Site, click the create new integration button near the top of the configuration page and repeat the steps above.
11. At this point, you should see the following result on the Vendor Integrations page:

![Tableau-7.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6655503031437.png)

![Tableau-6.png](https://assets.relyanceuat.xyz/images/docs/6616688619277/6655320122637.png)

12. Congratulations, you are now connected to **Tableau**.

<!-- failure-modes:begin (generated from the integration catalog; do not hand-edit) -->

## If the connection reports Connected but returns nothing

These are the ways this integration comes back empty without reporting an error. Generated from the integration catalog, so it tracks what the connection actually asks for.

1. **A credential rotated at the vendor is not picked up here.** **Personal Access Token** is stored when you save the connection, so regenerating the value at the vendor breaks the next scan until it is re-pasted here. Recording the expiry on the connection means Relyance warns you before it lapses.
2. **Check the address fields before suspecting the credentials.** **Content URL** and **Subdomain** identify which tenant, region or host to talk to. A wrong value there fails authentication and looks exactly like a bad secret.
3. **Throughput is limited on purpose.** **Maximum Concurrent API Calls** defaults to `20`. Raising it past what the vendor allows produces rate-limit errors that surface as a partial scan; it does not change how much data is collected.

<!-- failure-modes:end -->

<!-- terraform-examples:begin (generated from the integration catalog; do not hand-edit) -->

## Manage this integration with Terraform

Connections for this integration can be managed as code with the [Relyance Terraform provider](https://registry.terraform.io/providers/Relyance/relyance/latest). Non-secret fields go in `auth.params`; secret fields go in `auth.secrets_wo`, which is write-only — never stored in Terraform state. Rotate secrets by bumping `auth.secrets_wo_version`.

```hcl
resource "relyance_integration_connection" "tableau" {
  vendor = "tableau"
  name   = "<your connection name>"

  auth = {
    method = "access-token"
    params = {
      personal_access_token_name = "<personal_access_token_name>"
      content_url = "<content_url>"
      subdomain = "10ax"
      data_storage_location = "us"
    }
    # Secret fields are write-only: sent to Relyance, never stored in state.
    secrets_wo = {
      personal_access_token = var.tableau_personal_access_token
    }
    secrets_wo_version = 1
  }

  scans = { "data-inspection" = { enabled = true } }
}
```

<!-- terraform-examples:end -->
