> For the complete documentation index, see [llms.txt](https://even-financial.gitbook.io/developer-center/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://even-financial.gitbook.io/developer-center/channel-partner-reporting/attribution-tracking.md).

# Attribution Tracking

## Format your tags

Every integration type uses <mark style="color:violet;background-color:violet;">**`{key}`**</mark> & <mark style="color:cyan;">**`{value}`**</mark> pairing

* <mark style="color:violet;">**`{key}`**</mark>: Your identifier, e.g. `clientId` or `subId`
* <mark style="color:cyan;">**`{value}`**</mark>: The real alphanumeric value for that specific click, e.g. `8f3a2b1c9d`

### Supported Client Tag Keys

Below are the client tag keys that are currently supported.

{% columns %}
{% column %}
**Most common**

* `tag.clientId`
* `tag.subId`
* `tag.subId1`
* `tag.subId2`
* `tag.campaignId`
  {% endcolumn %}

{% column %}
**Also supported**

* `tag.agentId`
* `tag.clickId`
* `tag.deviceId`
* `tag.medium`
* `tag.sourceId`
* `tag.subId3`
* `tag.target`
* `tag.trafficsource`
* `tag.userId`
  {% endcolumn %}
  {% endcolumns %}

{% hint style="danger" %}
**Client tag keys are case-sensitive.** `subid` and `subId` are separate reporting keys.
{% endhint %}

<table><thead><tr><th width="51.39453125"></th><th width="414.4017333984375">Example</th><th>Why</th></tr></thead><tbody><tr><td>❌</td><td><code>?tag.sub1={}&#x26;tag.sub2={}</code></td><td>Unsupported tags</td></tr><tr><td>❌</td><td><code>?tag.subId1={}&#x26;tag.subId2={}</code></td><td><code>{}</code> is a literal placeholder. Engine stores empty values.</td></tr><tr><td>❌</td><td><code>?tag.subId1=value1&#x26;tag.subId2=value2</code></td><td><code>value1</code> and <code>value2</code> are literal text, not real click values.</td></tr><tr><td>✅</td><td><code>?tag.subId1=8f3a2b1c9d&#x26;tag.subId2=4e7c1a92f0</code></td><td>Each key has a real value for that click.</td></tr></tbody></table>

***

## Attribution Guides by Integration

<a href="#partner-page" class="button primary" data-icon="link">Partner Page</a> <a href="#embed" class="button primary" data-icon="code">Embed</a> <a href="#affiliate-link" class="button primary" data-icon="arrow-up-right-from-square">Affiliate Link</a> <a href="#native-api-integrations" class="button primary" data-icon="code">Native API</a> <a href="#mobile-sdk-integrations" class="button primary" data-icon="mobile-screen">Mobile SDK</a>

### Partner Page

{% hint style="info" icon="list-dropdown" %}

#### Quick reference

<i class="fa-person-carry-box">:person-carry-box:</i> **Send via:** URL query parameters

<i class="fa-circle-question">:circle-question:</i> **First tag:** Start with `?`

<i class="fa-tags">:tags:</i> **More tags:** Separate each tag with `&`
{% endhint %}

**Format & Example**

**Engine URL**

{% code overflow="wrap" expandable="true" %}

```actionscript-3
<moneylion.com/network/channel/zone/?tag.clientId=abc&tag.subId=def&tag.subId1=xyz>    
```

{% endcode %}

**Example with client tags**

{% code overflow="wrap" %}

```html
<moneylion.com/network/companychannel/loans/search?tag.clientId=8f3a2b1c9d&tag.subId=email-q1&tag.subId1=campaign-42>
```

{% endcode %}

{% stepper %}
{% step %} <i class="fa-link">:link:</i> **Start with your Engine URL**

* Engine provides the base URL, channel, and zone.
  {% endstep %}

{% step %} <i class="fa-plus">:plus:</i> **Add your tags**

* Start with `?`. Separate multiple tags with `&`.
* Add your tags to the end of the URL.
  {% endstep %}

{% step %} <i class="fa-magnifying-glass">:magnifying-glass:</i> **Review the completed URL**

* Open the finished link.
* Confirm the address bar shows real values, not `{}` or `value`.
  {% endstep %}

{% step %} <i class="fa-vial-circle-check">:vial-circle-check:</i> **Verify and test**

* [ ] Confirm every key starts with `tag.` and matches a supported key.
* [ ] Test the link, then ask your Partner Manager to confirm Engine received the values.
  {% endstep %}
  {% endstepper %}

***

### Web Embeds

{% hint style="info" icon="list-dropdown" %}

#### Quick reference

<i class="fa-person-carry-box">:person-carry-box:</i> **Send via:** HTML attribute string

<i class="fa-ban">:ban:</i> **First tag:** Do NOT use `?`

<i class="fa-tags">:tags:</i> **More tags:** Separate each tag with `&`
{% endhint %}

**Format & Example (No Auto-Mount)**

{% code overflow="wrap" %}

```html
<!-- Client tags: replace each {key} and {value} -->
<moneylion-{product} tags="tag.{key1}={value1}&tag.{key2}={value2}">
```

{% endcode %}

{% code overflow="wrap" %}

```html
<!-- Engine script -->
<script
  async
  src="https://www.moneylion.com/network/{channel}/{zone}/web-component/credit-cards-search/index.js"
></script>
<!-- Client tags -->
<moneylion-credit-cards-search
  tags="tag.clientId=8f3a2b1c9d&tag.source=email"
></moneylion-credit-cards-search>
```

{% endcode %}

**Format & Example (If Auto-Mount)**

{% code overflow="wrap" expandable="true" %}

```html
<!-- Engine script and client tags -->
<script
  async
  src=".../web-component/{product}/index.js"
  data-embed-type="auto-mount"
  data-tags="tag.{key1}={value1}&tag.{key2}={value2}"
></script>
```

{% endcode %}

{% code overflow="wrap" expandable="true" %}

```html
<!-- Engine script and client tags -->
<script
  async
  src="https://www.moneylion.com/network/{channel}/{zone}/web-component/lending-search/index.js"
  data-embed-type="auto-mount"
  data-tags="tag.clientId=8f3a2b1c9d&tag.source=email"
></script>
```

{% endcode %}

{% stepper %}
{% step %} <i class="fa-code">:code:</i> **Find your product tag**

* Without Automount: Find your `moneylion-{some-product}` tag.
* With Automount: Use your product’s web-component script URL
  {% endstep %}

{% step %} <i class="fa-plus">:plus:</i> **Add the tag attribute**

Do not use `?`. Separate multiple tags with `&`.
{% endstep %}

{% step %} <i class="fa-magnifying-glass">:magnifying-glass:</i> **Review the tag attribute**

Confirm every key starts with `tag.` and uses a supported key.
{% endstep %}

{% step %} <i class="fa-vial-circle-check">:vial-circle-check:</i> **Verify and test**

* [ ] Confirm tags use the `tag.` prefix and are separated with `&` (no `?` inside the attribute).
* [ ] Confirm you used `tags` on the custom element, or `data-tags` on an auto-mount script.
* [ ] Load the embed, complete a test lead, then ask your Partner Manager to confirm the values were received.
  {% endstep %}
  {% endstepper %}

***

### Affiliate Link

{% hint style="info" icon="list-dropdown" %}

#### Quick reference

<i class="fa-link">:link:</i> **Send via:** URL query parameters\ <i class="fa-circle-question">:circle-question:</i> **First query parameter:** Start with `?`\ <i class="fa-code-branch">:code-branch:</i> **More parameters:** Separate with `&`\ <i class="fa-tag">:tag:</i> **Client tags:** Start every key with `tag.`\ <i class="fa-circle-exclamation">:circle-exclamation:</i> **Limit:** Engine keeps up to five `tag.*` parameters
{% endhint %}

**Format & Examples**

**Client tag parameters**

```powerquery
?tag.{key1}={value1}&tag.{key2}={value2}
```

**Destination URL with client tags**

{% code overflow="wrap" %}

```powerquery
<offers.moneylion.com/channelTrackingOfferRedirects/{subAccountUuid}/{offerUuid}?tag.clientId=8f3a2b1c9d&tag.subId=email-q1>
```

{% endcode %}

If the URL already has query params, start with `&` instead of `?`:

**Append client tags**

{% code overflow="wrap" expandable="true" %}

```powerquery
&tag.{key1}={value1}&tag.{key2}={value2}
```

{% endcode %}

**Destination URL with existing parameters**

{% code overflow="wrap" expandable="true" %}

```powerquery
<offers.moneylion.com/channelTrackingOfferRedirects/{subAccountUuid}/{offerUuid}?partnerUserId=user-1&tag.clientId=8f3a2b1c9d&tag.subId=email-q1
```

{% endcode %}

**Example**

{% stepper %}
{% step %} <i class="fa-link">:link:</i> **Start with your tracking link**

* Use your tracking or redirect link.
  {% endstep %}

{% step %} <i class="fa-plus">:plus:</i> **Add your tags**

* Add `?tag.clientId=c1&tag.source=email>` to the end
* Use your tracking platform's macro when it supplies a click value.
  {% endstep %}

{% step %} <i class="fa-magnifying-glass">:magnifying-glass:</i> **Review the completed URL**

* Click the link.
* Confirm the resulting URL contains a real value, not a macro or `{}`.
  {% endstep %}

{% step %} <i class="fa-vial-circle-check">:vial-circle-check:</i> **Verify and test**

* [ ] Confirm every key starts with `tag.` and appears on the Engine destination URL.
* [ ] Click the link and confirm macros resolved to real values (not `{}`).
* [ ] Ask your Partner Manager to confirm the values were received.
  {% endstep %}
  {% endstepper %}

{% hint style="danger" %}
**One thing that's different:**

On a Partner Page, your system usually already knows the real value.

On an Affiliate Link, your affiliate/ad-tracking platform (Everflow, HasOffers/TUNE, CAKE, Impact, etc.) fills it in at the moment of the click, using that platform's own macro. See below
{% endhint %}

#### Third-Party Tracking or Redirect Platform

1. Open your offer setup in your tracking platform (Everflow, HasOffers/TUNE, CAKE, Impact, etc.).
2. Find the field called "Destination URL," "Offer URL," or "Tracking URL."
3. Set it to end with `tag.` + your key name + your platform's click-ID macro:

   ```powerquery
   ?tag.subId2={your_platforms_click_id_macro}
   ```
4. Confirm it worked: click your own tracking link (or use your platform's link tester). The resulting URL should show `tag.subId2=` followed by a real, unique value:

   ```powerquery
   ?tag.subId2=8f3a2b1c9d4e
   ```

***

### Native API Integrations

{% hint style="info" icon="list-dropdown" %}

#### Quick reference

<i class="fa-code">:code:</i> **Keys:** Use bare supported keys\ <i class="fa-layer-group">:layer-group:</i> **Values:** Send each value in a string array\ <i class="fa-ban">:ban:</i> **Do not use:** The `tag.` prefix
{% endhint %}

**Format & Example**

```json
"clientTags": {
  "{key1}": ["{value1}"],
  "{key2}": ["{value2}"]
}
```

```json
"clientTags": {
  "clientId": ["client1"],
  "trafficsource": ["email"],
  "campaignId": ["campaign1"]
}
```

{% stepper %}
{% step %} <i class="fa-plus">:plus:</i> **Add the `clientTags` object**

* Add `clientTags` to the top level of your request body.
  {% endstep %}

{% step %} <i class="fa-list">:list:</i> **Add one value per key**

* Give each key an array with one value. Use separate keys for multiple tags.
  {% endstep %}

{% step %} <i class="fa-magnifying-glass">:magnifying-glass:</i> **Review your request**

* Use supported bare keys. Do not add the `tag.` prefix.
* Confirm every value is real, non-empty, and inside a string array.
  {% endstep %}

{% step %} <i class="fa-vial-circle-check">:vial-circle-check:</i> **Verify and test**

* [ ] Confirm `clientTags` is on the lead request body with bare keys (no `tag.` prefix).
* [ ] Confirm each value is a string array.
* [ ] Submit a test lead, then ask your Partner Manager to confirm the values were received (or check GET Lead Client Tags).
  {% endstep %}
  {% endstepper %}

More info: [API Reference](https://engine.tech/docs/api-reference/#loans) for the full request body, [GET Lead Client Tags](https://engine.tech/docs/api-reference/#get-lead-client-tags) for reading tags back out.

***

### Mobile SDK Integrations

{% hint style="info" icon="list-dropdown" %}

#### Quick reference

<i class="fa-code">:code:</i> **Keys:** Use bare supported keys\ <i class="fa-layer-group">:layer-group:</i> **Values:** Send each value in a string array\ <i class="fa-ban">:ban:</i> **Do not use:** The `tag.` prefix
{% endhint %}

**Format & Examples**

{% tabs %}
{% tab title="React Native" %}

1. Add `clientTags` as a prop on `<EngineSDK>`.
2. Give each key a string array.

```javascript
clientTags={{ clientId: ["client1"], trafficSource: ["email"] }}
```

{% endtab %}

{% tab title="Flutter" %}

1. Add `clientTags` on the top-level `EngineSDK` widget.
2. Use a `Map<String, List<String>>`.

```dart
clientTags: { "clientId": ["client1"], "trafficsource": ["email"] }
```

{% endtab %}

{% tab title="Kotlin" %}

1. Pass `clientTags` into the `EngineSDK` constructor.
2. Use `Map<String, List<String>>`.

{% code overflow="wrap" expandable="true" %}

```kotlin
clientTags = mapOf(
  "clientId" to listOf("client1"),
  "trafficSource" to listOf("email"),
)
```

{% endcode %}
{% endtab %}

{% tab title="Swift" %}

1. Add `clientTags` on `EngineSDKConfig`.
2. Use `[String: [String]]`.

{% code overflow="wrap" expandable="true" %}

```swift
clientTags: [
  "clientId": ["client1"],
  "trafficSource": ["email"],
]
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% stepper %}
{% step %} <i class="fa-plus">:plus:</i> **Add `clientTags`**

* React Native: add `clientTags` as a prop on `<EngineSDK>`.
* Flutter: add `clientTags` on the top-level `EngineSDK` widget.
* Kotlin: pass `clientTags` into the `EngineSDK` constructor.
* Swift: add `clientTags` on `EngineSDKConfig`.
  {% endstep %}

{% step %} <i class="fa-list">:list:</i> **Set your tag values**

* React Native: give each key a string array. Use separate keys for multiple tags.
* Flutter: use a `Map<String, List<String>>`. Give each key one value per list.
* Kotlin: use a `Map<String, List<String>>`. Give each key one value per list.
* Swift: use a `[String: [String]]` dictionary. Give each key one value per array.
  {% endstep %}

{% step %} <i class="fa-magnifying-glass">:magnifying-glass:</i> **Review your configuration**

* Use supported bare keys. Do not add the `tag.` prefix.
* Confirm every value is real, non-empty, and inside a string array.
  {% endstep %}

{% step %} <i class="fa-vial-circle-check">:vial-circle-check:</i> **Verify and test**

* [ ] `bearerToken`, `personalInformation`, and `clientTags` are all set
* [ ] Tag values are unique/easy to find (e.g. `sdk-test-001`)
* [ ] SDK launches and the embed loads
* [ ] You complete a test lead
* [ ] Tags show up in reporting with bare keys (`clientId`, not `tag.clientId`)
* [ ] Values match what you sent
  {% endstep %}
  {% endstepper %}

{% hint style="danger" %}
**Client tags are only sent on the prefill path.**

Across React Native, Flutter, Kotlin, and Swift, that means `bearerToken` plus `personalInformation` must be provided. Without those, the SDK opens the default embed URL and does not attach `clientTags`.

* Send prefill as separate named fields on the SDK (`personalInformation`, `loanInformation`, etc.).
* Legacy `prefilledData` deprecated July 2026
  {% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://even-financial.gitbook.io/developer-center/channel-partner-reporting/attribution-tracking.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
