# Qualtrics Destination Config Reference


> Complete Rudder CLI reference for the Qualtrics destination config keys, page titles, event filtering, and device mode source types.



[Qualtrics](https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/) is a device mode destination for website and app feedback surveys. RudderStack loads Qualtrics' intercept code in the browser and passes it the names of `page` and `track` events. In Android and iOS apps, it loads Qualtrics' SDK and sets `identify` traits on it, so your intercepts can target users by what they do and who they are.

In a Qualtrics destination spec:

- `type: qualtrics`
- `definition_version: 1`

## Sample configuration

```yaml
version: rudder/v1
kind: destination
metadata:
  name: qualtrics-prod
spec:
  id: qualtrics-prod
  display_name: Qualtrics Production
  type: qualtrics
  definition_version: 1
  enabled: true
  config:
    project_id: "{{ .QUALTRICS_PROJECT_ID }}"
    brand_id: acmecorp
    enable_generic_page_title:
      web: false

    event_filtering:
      blacklist:
        - Product Viewed

    connection_mode:
      web: device
      android: device
      ios: device
    consent_management:
      web:
        - provider: oneTrust
          consents:
            - analytics
```

The above example connects web, Android, and iOS sources, all in `device` mode. `enable_generic_page_title` and `event_filtering` affect only the web integration — see [Web settings](#web-settings) and [Event filtering](#event-filtering).

## Config keys

`config` accepts only the keys listed below. The [shared config key rules](https://www.rudderstack.com/docs/rudder-cli/destination-types/#config-key-rules) cover unknown keys, defaults, and immutability.

**Info:** Qualtrics runs only in `device` mode. On web it acts on `page` and `track` calls, and passes their names to Qualtrics as events your intercepts can target. On Android and iOS it acts only on `identify` calls, and sets their string and number traits as Qualtrics properties for intercept targeting.

### Connection

<div class="rs-ckeys">
<div class="rs-ckey" id="project_id">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">project_id</p>RequiredSecret</div>
  <p class="rs-ckey__field">
    Type:
    <code>string</code>
  </p>
<p class="rs-ckey__field">
  Description:
  ID of the Qualtrics Website/App Feedback project whose intercepts RudderStack loads, such as <code>ZN_blw7AbCTWxCGung</code>. It&rsquo;s listed under the project&rsquo;s <strong>Project IDs</strong> settings, next to the brand ID.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>Used on web, Android, and iOS.</li>
<li>Rudder CLI checks only that it&rsquo;s present.</li>
</ul>

</div>

<div class="rs-ckey__extra">
  <p>Supply it as a <code>{{ .VAR }}</code> reference rather than a literal — see <a href="#secrets" >Secrets</a>.</p>
<p>See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/#how-do-i-get-my-qualtrics-project-id-and-brand-id" >How do I get my Qualtrics project ID and brand ID?</a>.</p>

</div>

</div>

<div class="rs-ckey" id="brand_id">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">brand_id</p>Required</div>
  <p class="rs-ckey__field">
    Type:
    <code>string</code>
  </p>
<p class="rs-ckey__field">
  Description:
  ID of your organization&rsquo;s Qualtrics brand, listed with the project ID.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>Used on web, Android, and iOS.</li>
<li>Rudder CLI checks only that it&rsquo;s present.</li>
</ul>

</div>

</div>

</div>

### Web settings

<div class="rs-ckeys">
<div class="rs-ckey" id="enable_generic_page_title">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">enable_generic_page_title</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>object</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Send every <code>page</code> call to Qualtrics as <code>Viewed a Page</code>, instead of a name built from the call&rsquo;s category and name.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li><code>web</code> — boolean. The dashboard defaults it to <code>false</code>; Rudder CLI doesn&rsquo;t fill it in.</li>
<li>Applies to <code>web</code> sources in <code>device</code> mode — the Android and iOS integrations ignore <code>page</code> calls. <code>web</code> is the only key the object accepts.</li>
</ul>

</div>

<div class="rs-ckey__extra">
  <p>When <code>false</code> or unset, a <code>page</code> call is sent as <code>Viewed &lt;category&gt; &lt;name&gt; Page</code>, or <code>Viewed &lt;name&gt; Page</code> when it has no category, so give your <code>page</code> calls a name. The category comes from the call&rsquo;s category, or from <code>properties.category</code>. A call with neither a name nor a category isn&rsquo;t sent.</p>
<div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">enable_generic_page_title:
  web: true</code></pre></div>
</div><p>See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/#page" >Page</a>.</p>

</div>

</div>

</div>

### Event filtering

[Client-side event filtering](https://www.rudderstack.com/docs/sources/event-streams/sdks/event-filtering/) is applied by the SDK, and every source connects to Qualtrics in `device` mode. It changes nothing for Android and iOS sources, though: their Qualtrics integrations act only on `identify` calls, which aren't filtered.

<div class="rs-ckeys">
<div class="rs-ckey" id="event_filtering">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">event_filtering</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>object</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Restricts which <code>track</code> events the SDK passes to Qualtrics, by event name. <code>page</code> calls aren&rsquo;t filtered.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li><code>whitelist</code> — array of event names to allow; every other <code>track</code> event is dropped.</li>
<li><code>blacklist</code> — array of event names to drop; every other <code>track</code> event is allowed.</li>
<li>The two are mutually exclusive, and Rudder CLI enforces it — setting both fails validation.</li>
<li>Each name is at most 100 characters, or a <code>{{ path || fallback }}</code> template.</li>
<li>Omit the block entirely to filter nothing.</li>
</ul>

</div>

</div>

</div>

### Per-source keys

Both keys are objects keyed by the local source type — the tokens listed under [Source types](#source-types). A key naming a source type this destination doesn't support fails validation.

<div class="rs-ckeys">
<div class="rs-ckey" id="connection_mode">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">connection_mode</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>object</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Maps each source type you connect to the mode its events reach Qualtrics in. Qualtrics accepts only <code>device</code>, for <code>web</code>, <code>android</code>, and <code>ios</code>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>An entry is required for each source type you connect — see <a href="#connect-a-source" >Connect a source</a>.</li>
<li>Any other mode fails validation — for example <code>cloud</code> for <code>web</code>.</li>
</ul>

</div>

<div class="rs-ckey__extra">
  <div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">connection_mode:
  web: device
  android: device
  ios: device</code></pre></div>
</div>
</div>

</div>

<div class="rs-ckey" id="consent_management">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">consent_management</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>object</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Consent provider configuration per source type. The entry shape, accepted providers, and the rules on <code>resolution_strategy</code> and <code>consents</code> are shared across all destination types — see <a href="https://www.rudderstack.com/docs/rudder-cli/destination-types/#consent-management" >Consent management</a>.
</p>

</div>

</div>

## Source types

Qualtrics accepts events from these source types in the mentioned connection modes:

| Source type | Connection mode |
| :-----| :-----|
| `web` | `device` |
| `android` | `device` |
| `ios` | `device` |

Every source type is `device` only — RudderStack loads Qualtrics' own code in the browser or app, and no events pass through RudderStack's servers. The Kotlin and Swift SDKs — `android_kotlin` and `ios_swift` — aren't supported. See [Adding device mode integration](https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/#adding-device-mode-integration).

## Connect a source

An event stream connection to this destination is checked against two rules at `validate` time.

**The source's type must be supported.** Qualtrics accepts `web`, `android`, and `ios` — the types JavaScript, Android, and iOS SDK sources resolve to. Every other source resolves to a type it doesn't accept — an iOS Swift source to `ios_swift`, an Android Kotlin source to `android_kotlin`, and webhook and server-side SDK sources to `cloud` — and reports, for example:

```text
destination 'qualtrics-prod' (type 'qualtrics') does not support source 'my-swift-app':
source type 'ios_swift' is not among supported source types: web, android, ios
```

**The destination config must carry a `connection_mode` entry for that source type.** This lives on the destination spec, not on the [connection spec](https://www.rudderstack.com/docs/rudder-cli/yaml-connections/). Without it:

```text
destination 'qualtrics-prod' config has no 'connection_mode' entry for source type 'web'
```

Qualtrics needs no additional config keys to connect a source of any supported type.

## Secrets

`project_id` is the only secret key. Write it as a `{{ .VAR }}` reference and supply the value at apply time:

```yaml
config:
  project_id: "{{ .QUALTRICS_PROJECT_ID }}"
```

```bash
export RUDDER_QUALTRICS_PROJECT_ID="..."
rudder-cli apply

# or
rudder-cli apply --var-file secrets.vars.yaml
```

Note that:

- `rudder-cli import` writes only the secrets the API returns, as `{{ .VAR }}` references, and leaves the others out. Add any secret key it leaves out, then supply the variables before you apply — see [Secrets](https://www.rudderstack.com/docs/rudder-cli/destination-types/#secrets).
- On web, the project ID is part of the intercept code's URL in the page, so masking it protects your YAML, not the value itself.

See [How to Use Variable Substitution in Rudder CLI](https://www.rudderstack.com/docs/rudder-cli/variable-substitution/).

## Changes by release

<p>No changes since this type became available.</p>

For changes across every destination type, see [Destination Type Changes by Release](https://www.rudderstack.com/docs/rudder-cli/destination-types/changes/).

## See more

- [Qualtrics Destination](https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/) for finding the project and brand IDs, and how `page`, `track`, and `identify` calls reach Qualtrics
- [Destination Type Reference for Rudder CLI](https://www.rudderstack.com/docs/rudder-cli/destination-types/) for the rules shared across destination types
- [Destination YAML Reference](https://www.rudderstack.com/docs/rudder-cli/yaml-destinations/) for the spec envelope

