# Set up automatic exposures in Tableau

dbt platform | Enterprise, Enterprise+

Set up and automatically populate downstream exposures for supported BI tool integrations, like Tableau. Visualize and orchestrate them through [dbt Catalog](https://docs.getdbt.com/docs/explore/explore-projects) and the [dbt job scheduler](../deploy/job-scheduler.md) for a richer experience.

As a data team, it’s critical that you have context into the downstream use cases and users of your data products. By leveraging automatic downstream [exposures](../build/exposures.md), you can:

* Gain a better understanding of how models are used in downstream analytics, improving governance and decision-making.
* Reduce incidents and optimize workflows by linking upstream models to downstream dependencies.
* Automate exposure tracking for supported BI tools, ensuring lineage is always up to date.
* [Orchestrate exposures](./orchestrate-exposures.md) to refresh the underlying data sources during scheduled dbt jobs, improving timeliness and reducing costs. Orchestrating exposures is a way to ensure that your BI tools are updated regularly using the [dbt job scheduler](../deploy/job-scheduler.md). See the [previous page](./downstream-exposures.md) for more information.

In dbt, you can configure downstream exposures in two ways:

* Manually — Declared [explicitly](../build/exposures.md#declaring-an-exposure) in your project’s YAML files.
* Automatic — dbt [creates and visualizes downstream exposures](./downstream-exposures.md) automatically for supported integrations, removing the need for manual YAML definitions. These downstream exposures are stored in dbt’s metadata system, appear in [Catalog](../explore/explore-projects.md), and behave like manual exposures. However, they don’t exist in YAML files.

Tableau Server

If you're using Tableau Server, you need to add the [dbt IP addresses for your region](../platform/about-platform/access-regions-ip-addresses.md) to your allowlist.

## Prerequisites

To configure automatic downstream exposures, you should meet the following:

1. Your environment and jobs are on a supported [dbt release track](../dbt-versions/dbt-release-tracks.md).
2. You have a dbt account on the [Enterprise or Enterprise+ plan](https://www.getdbt.com/pricing/).
3. You have set up a [production](../deploy/deploy-environments.md#set-as-production-environment) deployment environment for each project you want to explore, with at least one successful job run.
4. You have [proper permissions](../platform/manage-access/enterprise-permissions.md) to edit dbt project or production environment settings.
5. Use Tableau as your BI tool and enable metadata permissions or work with an admin to do so. Compatible with Tableau Cloud or Tableau Server with the Metadata API enabled.
6. You have configured a [Tableau personal access token (PAT)](https://help.tableau.com/current/server/en-us/security_personal_access_tokens.htm) whose creator has permission to view data sources. The PAT inherits the permissions of its creator, so ensure the Tableau user who created the token has [Connect permissions](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_permissions.htm).

### Considerations

Configuring automatic downstream exposures with Tableau have the following considerations:

* You can only connect to a single Tableau site on the same server.

* If you're using Tableau Server, you need to [allowlist dbt's IP addresses](../platform/about-platform/access-regions-ip-addresses.md) for your dbt region.

* Tableau dashboards built using custom SQL queries aren't supported.

* Downstream exposures sync automatically *once per day* or when a user updates the selected collections.

*  The database fully qualified names (FQNs) in Tableau must match those in the dbt build.

  Tableau's database FQNs (fully qualified names) must match those in the dbt build. To view all expected dependencies in your exposure, the FQNs must match but aren't case-sensitive. For example:

  | Tableau FQN                        | dbt FQN                                 | Result                                                           |
  | ---------------------------------- | --------------------------------------- | ---------------------------------------------------------------- |
  | `analytics.dbt_data_team.my_model` | `analytics.dbt_data_team.my_model`      | ✅ Matches and dependencies will display as expected.            |
  | `analytics.dbt_data_team.my_model` | `prod_analytics.dbt_data_team.my_model` | ❌ Doesn't match and not all expected dependencies will display. |

  To troubleshoot this:

  1. In dbt, download the `manifest.json` from the most recent production run that includes the missing dependencies by clicking on the **Artifacts** tab and scrolling to `manifest.json`.

  2. Run the following [GraphiQl](https://help.tableau.com/current/api/metadata_api/en-us/docs/meta_api_start.html#explore-the-metadata-api-schema-using-graphiql) query. Make sure to run the query at `your_tableau_server/metadata/graphiql`, where `your_tableau_server` is the value you provided for the Server URL when [setting up your Tableau integration](./downstream-exposures-tableau.md#set-up-in-tableau):

     ```jsx
         query {
           workbooks {
             name
             uri
             id
             luid
             projectLuid
             projectName
             upstreamTables {
               id
               name
               schema
               database {
                 name
                 connectionType
             }
           }
         }
       }
     ```

  3. Compare database FQNs between `manifest.json` and the GraphiQL response. Make sure that `{database}.{schema}.{name}` matches in both. The following images are examples of FQNs that *match* in both `manifest.json` and the GraphiQL response and aren't case-sensitive:

  [![manifest.json example with lowercase FQNs.](/img/docs/platform-integrations/auto-exposures/manifest-json-example.png?v=2 "manifest.json example with lowercase FQNs.")](#)manifest.json example with lowercase FQNs.

  [![GraphiQl response example with uppercase FQNs.](/img/docs/platform-integrations/auto-exposures/graphiql-example.png?v=2 "GraphiQl response example with uppercase FQNs.")](#)GraphiQl response example with uppercase FQNs.

  4. If the FQNs don't match, update your Tableau FQNs to match the dbt FQNs.
  5. If you're still experiencing issues, please contact [dbt Support](mailto:support@getdbt.com) and share the results with them.

## Set up downstream exposures

Set up downstream exposures in [Tableau](#set-up-in-tableau) and [dbt](#set-up-in-dbt-cloud) to ensure that your BI tool's extracts are updated automatically.

### Set up in Tableau

This section explains the steps to configure the integration in Tableau. A Tableau site admin must complete these steps.

Once configured in both Tableau and [dbt](#set-up-in-dbt-cloud), you can [view downstream exposures](#view-downstream-exposures) in Catalog.

1. Enable [personal access tokens (PATs)](https://help.tableau.com/current/server/en-us/security_personal_access_tokens.htm) for your Tableau account.

   [![Enable PATs for the account in Tableau](/img/docs/platform-integrations/auto-exposures/tableau-enable-pat.jpg?v=2 "Enable PATs for the account in Tableau")](#)Enable PATs for the account in Tableau

2. Create a PAT to add to dbt to pull in Tableau metadata for the downstream exposures. When creating the token, you must have permission to access collections/folders, as the PAT only grants access matching the creator's existing privileges.

   [![Create PATs for the account in Tableau](/img/docs/platform-integrations/auto-exposures/tableau-create-pat.jpg?v=2 "Create PATs for the account in Tableau")](#)Create PATs for the account in Tableau

3. Copy the **Secret** and the **Token name** for use in a later step in dbt. The secret is only displayed once, so store it in a safe location (like a password manager).

   [![Copy the secret and token name to enter them in dbt](/img/docs/platform-integrations/auto-exposures/tableau-copy-token.jpg?v=2 "Copy the secret and token name to enter them in dbt")](#)Copy the secret and token name to enter them in dbt

4. Copy the **Server URL** and **Sitename**. You can find these in the URL while logged into Tableau.

   [![Locate the Server URL and Sitename in Tableau](/img/docs/platform-integrations/auto-exposures/tablueau-serverurl.jpg?v=2 "Locate the Server URL and Sitename in Tableau")](#)Locate the Server URL and Sitename in Tableau

   For example, if the full URL is: `10az.online.tableau.com/#/site/dbtlabspartner/explore`:

   * The **Server URL** is the fully qualified domain name, in this case: `10az.online.tableau.com`
   * The **Sitename** is the path fragment right after `site` in the URL, in this case: `dbtlabspartner`

5. With the following items copied, you are now ready to set up downstream exposures in dbt:

   * ServerURL
   * Sitename
   * Token name
   * Secret

### Set up in dbt

1. In dbt, navigate to the **Dashboard** of the project you want to add the downstream exposure to and then select **Settings**.

2. Under the **Exposures** section, select **Add lineage integration** to add the Tableau connection.

   [![Select Add lineage integration to add the Tableau connection.](/img/docs/platform-integrations/auto-exposures/cloud-add-integration.png?v=2 "Select Add lineage integration to add the Tableau connection.")](#)Select Add lineage integration to add the Tableau connection.

3. Enter the details for the exposure connection you collected from Tableau in the [previous step](#set-up-in-tableau) and click **Continue**. Note that all fields are case-sensitive.

   [![Enter the details for the exposure connection.](/img/docs/platform-integrations/auto-exposures/cloud-integration-details.png?v=2 "Enter the details for the exposure connection.")](#)Enter the details for the exposure connection.

4. Select the collections you want to include for the downstream exposures and click **Save**.

   [![Select the collections you want to include for the downstream exposures.](/img/docs/platform-integrations/auto-exposures/cloud-select-collections.png?v=2 "Select the collections you want to include for the downstream exposures.")](#)Select the collections you want to include for the downstream exposures.

   info

   dbt automatically imports and syncs any workbook within the selected collections. New additions to the collections will appear in the lineage in dbt once per day — after the daily sync and a job run.

   dbt immediately starts a sync when you update the selected collections list, capturing new workbooks and removing irrelevant ones.

5. dbt imports everything in the collection(s) and you can continue to [view them](#view-downstream-exposures) in Catalog.

   [![View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.](/img/docs/platform-integrations/auto-exposures/explorer-lineage2.png?v=2 "View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.")](#)View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.

## View downstream exposures

After setting up downstream exposures in dbt, you can view them in [Catalog](../explore/explore-projects.md) for a richer experience.

Navigate to Catalog by selecting **Catalog** from the top-level navigation. You can view downstream exposures from a couple of places:

* [Exposures menu](#exposures-menu)
* [Exposure detail page](#exposure-detail-page)
* [Project lineage](#project-lineage)

### Exposures menu

View all downstream exposures for a project from the Catalog sidebar:

1. In the sidebar, select your project.
2. Under the project, select **Exposure**. You will only see this option if you set up downstream exposures in [Tableau](./downstream-exposures-tableau.md#set-up-in-tableau) and [dbt](./downstream-exposures-tableau.md#set-up-in-dbt-cloud).

The **Exposures** table lists every exposure in the project so you can quickly access and manage them:

* **Name**: The name of the exposure.
* **Health**: The [data health signal](../explore/data-health-signals.md) of the exposure.
* **Type**: The type of exposure, such as `dashboard` or `notebook`.
* **Owner**: The owner of the exposure.
* **Owner email**: The email address of the owner of the exposure.
* **Integration**: The BI tool that the exposure is integrated with.
* **Exposure mode**: The type of exposure defined: **Auto** or **Manual**. Auto exposures from Tableau appear alongside manual exposures

[![View the Exposures table from the Catalog sidebar.](/img/docs/platform-integrations/auto-exposures/explorer-view-resources.png?v=2 "View the Exposures table from the Catalog sidebar.")](#)View the Exposures table from the Catalog sidebar.

### Exposure detail page

After you open the **Exposures** table ([previous section](#exposures-menu)), select an exposure name to open its detail page.

On the exposure detail page, you can review metadata, [data health signals](../explore/data-health-signals.md), description, and lineage. For Tableau auto exposures, use **Open in Dashboard** to open the workbook in Tableau, or **Modify integration** to update your Tableau connection settings.

[![View an exposure detail page in Catalog.](/img/docs/platform-integrations/auto-exposures/explorer-view-exposure-detail.png?v=2 "View an exposure detail page in Catalog.")](#)View an exposure detail page in Catalog.

### Project lineage

You can also view exposures from the **Project lineage** view, separate from the **Exposures** table:

1. In the sidebar, select your project.
2. Click **View lineage**.
3. Select an exposure node with the Tableau icon to view its details in the side panel.

This view visualizes the dependencies and relationships in your project. For Tableau auto exposures, use **View in Tableau** or **Modify integration** from the side panel.

[![View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.](/img/docs/platform-integrations/auto-exposures/explorer-lineage2.png?v=2 "View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.")](#)View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.

[![View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.](/img/docs/platform-integrations/auto-exposures/explorer-lineage.png?v=2 "View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.")](#)View from the dbt Catalog in your Project lineage view, displayed with the Tableau icon.

## Orchestrate exposures [Beta](https://docs.getdbt.com/docs/dbt-versions/product-lifecycles "Go to https://docs.getdbt.com/docs/dbt-versions/product-lifecycles")[Enterprise](https://www.getdbt.com/pricing "Go to https://www.getdbt.com/pricing")[Enterprise +](https://www.getdbt.com/pricing "Go to https://www.getdbt.com/pricing")

[Orchestrate exposures](./orchestrate-exposures.md) using the dbt [Cloud job scheduler](../deploy/job-scheduler.md) to proactively refresh the underlying data sources (extracts) that power your Tableau Workbooks.

This beta capability requires deployment jobs on [Latest](../dbt-versions/dbt-release-tracks.md) with dbt Core and *isn't* available on [Fusion Stable](../dbt-versions/dbt-release-tracks.md) (the dbt Fusion engine preview). For setup details, refer to [Orchestrate exposures](./orchestrate-exposures.md).

* Orchestrating exposures with a `dbt build` job ensures that downstream exposures, like Tableau extracts, are updated regularly and automatically.
* You can control the frequency of these refreshes by configuring environment variables.

To set up and proactively run exposures with the dbt job scheduler, refer to [Orchestrate exposures](./orchestrate-exposures.md).

## Was this page helpful?

YesNo

[Privacy policy](https://www.getdbt.com/cloud/privacy-policy)[Create a GitHub issue](https://github.com/dbt-labs/docs.getdbt.com/issues)

This site is protected by reCAPTCHA and the Google [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms) apply.
