> ## Documentation Index
> Fetch the complete documentation index at: /docs/llms.txt
> Use this file to discover all available pages before exploring further.

# TUNE (HasOffers) and ClickFlare Integration Guide

> Track TUNE (HasOffers) offers in ClickFlare: pass the click ID in aff_sub2, add a postback per offer and goal, and keep goals apart with a unique txid.

![TUNE and ClickFlare Integration](https://mintcdn.com/clickflare/4sKPX9euqo1EdzV2/images/integrations/covers/tune.png?fit=max\&auto=format\&n=4sKPX9euqo1EdzV2\&q=85\&s=14cab719fc384491baf1d6778f2f6535)

TUNE, formerly HasOffers, is the platform behind many affiliate networks. As an affiliate (TUNE says "partner"), you log in to the network's own portal, often on the network's domain or on `yournetwork.hasoffers.com`, pick offers, get tracking links and place postbacks. Your portal may never show the TUNE name: if the tracking links contain `aff_c?offer_id=` and `aff_id=`, the network runs on TUNE.

To track TUNE offers in ClickFlare, two links have to carry the ClickFlare click ID in both directions:

* **The offer URL** sends the ClickFlare click ID to TUNE in `aff_sub2`.
* **The postback URL** sends it back to ClickFlare with every conversion, together with the payout and a transaction ID.

This guide covers the full setup, why TUNE's `{transaction_id}` is not a conversion ID, how to handle offers with several goals, and how to test the postback.

> [!TIP]
>
> Only need the two values? The [Click ID & postback macros](/docs/en/integrations/click-id-and-postback-macros.md?q=tune) page has them ready to copy with your tracking domain.

***

## How the data flows

```text theme={null}
Ad click
  → https://trk.yourdomain.com/cf/r/CAMPAIGN?...
     (ClickFlare records the click and generates the click ID)
  → [optional lander → CTA uses the ClickFlare click URL]
  → https://network-domain.com/aff_c?offer_id=123&aff_id=456&aff_sub2=CF_CLICK_ID
     (TUNE stores the ClickFlare click ID in aff_sub2)
  → Visitor converts on the advertiser's page
  → TUNE fires your postback:
     https://trk.yourdomain.com/cf/cv?click_id=CF_CLICK_ID&payout=18.00&txid=TUNE_SESSION-GOAL
     (ClickFlare matches the conversion to the original click)
```

The two links mirror each other:

| Link | Built from | TUNE side | ClickFlare side |
| - | - | - | - |
| **Offer URL** (in ClickFlare) | TUNE's parameter + ClickFlare's token | `aff_sub2` | `{cf_click_id}` |
| **Postback URL** (in TUNE) | ClickFlare's parameter + TUNE's macro | `{aff_sub2}`, `{payout}`, `{transaction_id}-{goal_id}` | `click_id`, `payout`, `txid` |

> [!NOTE]
>
> **Offer URL = their parameter + your token. Postback URL = your parameter + their macro.** TUNE writes the click ID into `aff_sub2` on the way in and reads it back with the `{aff_sub2}` macro on the way out. The number must match: `aff_sub2` in the link and `{aff_sub}` in the postback returns the wrong value.

***

## What you'll need

* An active ClickFlare account with your **own tracking domain** set up. Shared domains get flagged by networks and blocked by browsers. See [Tracking domains](/docs/en/settings/tracking-domains.md).
* A partner account on the network's TUNE portal, approved for the offer you want to run.
* Third-party tracking allowed on the offer. Networks turn this on per offer. Without it, the offer has no **Your Pixels / Postbacks** section.

***

## What the TUNE template contains

ClickFlare has a **Tune (HasOffers)** affiliate network template. It fills in the TUNE macros ClickFlare needs.

![The Tune (HasOffers) template in ClickFlare: Click Id is \{aff\_sub2}, Payout is \{payout} and Transaction ID is \{transaction\_id}-\{goal\_id}](https://mintcdn.com/clickflare/5BI9OfIyRked4RSo/images/integrations/tune/clickflare-tune-template-parameters.png?fit=max\&auto=format\&n=5BI9OfIyRked4RSo\&q=85\&s=df463cf45913a9ce6d4176403bf50a5d)

| Field | TUNE macro (AN Token) | ClickFlare parameter | What it does |
| - | - | - | - |
| **Click Id** | `{aff_sub2}` | `click_id` | Returns the ClickFlare click ID that the offer URL put in `aff_sub2`. Pre-filled by the template. |
| **Payout** | `{payout}` | `payout` | Your payout for the conversion, in the offer's currency. Pre-filled by the template. |
| **Transaction ID** | `{transaction_id}-{goal_id}` (change it) | `txid` | Unique per click and goal. The template fills in `{transaction_id}`: add `-{goal_id}`. See [why](#why-transaction_id-is-not-a-conversion-id). |
| **Event Type** | leave empty, or set per goal | `ct` | The conversion type. See [Offers with several goals](#offers-with-several-goals). |

***

## Setup

Everything in ClickFlare is done from inside the campaign editor. Create the offer and the affiliate network inline as you go.

**1. Set up your own tracking domain**

Add a custom tracking domain before anything else, for example `trk.yourdomain.com`. The postback URL is built on this domain, so changing it later means updating the postback on every TUNE offer too. See [Tracking domains](/docs/en/settings/tracking-domains.md).

**2. Report conversions by postback time**

Go to **Settings → General Settings** and set **Conversion registration time reporting** to **Postback Timestamp**.

TUNE reports a conversion on the day it happened. With the default **Visit Timestamp**, ClickFlare reports it on the day of the original click, so a conversion that comes in days later lands on a different date in each platform. See [Conversion registration time](/docs/en/settings/conversion-registration-time-reporting.md).

> [!NOTE]
>
> This is an account-wide setting. It changes the date conversions are reported on for every campaign.

**3. Create the campaign**

Go to **Campaigns → New Campaign**, choose **Redirect tracking**, pick your traffic source and select your tracking domain. See [Creating a campaign](/docs/en/campaigns/creating-a-campaign-in-click-flare.md).

**4. Create the TUNE affiliate network**

While creating the offer for the campaign, create a new affiliate network in its **Affiliate Network** field. You can also create it first under **Affiliate Networks → + New**. Either way:

1. Search for **Tune** and pick the **Tune (HasOffers)** template.
2. Name it after the network, for example "TUNE - NetworkName". Each TUNE network has its own portal and its own postbacks, so create one affiliate network per TUNE network.
3. Change **Transaction ID** from `{transaction_id}` to `{transaction_id}-{goal_id}`.
4. Leave **Event Type** empty.
5. Under **Conversion tracking**, select your own **Tracking Domain** and keep **S2S Postback URL** as the tracking method.
6. Set **Payout currency** to the currency of the network's offers.

ClickFlare builds the postback URL from these fields:

```text theme={null}
https://trk.yourdomain.com/cf/cv?click_id={aff_sub2}&payout={payout}&txid={transaction_id}-{goal_id}
```

![The Conversion tracking section of the TUNE network in ClickFlare, with the generated postback URL: click\_id=\{aff\_sub2}, payout=\{payout} and txid=\{transaction\_id}-\{goal\_id}](https://mintcdn.com/clickflare/5BI9OfIyRked4RSo/images/integrations/tune/clickflare-tune-postback-url.png?fit=max\&auto=format\&n=5BI9OfIyRked4RSo\&q=85\&s=4bdeb8e6e62eb8fc3e4fb27e78c70149)

Copy the postback URL and save the network.

**5. Get the offer's tracking link from TUNE**

In the TUNE portal, go to **Offers → All Offers** and open the offer. The **Your Tracking Link** box shows your link:

```text theme={null}
https://network-domain.com/aff_c?offer_id=123&aff_id=456
```

`offer_id` is the offer and `aff_id` is your partner ID. You can click **Add Sub IDs**, then **More Sub IDs**, and type `{cf_click_id}` in the second sub ID field, then click **Refresh**. Or copy the link as it is and add the sub ID in ClickFlare in the next step.

> [!NOTE]
>
> Copy the full link, not the **TinyURL** version. A tiny URL works too, but values appended to it must stay under TUNE's 500-character limit.

**6. Create the offer in ClickFlare**

In the offer form:

1. Name the offer.
2. Select the TUNE affiliate network you just created.
3. Paste the TUNE link into **Offer URL** with `&aff_sub2={cf_click_id}` at the end:

```text theme={null}
https://network-domain.com/aff_c?offer_id=123&aff_id=456&aff_sub2={cf_click_id}
```

![The ClickFlare New Offer form with the TUNE affiliate network selected and aff\_sub2=\{cf\_click\_id} at the end of the Offer URL](https://mintcdn.com/clickflare/5BI9OfIyRked4RSo/images/integrations/tune/clickflare-tune-offer-url.png?fit=max\&auto=format\&n=5BI9OfIyRked4RSo\&q=85\&s=9e5d51410cd95c91b9f3162202d87993)

If you pasted the link without `aff_sub2`, turn on **Append Click ID to Offer Url** instead. ClickFlare then adds `aff_sub2={cf_click_id}` from the template. Use one or the other, not both.

> [!WARNING]
>
> Write `{cf_click_id}` with braces. Without them TUNE stores the literal text `cf_click_id`, the postback returns that text, and the conversion cannot be matched to a click.

Set the payout to **Auto** so ClickFlare uses the `payout` value from the postback.

**7. Add the postback in TUNE**

Back in the TUNE portal, open the same offer, scroll to **Your Pixels / Postbacks** and click **Add New Pixel/Postback**. Then:

1. Choose **Postback** as the type (called **Postback URL** in some portals). It works on every offer, whatever tracking method the advertiser uses.
2. Select the **goals** the postback should count. On an offer with one goal, select it. On an offer with several, select every goal you want in ClickFlare. See [Offers with several goals](#offers-with-several-goals).
3. Paste the ClickFlare postback URL into **Code**. The macros TUNE supports are listed next to it.
4. Click **Create**.

The postback shows as **Active**, or as **Pending** if the network approves partner postbacks first. A pending postback doesn't fire: ask your affiliate manager to approve it.

> [!NOTE]
>
> The postback is set **per offer**. Only network staff can add a postback for all your offers ("All Offers"), so if you want one, send the URL to your affiliate manager. Don't keep both a global and an offer postback for the same offer: TUNE fires both.

**8. Add a lander (optional)**

If you send traffic through a lander before the offer, the lander's CTA must use the **ClickFlare click URL**, not the TUNE link. ClickFlare then adds the click ID when it redirects to the offer. See [Paths with landers and offers](/docs/en/campaigns/campaign-s-path-destination-to-landers-offers.md).

**9. Save the campaign and launch**

Save the campaign, copy the campaign URL from the **Tracking** tab and use it in your ads. Before you spend money on traffic, run the checks in [Verify the setup](#verify-the-setup).

***

## Why transaction\_id is not a conversion ID

By default ClickFlare keeps **one conversion per click ID**. If several postbacks arrive with the same click ID and no transaction ID, ClickFlare treats them as the same conversion, and you only see one of them (the last one received). The `txid` parameter tells ClickFlare that each postback is a separate conversion, so its value has to be **different on every conversion**.

TUNE's `{transaction_id}` is the ID of the **click session**, not of the conversion. Every goal reached from one click carries the same `{transaction_id}`. By default, TUNE even gives a repeat click by the same visitor on the same offer and day the same ID. On its own, it doesn't tell ClickFlare that a sale after a lead is a second conversion.

| TUNE macro | Value | Use it as txid? |
| - | - | - |
| `{transaction_id}-{goal_id}` | The click session plus the goal | **Yes**: unique per click and goal |
| `{transaction_id}` | The click session, the same for every goal on the click | Only on single-goal offers |
| `{adv_sub}` | An ID the advertiser sends, often an order ID | Only if your network confirms the advertiser sends one |
| `{ran}` | A random number, new on every send | No: a resent postback counts twice |

TUNE replaces each macro wherever it appears in the URL, so `{transaction_id}-{goal_id}` arrives as, for example, `102abc7f-4`. On the default goal `{goal_id}` is empty, which gives `102abc7f-`: still unique for that click.

> [!NOTE]
>
> TUNE has no macro for its own conversion ID. If an offer pays on the **same goal** more than once for one click (repeat purchases, rebills), `{transaction_id}-{goal_id}` is the same each time and ClickFlare keeps one of them. Ask your affiliate manager whether the advertiser sends an order ID in `{adv_sub}`, and use `txid={adv_sub}` on that offer if so.

***

## Offers with several goals

A TUNE offer can pay on several **goals**, for example a registration and a first deposit. In TUNE, partner postbacks are attached to goals:

* **Select every goal you want counted** when you add the postback. A postback without the right goal never fires for it. Private goals can't take partner postbacks.
* **One postback for all goals** is enough for counting: with `txid={transaction_id}-{goal_id}`, each goal arrives as its own conversion, and the payout differs per goal.
* **One postback per goal** lets you report each goal as its own column in ClickFlare. Add a separate postback per goal, each with `&ct=` and a [custom conversion](/docs/en/settings/custom-conversions.md) parameter at the end:

```text theme={null}
https://trk.yourdomain.com/cf/cv?click_id={aff_sub2}&payout={payout}&txid={transaction_id}-{goal_id}&ct=deposit
```

> [!WARNING]
>
> The `ct` value must **exactly match** a parameter of a custom conversion in ClickFlare. If it doesn't, ClickFlare records a regular conversion instead.

***

## Pending and rejected conversions

Networks can make conversions wait for approval. TUNE doesn't document whether a partner postback fires while a conversion is pending, when it's approved later, or never for a rejected one, and it has no status macro.

* Ask your affiliate manager how their offers handle it.
* Treat ClickFlare's numbers as recorded conversions, and compare them with the network's conversion report before payday.

***

## Verify the setup

**1. Click through the campaign**

Open the ClickFlare campaign URL (with a lander, also click the CTA). When the offer loads, the first request goes to the network's `aff_c` link. Check that it has `aff_sub2=` followed by a real ClickFlare click ID, not the literal text `{cf_click_id}`.

**2. Ask for a test conversion**

TUNE's postback test is on the network side. Send your affiliate manager your **ClickFlare campaign URL** and ask them to run TUNE's test on your postback. They open your link, so the session gets a real ClickFlare click ID, and TUNE shows them the exact postback it sent and ClickFlare's response. A test on the bare TUNE link has no click ID and can't be matched.

**3. Check the conversion in ClickFlare**

The conversion should appear on the campaign with the payout from TUNE. In **Logs → Event Logs**, check that its `txid` contains the transaction ID and the goal, for example `102abc7f-4`. If you see `-{goal_id}` literally, the portal didn't replace the macro: tell your affiliate manager and fall back to `txid={transaction_id}`.

***

## Troubleshooting

> **Conversions show in TUNE but not in ClickFlare**
>
> Work through these in order:
>
> * **The postback is Pending.** The network hasn't approved it yet.
> * **The postback isn't on that goal.** Open the offer's **Your Pixels / Postbacks** and check that the goal is selected.
> * **There's no Your Pixels / Postbacks section.** Third-party tracking isn't allowed on the offer. Ask your affiliate manager to enable it or to add the postback for you.
> * **aff\_sub2 is empty in TUNE.** The offer URL is missing `aff_sub2={cf_click_id}`, or the lander CTA links straight to TUNE instead of using the ClickFlare click URL.
> * **The sub ID numbers don't match.** The offer URL uses `aff_sub2` and the postback reads `{aff_sub}`, or the other way around.
> * **The offer uses "Server Postback w/ Partner ID".** On these offers, sub IDs only come back if the advertiser returns them. Ask your affiliate manager.
>
> See [Troubleshooting S2S postbacks](/docs/en/tracking/troubleshooting-s2s-postback-url-in-clickflare.md) for the general checks.

> **A lead shows but the sale doesn't**
>
> The postback uses `txid={transaction_id}`, so the sale arrived with the same click ID and transaction ID as the lead and replaced it. Change the transaction ID to `{transaction_id}-{goal_id}` in the ClickFlare affiliate network and in the TUNE postback, and check the sale goal is selected on the postback. Conversions that were already merged are not restored.

> **Conversions are counted twice**
>
> The same conversion fires two postbacks: one on the offer and one global, or two identical postbacks on the same goal. Remove one, or make sure both send the same `txid` so ClickFlare treats them as one.

> **The payout is 0 or in the wrong currency**
>
> * Check that the postback has `payout={payout}` and the offer's payout is set to **Auto** in ClickFlare.
> * `{payout}` is your payout in the **offer's currency**. Set the affiliate network's **Payout currency** in ClickFlare to the same currency. Use `{payout}`, not `{revenue}` or `{sale_amount}`: those are advertiser figures.

***

## FAQ

> **Why aff\_sub2 and not aff\_click\_id?**
>
> `aff_sub2` is the ClickFlare template's default and what most trackers use. TUNE itself suggests `aff_click_id` for unique values like click IDs, because a different value on every click in `aff_sub` slows its reports down. Both work: if you switch, use `aff_click_id={cf_click_id}` in the offer URL and `{aff_click_id}` as the Click Id in ClickFlare and in the postback.

> **Is HasOffers the same as TUNE?**
>
> Yes. HasOffers is TUNE's former name, still used in its sign-up domains and API. TUNE calls affiliates "partners" in its interface but keeps `aff_` in its link parameters and macros.

> **Can I pass more data to TUNE?**
>
> Yes. Use the other sub IDs in the offer URL, for example `aff_sub3={campaign_id}&aff_sub4={trackingField1}`. TUNE shows them in its reports. Keep `aff_sub2` for the click ID.

> **Can I send the conversion back to my traffic source?**
>
> Yes. Once ClickFlare records the TUNE conversion, it can send it to the traffic source through the traffic source's postback or conversion API integration. Nothing changes on the TUNE side.

***

## Related

> **[Macro reference](/docs/en/integrations/click-id-and-postback-macros.md)**
>
> Every network's values

> **[Custom conversions](/docs/en/settings/custom-conversions.md)**
>
> Report each goal

> **[Postback issues](/docs/en/tracking/troubleshooting-s2s-postback-url-in-clickflare.md)**
>
> Troubleshoot S2S


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.