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

# ROIads Conversion Tracking & Postback Setup

> Set up ROIads conversion tracking in ClickFlare: click_id and bid_price macros, and the us.roiapp.net postback for two conversion events.

![ROIads traffic source template](https://mintcdn.com/clickflare/JnEca3lx3v_LxcNj/images/integrations/covers/templates/roiads.png?fit=max\&auto=format\&n=JnEca3lx3v_LxcNj\&q=85\&s=20478fcb3f92635c4db2fed617b0fc3e)

ROIads is a self-serve ad network selling push, in-page push, popunder and direct-click traffic. Push is sold per click and popunder per 1,000 impressions, with bid tools such as micro bidding and a CPA Goal mode. This guide sets up ROIads as a traffic source in ClickFlare. It covers passing ROIads' click data and bid into your reports and sending conversions back to ROIads, so its optimization and your stats agree.

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

## At a glance

| | |
| - | - |
| **Ad formats** | Push, in-page push, popunder, direct click |
| **Click ID macro** | `{click_id}`, mandatory for conversion tracking |
| **Conversion tracking** | S2S postback to `us.roiapp.net` |
| **Payout passed back** | No. ROIads' postback has no documented revenue parameter. |
| **What you replace** | Nothing. The template's postback works as it is. |
| **Multiple events** | Two: `action=conversion` for the first event, `action=conversion1` for a second one such as a deposit |
| **Cost** | Passed with `{bid_price}`. Cost Model: **Not Tracked** on push, **CPC** on popunder. See [Cost](#cost). |
| **Conversion API** | No |

## How it works

**1. ROIads sends the click**

A visitor clicks your ad, or a popunder opens. ROIads opens your ClickFlare campaign URL and fills in its macros: the click ID in `click_id`, your bid in `bid_price`, plus the publisher, site, campaign, creative, country and OS.

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

ClickFlare saves the value of `click_id` 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 ROIads**

ClickFlare fires the ROIads postback, replacing `{external_id}` with the stored ROIads click ID. ROIads matches it to the original click.

> [!NOTE]
>
> The mirror to keep straight: in the **campaign URL** you write *ClickFlare's* parameter (`click_id`) and *ROIads'* macro (`{click_id}`). The template does this for you. In the **postback URL** you write *ROIads'* parameter (`id`) and *ClickFlare's* token (`{external_id}`).

## 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).
* **Know your format.** ROIads keeps separate macro lists for push and popunder, in the **Tracking** tab of your advertiser dashboard. Check that the template's macros are in the list for your format.
* **Decide which conversions ROIads should receive.** ROIads optimizes on what you send it, and it accepts two events. See [Tracking a second event](#tracking-a-second-event).

***

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

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

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

| Name | TS Parameter | TS Token (ROIads macro) | ClickFlare Token | What it carries |
| - | - | - | - | - |
| External ID | `click_id` | `{click_id}` | `{external_id}` | ROIads' click ID. Required for the postback. |
| Cost | `bid_price` | `{bid_price}` | `{cost}` | Your bid. Per click on push, per 1,000 impressions on popunder. See [Cost](#cost). |
| Publisher ID | `publisher_id` | `{publisher_id}` | `{trackingField1}` | The traffic source (publisher) |
| Site ID | `site_id` | `{site_id}` | `{trackingField2}` | The publisher's site |
| Campaign ID | `campaign_id` | `{campaign_id}` | `{trackingField3}` | The ROIads campaign ID |
| Campaign Name | `campaign_name` | `{campaign_name}` | `{trackingField4}` | The ROIads campaign name |
| Creative ID | `creative_id` | `{creative_id}` | `{trackingField5}` | The creative |
| Creative Name | `creative_name` | `{creative_name}` | `{trackingField6}` | The creative's name |
| Country | `country` | `{country}` | `{trackingField7}` | The visitor's country |
| OS | `os` | `{os}` | `{trackingField8}` | The visitor's operating system |

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

Each tracking field becomes a column you can group reports by. `publisher_id` and `site_id` are the ones you will use most: they tell you which sources convert, so you can blacklist them or bid them up in ROIads. `creative_id` tells you which creative won.

> [!WARNING]
>
> Don't change or remove the **External ID** row. ROIads links each conversion to a click through `{click_id}`. Without it in the campaign URL, ClickFlare has no ROIads click ID to send back, and ROIads cannot match any conversion.

To pass more ROIads data, click **Add Parameter**, give it a name and parameter, and enter the ROIads macro as the **TS Token**. ClickFlare assigns the next free tracking field. ROIads also offers `{region}`, `{city}` and `{os_ver}`. Its Tracking tab and the destination URL field show the full list for your format.

## Step 2 – Set up the postback

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

### How ROIads' postback works

ROIads has one postback endpoint for all advertisers. It doesn't need an account ID or a goal ID. ROIads' format is:

```text theme={null}
https://us.roiapp.net/roiconv?action=conversion&id={click_id}
```

`action=conversion` is a fixed value that marks the event. `id` carries the click ID. In ROIads' example, `{click_id}` is a placeholder your tracker replaces. In ClickFlare, that token is `{external_id}`.

### Add the template's postback 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}
https://us.roiapp.net/roiconv?action=conversion&id={external_id}
```

There's nothing to replace. `{external_id}` is a ClickFlare token, filled with the ROIads click ID stored from the visit.

3. 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 `lead`), choose that instead.
4. Click **Save**. You are back in the campaign editor with the ROIads traffic source selected.

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

> [!WARNING]
>
> Don't replace `{external_id}` with ROIads' `{click_id}`. In the postback, `{click_id}` isn't a ClickFlare token, so ClickFlare sends it as literal text and ROIads can't match the conversion.

The postback sends no revenue. ROIads counts the conversion, but your payout and ROI live in ClickFlare.

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**: **Not Tracked** for push, **CPC** for popunder. See [Cost](#cost).
3. Choose **Redirect** or **Direct** tracking. Redirect is the usual choice for ROIads' push and popunder 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 ROIads macro from the template, for example `click_id={click_id}` and `bid_price={bid_price}`.

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 ROIads.

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

## Step 4 – Create the campaign in ROIads

1. In ROIads, select the ad format (push or pop) and create a campaign.
2. Paste the ClickFlare campaign URL into the **Destination URL** field.
3. In the campaign settings, under **Tracking Type**, select **Postback request**.
4. Choose your targeting, bid and budget as usual, and submit the campaign.

Paste the URL exactly as ClickFlare gives it. ROIads replaces each macro in curly braces when the ad is clicked. Don't add `click_id` a second time: the ClickFlare URL already carries it.

## Step 5 – Test the integration

ROIads' guides recommend a test click and a test conversion before you scale.

1. Open your ClickFlare campaign URL through a live ROIads ad, or let a small test budget bring the first clicks.
2. In ClickFlare, check the visit. The **External ID** should hold a ROIads click ID, not the literal text `{click_id}`.
3. Complete the offer, or trigger a test conversion on your affiliate network's side.
4. Go to **Logs → Postback Status** and filter by the campaign. A successful request to `us.roiapp.net` confirms ClickFlare sent the postback.
5. In ROIads, check the campaign's statistics for the conversion.

If the conversion doesn't appear in ROIads, check the click ID first: the postback must carry the same value ROIads passed in `click_id`.

***

## Tracking a second event

ROIads accepts a second conversion event, for example a deposit or a sale after a registration. It uses the same URL with `action=conversion1`:

```text theme={null}
https://us.roiapp.net/roiconv?action=conversion&id={external_id}
https://us.roiapp.net/roiconv?action=conversion1&id={external_id}
```

1. In ClickFlare, create a [custom conversion](/docs/en/settings/custom-conversions.md) for each step, for example `registration` and `deposit`.
2. On the ROIads traffic source, click **+ Another postback URL**.
3. Paste the second URL, with `action=conversion1`.
4. Map each postback to its ClickFlare event: `registration` to `action=conversion`, `deposit` to `action=conversion1`.
5. Test both events.

> **Rules for ROIads events**
>
> * Two events: `conversion` for the first, `conversion1` for the second.
> * One postback per event. Don't combine events in one URL.
> * Both postbacks send the same click ID in `id`.
> * ROIads calls this feature Postback Deposit Tracking. Use it for funnels where the paying step comes after the first conversion.

> **Sending only one event**
>
> If ROIads should only learn from your final sale, keep a single postback with `action=conversion` and map it to that event. Earlier steps still show in ClickFlare. They just don't reach ROIads.
>
> 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 with ROIads' `{bid_price}` macro, and ClickFlare records it as the visit's cost. ROIads describes it as how much you paid for the click. What it means depends on the format:

| Format | ROIads pricing | What `{bid_price}` holds | Cost Model in ClickFlare |
| - | - | - | - |
| Push, in-page push | CPC | Your bid per click | **Not Tracked**, so ClickFlare uses the passed value |
| Popunder | CPM | Your bid per 1,000 impressions | **CPC**, with your CPM bid divided by 1,000 |

> [!NOTE]
>
> On popunder, `{bid_price}` is a CPM price. With the Cost Model on **Not Tracked**, ClickFlare would record each visit at 1,000 times its real cost. Set the Cost Model to **CPC** and enter your CPM bid divided by 1,000. A popunder impression is roughly one visit. The `bid_price` column still shows your bid for reference.

`{bid_price}` is your bid, not a cleared auction price. With micro bidding or bid changes during the day, compare ClickFlare's **Cost** column with your ROIads spend. When it differs, 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) and [Traffic Source Cost Tracking](/docs/en/tracking/how-to-setup-traffic-source-cost-tracking.md).

## Delayed revenue

If you run search arbitrage (RSOC or AFD) behind ROIads, the feed reports revenue hours or days after the click. ClickFlare can fire the postback once the revenue arrives. ROIads' postback carries no revenue, but it still counts the conversion. See [Sending Delayed Revenue to Traffic Sources](/docs/en/advanced-tracking-configuration/how-to-send-delayed-revenue-to-traffic-sources.md).

***

## Troubleshooting

> **Conversions don't appear in ROIads**
>
> * The campaign URL in ROIads is missing `click_id={click_id}`, or the macro was edited. Copy the URL from ClickFlare again.
> * The postback uses `{click_id}` instead of ClickFlare's `{external_id}`.
> * **Tracking Type** in the ROIads campaign isn't set to **Postback request**.
> * The **External ID** row was removed from the traffic source.

> **Conversions show in ClickFlare but not in ROIads**
>
> * **Traffic source postback URL** is off on the ROIads 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.
> * Check **Logs → Postback Status**: a failed request shows the status code ROIads returned.

> **Popunder cost is far too high**
>
> The campaign is on **Not Tracked**, so ClickFlare records the CPM bid as the cost of each visit. Switch the Cost Model to **CPC** with your CPM bid divided by 1,000, and fix past days with a [manual cost upload](/docs/en/settings/manual-cost-upload.md).

> **Site or creative columns are empty**
>
> The macro isn't available for your format, or the URL was edited. Check the macro list for push or pop in ROIads' **Tracking** tab, and paste the campaign URL from ClickFlare unchanged. 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 ROIads traffic source for all my ROIads campaigns?

**A1:** Yes. ROIads' postback has no account or goal ID, so one traffic source covers every campaign. Create a second one only if a campaign needs a different event mapping.

> **Q2:** Why is it called `click_id` in the campaign URL and `id` in the postback?

**A2:** They are two halves of the same value. ClickFlare reads ROIads' click ID from its own `click_id` parameter. ROIads expects it back in its own `id` parameter. Both names are fixed. Change neither.

> **Q3:** Can I send my payout to ROIads?

**A3:** The template doesn't, and ROIads doesn't document a revenue parameter for its postback. If you need ROIads to see revenue, ask ROIads support for the exact parameter before adding one.

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

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

> **Q5:** Does the template work for ROIads' CPA Goal campaigns?

**A5:** Yes. CPA Goal needs the postback, because ROIads optimizes on the conversions it receives. Map the postback to the event you want ROIads to optimize for.

## 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 registrations and deposits 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.