# Adjust Destination Config Reference

<p><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/setup-guide/" >Adjust</a> is a mobile attribution destination. RudderStack sends <code>track</code> events to Adjust&rsquo;s server-to-server API from its servers, or loads Adjust&rsquo;s SDK in the app in device mode on Android, iOS, Unity, and Flutter.</p>
<p>In an Adjust destination spec:</p>
<ul>
<li><code>type: adj</code></li>
<li><code>definition_version: 1</code></li>
</ul>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="sample-configuration">Sample configuration</h2><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">version: rudder/v1
kind: destination
metadata:
  name: adjust-prod
spec:
  id: adjust-prod
  display_name: Adjust Production
  type: adj
  definition_version: 1
  enabled: true
  config:
    app_token: &#34;{{ .ADJUST_APP_TOKEN }}&#34;
    environment: true

    custom_mappings:
      - from: Order Completed
        to: tf4gm5
      - from: Install Attributed
        to: k2pd7x
    partner_params_keys:
      - from: revenue
        to: price

    enable_install_attribution_tracking:
      android_kotlin: true
      ios_swift: true

    event_filtering:
      blacklist:
        - Application Backgrounded

    connection_mode:
      android_kotlin: device
      ios_swift: device
      cloud: cloud
    consent_management:
      android_kotlin:
        - provider: oneTrust
          consents:
            - marketing</code></pre></div>
</div>
<p>The above example loads Adjust&rsquo;s SDK in Kotlin and Swift apps in <code>device</code> mode and sends server-side events in <code>cloud</code> mode. <code>environment</code> and <code>partner_params_keys</code> affect only the cloud-mode traffic, and <code>enable_install_attribution_tracking</code> only the device-mode apps — see <a href="#install-attribution" >Install attribution</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="config-keys">Config keys</h2><p><code>config</code> accepts only the keys listed below. The <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/#config-key-rules" >shared config key rules</a> cover unknown keys, defaults, and immutability.</p>

<html lang="en">
<blockquote class="info">
  <div class="tip-quote">
    
    <div class="tip-text"><p>Several Adjust keys affect only one connection mode, or only some SDKs. Each key says which. Rudder CLI accepts every key whatever the mode — a key for the other mode is stored and ignored.</p>
<p>In <code>cloud</code> mode Adjust accepts only <code>track</code> events. In <code>device</code> mode, mobile sources send <code>identify</code> and <code>track</code>.</p>
</div>
  </div>
</blockquote>

</html>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="connection">Connection</h3><div class="rs-ckeys">
<div class="rs-ckey" id="app_token">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">app_token</p>RequiredSecret</div>
  <p class="rs-ckey__field">
    Type:
    <code>string</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Token of your Adjust app, which identifies it to Adjust in both modes. The dashboard calls it <strong>APP Token</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>At most 100 characters, and must not contain line breaks.</li>
<li>Templates aren&rsquo;t accepted in place of a literal; a template is measured as text against the same limit.</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/adjust/setup-guide/#where-can-i-find-the-adjust-app-token" >Where can I find the Adjust app token?</a>.</p>

</div>

</div>

<div class="rs-ckey" id="environment">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">environment</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>boolean</code>
  </p><p class="rs-ckey__field">
    Default value:
    <code>false</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Send events to Adjust&rsquo;s production environment. When <code>false</code> — the default — they go to the sandbox environment. The dashboard calls it <strong>Send to Production Environment on Adjust</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>Applies to <code>cloud</code> mode only. In <code>device</code> mode, the SDK picks sandbox or production from the log level it runs with, and iOS SDK v2 always sends to production.</li>
</ul>

</div>

<div class="rs-ckey__extra">
  See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/device-mode/#environment-dependency-on-log-level" >Environment dependency on log level</a>.
</div>

</div>

<div class="rs-ckey" id="delay">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">delay</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>string</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Delay, in seconds, before Adjust&rsquo;s SDK initializes in the app. Written as a string. The dashboard calls it <strong>Delay Time (in seconds)</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li>Applies to <code>device</code> mode on <code>unity</code> sources, and on <code>ios</code> sources running iOS SDK v2. Other SDKs initialize Adjust without a delay.</li>
<li>Values below <code>0</code> or above <code>10</code> are clamped to that range, and a value that isn&rsquo;t a number means no delay.</li>
<li>At most 100 characters, and must not contain line breaks. Not otherwise validated locally.</li>
<li>Templates aren&rsquo;t accepted in place of a literal; a template is measured as text against the same limit.</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">delay: &#34;5&#34;</code></pre></div>
</div>

</div>

</div>

</div>

<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="event-mapping">Event mapping</h3><div class="rs-ckeys">
<div class="rs-ckey" id="custom_mappings">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">custom_mappings</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>array of objects</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Maps RudderStack event names to Adjust event tokens. Only mapped events reach Adjust: a <code>track</code> event without a mapping isn&rsquo;t delivered, in either mode. The dashboard calls it <strong>Map Events to Adjust Event Tokens</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li><code>from</code> — RudderStack event name.</li>
<li><code>to</code> — Adjust event token. Create the event token in Adjust before you map to it.</li>
<li>Each is at most 100 characters, or a <code>{{ path || fallback }}</code> template.</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">custom_mappings:
  - from: Order Completed
    to: tf4gm5</code></pre></div>
</div>
<p>See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/setup-guide/#how-can-i-create-a-new-event-token-in-adjust" >How can I create a new event token in Adjust?</a>.</p>
</div>

</div>

<div class="rs-ckey" id="partner_params_keys">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">partner_params_keys</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>array of objects</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Maps <code>track</code> event properties to Adjust partner parameters, which Adjust forwards to the partners set up in your Adjust account. Properties without a mapping aren&rsquo;t sent as partner parameters. The dashboard calls it <strong>Rudderstack Parameters to Partner Parameters</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li><code>from</code> — name of the property in the event&rsquo;s <code>properties</code>.</li>
<li><code>to</code> — Adjust partner parameter key. RudderStack sends each value as a string.</li>
<li>Each is at most 100 characters, or a <code>{{ path || fallback }}</code> template.</li>
<li>Applies to <code>cloud</code> mode only. In <code>device</code> mode the SDK ignores this list, and sets only <code>anonymousId</code> and <code>userId</code> as partner parameters.</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">partner_params_keys:
  - from: revenue
    to: price</code></pre></div>
</div>
<p>See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/cloud-mode/#partner-parameters" >Partner parameters</a> and <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/faq/#how-can-i-set-up-new-partners-in-adjust" >How can I set up new partners in Adjust?</a>.</p>
</div>

</div>

</div>

<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="install-attribution">Install attribution</h3><div class="rs-ckeys">
<div class="rs-ckey" id="enable_install_attribution_tracking">
  <div class="rs-ckey__title">
    <p class="rs-ckey__name">enable_install_attribution_tracking</p></div>
  <p class="rs-ckey__field">
    Type:
    <code>object</code>
  </p>
<p class="rs-ckey__field">
  Description:
  Track an <code>Install Attributed</code> event when Adjust attributes the app install, with Adjust&rsquo;s tracker, network, campaign, click label, creative, and ad group in its properties. The SDK tracks it like any other event, so it reaches every destination the source is connected to. The dashboard calls it <strong>Enable Install Attribution</strong>.
</p>

<div class="rs-ckey__notes">
  <p class="rs-ckey__field">Notes:</p>
  <ul>
<li><code>android</code>, <code>android_kotlin</code>, <code>ios</code>, <code>ios_swift</code> — booleans. Each applies to sources of its own type: <code>android</code> to <code>android</code> sources, and so on.</li>
<li>Applies to <code>device</code> mode on those source types. On <code>ios</code>, iOS SDK v2 ignores it.</li>
<li>To record the event in Adjust too, map <code>Install Attributed</code> to an event token in <code>custom_mappings</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">enable_install_attribution_tracking:
  android_kotlin: true
  ios_swift: true</code></pre></div>
</div>
<p>See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/device-mode/#app-install-attribution" >App install attribution</a>.</p>
</div>

</div>

</div>

<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="event-filtering">Event filtering</h3>
<blockquote class="warning">
  <div class="tip-quote">
    
    <div class="tip-text"><a href="https://www.rudderstack.com/docs/sources/event-streams/sdks/event-filtering/" >Client-side event filtering</a> applies only to sources connected in <code>device</code> mode — the dashboard shows these controls only then, and the SDK is what applies the filter. Rudder CLI accepts the block in any mode, but it has no effect on cloud-mode events.</div>
  </div>
</blockquote>
<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 Adjust, by event name.
</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>
</ul>

</div>

</div>

</div>

<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="per-source-keys">Per-source keys</h3><p>Both keys are objects keyed by the local source type — the tokens listed under <a href="#source-types" >Source types</a>. A key naming a source type this destination doesn&rsquo;t support fails validation.</p>
<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 Adjust in, using the modes in <a href="#source-types" >Source types</a>.
</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>A mode the source type doesn&rsquo;t support on this destination fails validation — for example <code>device</code> for <code>react_native</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:
  android: device
  ios: device
  cloud: cloud</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/dev-tools/rudder-cli/destination-types/#consent-management" >Consent management</a>.
</p>

</div>

</div>

<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="source-types">Source types</h2><p>Adjust accepts events from these source types in the mentioned connection modes:</p>
<table>
  <thead>
      <tr>
          <th>Source type</th>
          <th>Connection mode</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>android</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>android_kotlin</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>ios</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>ios_swift</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>unity</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>react_native</code></td>
          <td><code>cloud</code></td>
      </tr>
      <tr>
          <td><code>flutter</code></td>
          <td><code>cloud</code>, <code>device</code></td>
      </tr>
      <tr>
          <td><code>cordova</code></td>
          <td><code>cloud</code></td>
      </tr>
      <tr>
          <td><code>cloud</code></td>
          <td><code>cloud</code></td>
      </tr>
      <tr>
          <td><code>warehouse</code></td>
          <td><code>cloud</code></td>
      </tr>
  </tbody>
</table>
<p><code>android</code>, <code>android_kotlin</code>, <code>ios</code>, <code>ios_swift</code>, <code>unity</code>, and <code>flutter</code> offer <code>device</code> mode. <code>react_native</code> and <code>cordova</code> are <code>cloud</code> only. See <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/device-mode/" >Adjust device mode</a>.</p>
<p>Adjust doesn&rsquo;t accept <code>web</code> sources, even in the dashboard.</p>

<p><code>warehouse</code> is the token a <a href="https://www.rudderstack.com/docs/sources/reverse-etl/" >Reverse ETL source</a> resolves to. Rudder CLI manages the destination’s <code>warehouse</code> entry — if the destination is connected to a Reverse ETL source, set <code>connection_mode.warehouse: cloud</code> in its spec, or <code>apply</code> removes it.</p>
<p>Rudder CLI can also declare the Reverse ETL connection itself, for the types listed under <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-retl-connections/#supported-destinations" >Supported destinations</a> — see <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/retl-connections/" >Manage Reverse ETL Connections using Rudder CLI</a>.</p>

<html lang="en">
<blockquote class="info">
  <div class="tip-quote">
    
    <div class="tip-text">The dashboard additionally offers Adjust to Shopify sources. Rudder CLI doesn&rsquo;t manage those connections, so <code>shopify</code> is invalid here.</div>
  </div>
</blockquote>

</html>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="connect-a-source">Connect a source</h2><p>An event stream connection to this destination is checked against two rules at <code>validate</code> time.</p>
<p><strong>The source&rsquo;s type must be supported.</strong> A source&rsquo;s type resolves to one of the tokens above before the check — webhook and server-side SDK sources resolve to <code>cloud</code>. A JavaScript source resolves to <code>web</code>, which Adjust doesn&rsquo;t accept, and reports, for example:</p>
<div class="rs-code">
  <div class="rs-code__head"><button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">destination &#39;adjust-prod&#39; (type &#39;adj&#39;) does not support source &#39;my-web-app&#39;:
source type &#39;web&#39; is not among supported source types: android, android_kotlin, ios, ios_swift, unity, react_native, flutter, cordova, cloud, warehouse</code></pre></div>
</div>
<p><strong>The destination config must carry a <code>connection_mode</code> entry for that source type.</strong> This lives on the destination spec, not on the <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-connections/" >connection spec</a>. Without it:</p>
<div class="rs-code">
  <div class="rs-code__head"><button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">destination &#39;adjust-prod&#39; config has no &#39;connection_mode&#39; entry for source type &#39;android&#39;</code></pre></div>
</div>
<p>Adjust needs no additional config keys to connect a source of any type, in any mode.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="secrets">Secrets</h2><p><code>app_token</code> is the only secret key. Write it as a <code>{{ .VAR }}</code> reference and supply the value at apply time:</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">config:
  app_token: &#34;{{ .ADJUST_APP_TOKEN }}&#34;</code></pre></div>
</div>
<div class="rs-code">
  <div class="rs-code__head">bash<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">export RUDDER_ADJUST_APP_TOKEN=&#34;...&#34;
rudder-cli apply

# or
rudder-cli apply --var-file secrets.vars.yaml</code></pre></div>
</div>
<p>Note that:</p>
<ul>
<li><code>rudder-cli import</code> writes only the secrets the API returns, as <code>{{ .VAR }}</code> references, and leaves the others out. Add any secret key it leaves out, then supply the variables before you apply — see <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/#secrets" >Secrets</a>.</li>
<li>In <code>device</code> mode the app token is embedded in the app, so masking it protects your YAML, not the value itself.</li>
</ul>
<p>See <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/variable-substitution/" >How to Use Variable Substitution in Rudder CLI</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="changes-by-release">Changes by release</h2>
<p>No changes since this type became available.</p>
<p>For changes across every destination type, see <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/changes/" >Destination Type Changes by Release</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="see-more">See more</h2><ul>
<li><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/setup-guide/" >Adjust Destination</a> for the app token, event tokens, and connection settings</li>
<li><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/cloud-mode/" >Adjust Cloud Mode Integration</a> and <a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/device-mode/" >Adjust Device Mode Integration</a> for how events reach Adjust in each mode</li>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/" >Destination Type Reference for Rudder CLI</a> for the rules shared across destination types</li>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-destinations/" >Destination YAML Reference</a> for the spec envelope</li>
</ul>

