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

# ExoClick as a Traffic Source

> Track ExoClick campaigns in ClickFlare: capture the conversions_tracking click ID, zone and site tokens, and post conversions to your ExoClick goal.

![ExoClick traffic source template](https://mintcdn.com/clickflare/Z7FseNUODe2P_cAH/images/integrations/covers/templates/exoclick.png?fit=max\&auto=format\&n=Z7FseNUODe2P_cAH\&q=85\&s=999a9267493ed9f80badc125ceaaa247)

ExoClick is a global ad network selling popunder, banner, native, push notification, interstitial and in-stream video traffic, bought on CPC, CPM, Smart CPM, CPV and Smart CPC. This guide sets up ExoClick as a traffic source in ClickFlare. It covers passing ExoClick's click data into your reports and sending conversions, with payout, back to ExoClick so its optimization and your stats agree.

You do everything from the **campaign editor**. The ExoClick traffic source is created inline, without leaving the campaign.

## At a glance

| | |
| - | - |
| **Ad formats** | Popunder, banners, native, push notifications, interstitials, in-stream video |
| **Click ID macro** | `{conversions_tracking}`, mandatory for conversion tracking |
| **Conversion tracking** | S2S postback to `s.magsrv.com/tag.php`, one Conversion Goal per event |
| **Payout passed back** | Not by the template. Add `&value={payout}` for goals with a **Dynamic** value. |
| **Multiple events** | Yes, one Conversion Goal and one postback per event |
| **Cost** | Passed per visit by the template, as ExoClick's actual cost (`{actual_cost}`). Cost Model: **Not Tracked**. |
| **Conversion API** | No |

## How it works

**1. ExoClick sends the click**

A visitor clicks your ad. ExoClick opens your ClickFlare campaign URL and fills in its dynamic tokens: the click ID in `tag`, the price paid in `cost`, plus the campaign, variation, site, zone and other details.

**2. ClickFlare stores the ExoClick click ID**

ClickFlare saves the value of `tag` as the visit's **External ID**, records the cost, and redirects the visitor to your lander or offer.

**3. The conversion reaches ClickFlare**

Your affiliate network or store posts the conversion back to ClickFlare, matched on the ClickFlare click ID.

**4. ClickFlare posts it back to ExoClick**

ClickFlare fires the ExoClick postback for your Conversion Goal, replacing `{external_id}` with the stored ExoClick click ID and, if you add it, `{payout}` with the revenue. ExoClick matches it to the original click.

> [!NOTE]
>
> The mirror to keep straight: in the **campaign URL** you write *ClickFlare's* parameter (`tag`) and *ExoClick's* token (`{conversions_tracking}`). The template does this for you. In the **postback URL** you write *ExoClick's* parameter (`tag`) and *ClickFlare's* token (`{external_id}`). The parameter is called `tag` on both sides, but the value comes from a different system each time.

## Before you start

* **Set up your own tracking domain.** Run the campaign and the postback on your own custom domain. Shared domains get flagged by networks and blocked by browsers. See [Custom Domains](/docs/en/settings/custom-domains.md).
* **Have an offer ready in ClickFlare**, and its affiliate network set up to post conversions back to ClickFlare. See [Creating an Offer](/docs/en/tracking/creating-an-offer-1.md) and [Adding an Affiliate Network](/docs/en/tracking/adding-an-affiliate-network.md).
* **Create a Conversion Goal in ExoClick.** Its Goal ID goes into the postback URL. You create it in Step 2.
* **Decide which conversions ExoClick should receive.** ExoClick counts and optimizes on the goals you send it. If your funnel has several steps (lead, then sale), decide now whether to send one goal or several. See [Tracking several events](#tracking-several-events).

***

## Step 1 – Create the campaign and the ExoClick traffic source

1. Go to **Campaigns** and click **New**.
2. In **Traffic Source**, open the dropdown and click **+ New Traffic Source**.
3. Type `exoclick` in the search box and select the **ExoClick** template.
4. Enter a **Name**, for example `ExoClick`.
5. Leave **Cost currency** on **USD** unless your ExoClick account is billed in another currency.

The template fills in the **Parameters** table for you:

| Name | TS Parameter | TS Token (ExoClick token) | ClickFlare Token | What it carries |
| - | - | - | - | - |
| cost | `cost` | `{actual_cost}` | `{cost}` | The actual CPM or CPC paid for the impression or click. See [Cost](#cost). |
| externalId | `tag` | `{conversions_tracking}` | `{external_id}` | ExoClick's click ID. Required for the postback. |
| Campaign ID | `campid` | `{campaign_id}` | `{trackingField1}` | The ExoClick campaign |
| Variation ID | `varid` | `{variation_id}` | `{trackingField2}` | The variation (banner or landing page) that was shown |
| Domain | `source` | `{src_hostname}` | `{trackingField3}` | The site the publisher registered with ExoClick, for example `examplesite.com` |
| Keyword | `keyword` | `{keyword}` | `{trackingField4}` | The matched keyword, on keyword-targeted campaigns. Empty otherwise. |
| Tags | `tags` | `{tags}` | `{trackingField5}` | The keywords ExoClick identified for the impression |
| Site ID | `siteid` | `{site_id}` | `{trackingField6}` | The publisher site's ID |
| Zone ID | `zoneid` | `{zone_id}` | `{trackingField7}` | The ad zone that showed the ad |
| Category ID | `catid` | `{category_id}` | `{trackingField8}` | The category ExoClick detected |
| Country | `country` | `{country}` | `{trackingField9}` | The visitor's 3-letter country code |
| Format | `format` | `{format}` | `{trackingField10}` | The banner size, for example `300x250` |

![The ExoClick template's Parameters table in ClickFlare, with ExoClick's macros pre-filled](https://mintcdn.com/clickflare/Z7FseNUODe2P_cAH/images/integrations/templates/exoclick/parameters.png?fit=max\&auto=format\&n=Z7FseNUODe2P_cAH\&q=85\&s=f0a98fe6adf2b85e569a0e65dc3beeaa)

Each tracking field becomes a column you can group reports by. `zoneid` and `siteid` are the ones you will use most: they tell you which zones convert, so you can block or bid up zones in ExoClick.

> [!WARNING]
>
> Don't change or remove the `externalId` row. Without `{conversions_tracking}` in the campaign URL, ExoClick has no click ID to match, and every postback returns an error.

To pass more ExoClick data, click **Add Parameter**, give it a name and parameter, and enter the ExoClick token as the **TS Token**. ClickFlare assigns the next free tracking field. ExoClick also offers `{language}`, `{sub}` (the publisher's sub ID), `{pricing_model}` and `{url}`, among others. Check the **Dynamic Tokens** list in ExoClick before adding them.

## Step 2 – Set up the postback

The postback is what sends conversions to ExoClick. It lives on the traffic source, so every campaign that uses this ExoClick traffic source sends conversions the same way.

### Create a Conversion Goal in ExoClick

1. In ExoClick, go to **Campaigns → Conversion Tracking** and click **New Conversion Goal**.
2. Fill in the form:

| Field | What to choose |
| - | - |
| **Name** | Any name, for example `ClickFlare – Sale` |
| **Conversion type** | The type of offer, for example **Lead - Single Opt In** or **Purchase - Credit Card**. Use **Multiple Conversions Types** if the goal covers several offers. |
| **Conversion Value** | **Dynamic** to receive the real payout from ClickFlare. **Fixed** for a set amount. **No Value** for counts only. |
| **Count** | **One conversion** counts each click once. **Every conversion** counts repeat calls. |
| **Conversion Window** | How long after the ad interaction a conversion still counts. Default 24 hours, up to 90 days. |

3. Click **Create**.
4. Choose **Conversion Tracking API - S2S** as the tracking method. ExoClick shows the goal's postback URL, for example `http://s.magsrv.com/tag.php?goal=GOAL_ID&tag=`.
5. Copy the **Goal ID**: the 32-character value after `goal=`.

Choose **Dynamic** unless you have a reason not to. ExoClick uses the value for its Revenue, Profit and ROI columns.

### Add it to the traffic source in ClickFlare

1. Back in the **New Traffic Source** form, scroll to **Passing conversion info to traffic source**.
2. Turn on **Traffic source postback URL**. The template's postback appears:

```text theme={null}
http://main.exoclick.com/tag.php?goal=REPLACE&tag={external_id}
```

It already sends the click ID (`{external_id}`) in ExoClick's `tag` parameter. It does not send a payout, and it still uses ExoClick's old postback domain.

![The Traffic source postback URL switched on, showing the ExoClick template's postback](https://mintcdn.com/clickflare/Z7FseNUODe2P_cAH/images/integrations/templates/exoclick/postback.png?fit=max\&auto=format\&n=Z7FseNUODe2P_cAH\&q=85\&s=6cac66cf66cf20c7ea33538dc0b5d29b)

3. Replace `REPLACE` with your Goal ID.
4. Replace `main.exoclick.com` with `s.magsrv.com`. ExoClick has moved its postback URLs to this domain.
5. If the goal's Conversion Value is **Dynamic**, add `&value={payout}` at the end. The result:

```text theme={null}
http://s.magsrv.com/tag.php?goal=GOAL_ID&tag={external_id}&value={payout}
```

6. In the dropdown on the left, choose the ClickFlare event that should fire the postback. Keep **Conversions** to send every conversion. If your final action is a custom conversion (for example `purchase`), choose that instead.
7. Click **Save**. You are back in the campaign editor with the ExoClick traffic source selected.

> [!WARNING]
>
> Replace `REPLACE` with your Goal ID, exactly as ExoClick shows it: 32 hexadecimal characters (0-9, a-f). If `REPLACE` stays in the postback, ExoClick answers `ERROR: Goal ID is invalid.` and records nothing. And if your goal is **Dynamic**, add `&value={payout}`: without it the template sends no revenue, and ExoClick's Revenue, Profit and ROI columns stay at zero.

ExoClick reads `value` as the conversion's monetary amount. If your offers pay in a different currency from your ExoClick account, see [Multicurrency in ClickFlare](/docs/en/tracking/multicurrency-support-in-click-flare-how-it-works.md).

To learn what each postback token does, see [How to Configure a Traffic Source S2S Postback URL](/docs/en/tracking/how-to-configure-a-traffic-source-s2s-postback-url.md).

## Step 3 – Finish the campaign and copy its URL

1. Name the campaign.
2. Set the **Cost Model** to **Not Tracked**, so ClickFlare uses the cost ExoClick passes. See [Cost](#cost).
3. Choose **Redirect** or **Direct** tracking. Redirect is the usual choice for ExoClick's popunder and banner traffic.
4. Click **Next** and, on **Destination**, add your lander (optional) and your offer.
5. Save, open **Tracking**, select your own tracking domain and copy the **campaign URL**.

The campaign URL already contains every ExoClick token from the template, for example `tag={conversions_tracking}` and `zoneid={zone_id}`.

If you use a lander, its call-to-action must link to the ClickFlare **click URL**, not to the offer directly. Otherwise the visit reaches the offer without a ClickFlare click ID, and the conversion cannot be traced back to ExoClick.

See [Creating a Campaign in ClickFlare](/docs/en/campaigns/creating-a-campaign-in-click-flare.md).

## Step 4 – Create the campaign in ExoClick

1. In ExoClick, create a campaign and choose the ad format, targeting and pricing as usual.
2. On **Step 2 - Ads**, click **Add Variations**, choose **Single Landing Page** and paste the ClickFlare campaign URL as the landing page URL.
3. Add your creatives and finish the variation.
4. Complete the remaining steps and submit the campaign for review.

Paste the URL exactly as ClickFlare gives it. You don't need ExoClick's **+Add Tokens** button: the template has already added the tokens.

## Step 5 – Test the integration

ExoClick lets you trigger a real click on your variation and check the postback before you spend anything.

1. In your ExoClick campaign, open the variation's actions menu and click **Test Variation**. ExoClick simulates an ad click and opens your ClickFlare campaign URL.
2. Check the URL that opened: `tag=` should be followed by a long string, not by `{conversions_tracking}`. That string is ExoClick's click ID, 150 to 700 characters long. A redirect-tracing browser extension such as Redirect Path shows it if the redirect hides it. The test visit should also appear in the ClickFlare campaign's stats.
3. Complete the offer the way a real visitor would, or post a test conversion to ClickFlare from your affiliate network.
4. In ClickFlare, go to **Logs → Postback Status** and filter by the campaign. A request to `s.magsrv.com` with response `OK` means ExoClick registered the conversion.
5. Refresh your ExoClick statistics. The conversion appears under the goal's column after a few moments.

ExoClick's postback answers with a plain-text message. The common ones:

| Response | Meaning |
| - | - |
| `OK` | The conversion was registered. |
| `ERROR: This conversion has already been notified and saved.` | The goal's **Count** is **One conversion** and this click already converted. |
| `ERROR: Tag is invalid!` | The click ID is incomplete or malformed. |
| `ERROR: No tag data.` | The click ID is empty. Check the `tag` parameter in the campaign URL. |
| `ERROR: Goal ID is invalid.` | `REPLACE` is still in the postback, or the Goal ID was copied wrong. |
| `ERROR: Conversion window is not respected.` | The conversion arrived after the goal's **Conversion Window** closed. |

You can also test the ExoClick side without an offer, as ExoClick suggests: copy the click ID from step 2, put it into your postback in place of `{external_id}`, and open the URL in a browser. ExoClick shows the same responses. This confirms the Goal ID and click ID, not ClickFlare's postback settings.

***

## Tracking several events

Each ExoClick Conversion Goal has its own Goal ID. To track a lead and a sale separately, create one goal per step and send each event to its own goal:

```text theme={null}
http://s.magsrv.com/tag.php?goal=LEAD_GOAL_ID&tag={external_id}&value={payout}
http://s.magsrv.com/tag.php?goal=SALE_GOAL_ID&tag={external_id}&value={payout}
```

1. In ExoClick, create a Conversion Goal for each step, for example `Lead` and `Sale`, and copy each Goal ID.
2. In ClickFlare, create a [custom conversion](/docs/en/settings/custom-conversions.md) for each step, for example `lead` and `purchase`.
3. On the ExoClick traffic source, click **+ Another postback URL** once per extra event.
4. Map each postback to its ClickFlare event: the `lead` custom conversion to the Lead goal's URL, `purchase` to the Sale goal's URL.
5. Test each event. Each goal shows its own conversions column in ExoClick's statistics, in the **Order** you set.

> **Rules for multi-goal postbacks**
>
> * One postback per goal. The Goal ID decides which goal ExoClick credits.
> * Set **Conversion Value** per goal: **Dynamic** where you send `&value={payout}`, **No Value** for steps without revenue.
> * Use **Every conversion** as the **Count** only for goals that really repeat, such as rebills. Otherwise ExoClick rejects duplicates with `ERROR: This conversion has already been notified and saved.`

> **Sending only one event**
>
> If ExoClick should only learn from your final sale, keep a single postback and map it to that event. Earlier steps (leads, add to carts) still show in ClickFlare. They just don't reach ExoClick.
>
> To send a postback only for some conversions, for example only those above a certain payout, use **Event filter** under the postback to add conditions.

## Cost

The template passes cost per visit. The `cost` row sends ExoClick's `{actual_cost}` token, the actual CPM or CPC paid for the impression or click, and ClickFlare records it as the visit's cost.

On the campaign, set the **Cost Model** to **Not Tracked** so ClickFlare uses the cost passed in the URL.

> [!NOTE]
>
> On CPC and Smart CPC campaigns, `{actual_cost}` is the price of the click, which is exactly what you want. On CPM and Smart CPM campaigns it is the cost of a single impression, a very small number such as `0.00002`. For popunders, where one impression is roughly one visit, it stays close. For banners and native on CPM, compare the **Cost** column with your ExoClick spend after launch. If it doesn't match, switch the Cost Model to **CPC** and enter your effective cost per click, or your CPM bid divided by 1,000 for popunders.

ClickFlare has no ExoClick cost-tracking API integration. When the recorded spend differs from your ExoClick spend, correct it with a [manual cost upload](/docs/en/settings/manual-cost-upload.md). See [Cost Models](/docs/en/core-platform-concepts/cost-models.md).

## Delayed revenue

If you run search arbitrage (RSOC or AFD) behind ExoClick, the feed reports revenue hours or days after the click. To pass that revenue to ExoClick once it arrives, see [Sending Delayed Revenue to Traffic Sources](/docs/en/advanced-tracking-configuration/how-to-send-delayed-revenue-to-traffic-sources.md).

***

## Troubleshooting

> **ExoClick answers ERROR: Goal ID is invalid.**
>
> * `REPLACE` is still in the postback. Replace it with your Goal ID.
> * The Goal ID was copied with extra characters. It is exactly 32 characters, 0-9 and a-f.

> **ExoClick answers ERROR: No tag data. or Tag is invalid!**
>
> * The campaign URL in ExoClick is missing `tag={conversions_tracking}`, or the token was edited. Copy the URL from ClickFlare again.
> * The postback uses something other than `{external_id}` after `tag=`. ClickFlare doesn't know ExoClick's tokens and sends them as literal text.
> * The `externalId` row was removed from the traffic source.
> * The click ID was cut short. It can be up to 700 characters, so check that nothing in your redirect chain truncates long URLs.

> **Conversions show in ClickFlare but not in ExoClick**
>
> * **Traffic source postback URL** is off on the ExoClick traffic source.
> * **Disable sending postbacks to traffic source** is on in the campaign.
> * The postback is mapped to a different event than the one the conversion logged. Check **Logs → Event Logs** to see which event was recorded.
> * The postback still points to `main.exoclick.com`. Change it to `s.magsrv.com`.
> * Check **Logs → Postback Status**: the response column shows ExoClick's exact message, such as `ERROR: Conversion window is not respected.`

> **ExoClick shows conversions with no revenue**
>
> The template's postback sends no payout. Add `&value={payout}` at the end of the postback, and set the goal's **Conversion Value** to **Dynamic** in ExoClick.

> **Zone or site columns are empty**
>
> The tokens were not replaced, usually because the URL was edited or pasted somewhere ExoClick doesn't process tokens. Paste the campaign URL from ClickFlare unchanged into the variation. See [Traffic Source Tokens Arriving Empty](/docs/en/troubleshooting/tokens-arriving-empty.md).

For the general checklist, see [Conversions not showing](/docs/en/troubleshooting/conversions-not-showing.md).

***

**FREQUENTLY ASKED QUESTIONS**

> **Q1:** Can I use the same ExoClick traffic source for all my ExoClick campaigns?

**A1:** Yes. Every campaign using it sends conversions to the same Conversion Goal. Create a second ExoClick traffic source only if some campaigns should report to a different goal.

> **Q2:** ExoClick's tracking manuals list Voluum, Binom, RedTrack and other trackers, but not ClickFlare. Is that a problem?

**A2:** No. ExoClick's generic S2S setup applies, and the ClickFlare template already does both halves of it.

> **Q3:** Why is it `tag` in both the campaign URL and the postback?

**A3:** The template reuses ExoClick's name on ClickFlare's side. They are still two halves of the same value: ClickFlare's `tag` receives `{conversions_tracking}`, and ExoClick's `tag` receives `{external_id}`.

> **Q4:** Should I use Redirect or Direct tracking with ExoClick?

**A4:** Redirect is the usual choice and works with every ExoClick format. Use Direct only if ExoClick must see your lander's domain as the destination. See [Direct Campaign Tracking](/docs/en/campaigns/direct-campaign-tracking.md).

> **Q5:** Do I need the postback if I don't use CPA bidding?

**A5:** Yes. Without it, ExoClick's conversion columns stay empty and its **Automatic on Conversion Rate** distribution has nothing to optimize on.

## Related

> **[Traffic source postbacks](/docs/en/tracking/how-to-configure-a-traffic-source-s2s-postback-url.md)**
>
> Every token you can use in a postback.

> **[Custom conversions](/docs/en/settings/custom-conversions.md)**
>
> Split leads and sales into separate events.

> **[Cost models](/docs/en/core-platform-concepts/cost-models.md)**
>
> How CPC, CPA and RevShare costs are calculated.

> **[Conversions not showing](/docs/en/troubleshooting/conversions-not-showing.md)**
>
> The general checklist when postbacks don't arrive.


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