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

# AdOperator as a Traffic Source

> Track AdOperator popunder and push campaigns in ClickFlare: pass the {conversion} click ID and send conversions with payout to AdOperator's S2S postback.

![AdOperator traffic source template](https://mintcdn.com/clickflare/j4F_mr_BIrMz-iaH/images/integrations/covers/templates/adoperator.png?fit=max\&auto=format\&n=j4F_mr_BIrMz-iaH\&q=85\&s=6fe9e6ddbc4518e5765531b813ce3fe9)

AdOperator is a self-serve ad network selling popunder, push notification and in-page push traffic. This guide sets up AdOperator as a traffic source in ClickFlare. It covers passing AdOperator's click data into your reports and sending conversions, with payout, back to AdOperator so its stats and your ClickFlare reports agree.

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

> [!WARNING]
>
> The AdOperator template's postback needs two fixes before it works: the host must change to `s2s.adoperator.com`, and the payout must be added. Step 2 shows the exact URL to use.

## At a glance

| | |
| - | - |
| **Ad formats** | Popunder, push notifications, in-page push |
| **Click ID macro** | `{conversion}`, required for conversion tracking |
| **Conversion tracking** | S2S postback to `s2s.adoperator.com` (a global postback, the same for every campaign) |
| **Payout passed back** | Yes, in the `value` parameter. The template leaves it out, so you add it. |
| **Multiple events** | Not documented by AdOperator. Send one event. |
| **Cost** | Not passed by the template. Use the **CPC** cost model with your bid. |
| **Conversion API** | No |

## How it works

**1. AdOperator sends the click**

A visitor clicks your ad. AdOperator opens your ClickFlare campaign URL and fills in its macros: the unique click ID in `conversion`, plus the campaign, the publisher sub ID, the OS, the browser and the country.

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

ClickFlare saves the value of `conversion` as the visit's **External ID** 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 AdOperator**

ClickFlare fires the AdOperator postback, replacing `{external_id}` with the stored AdOperator click ID and `{payout}` with the revenue. AdOperator matches it to the original click.

> [!NOTE]
>
> The mirror to keep straight: in the **campaign URL** you write *ClickFlare's* parameter (`conversion`) and *AdOperator's* macro (`{conversion}`). The template does this for you. In the **postback URL** you write *AdOperator's* parameters (`c` and `value`) and *ClickFlare's* tokens (`{external_id}` and `{payout}`).

## 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](https://clickflare.com/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](https://clickflare.com/docs/en/tracking/creating-an-offer-1.md) and [Adding an Affiliate Network](https://clickflare.com/docs/en/tracking/adding-an-affiliate-network.md).
* **Have an AdOperator advertiser account with funds.** AdOperator's minimum campaign budget is 20 USD.
* **Know your bid.** AdOperator charges per click on push and in-page push, and per view on popunder. You enter that price in ClickFlare as the cost. See [Cost](#cost).

***

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

1. Go to **Campaigns** and click **New**.
2. In **Traffic Source**, open the dropdown and click **+ New Traffic Source**.
3. Type `adoperator` in the search box and select the **AdOperator** template.
4. Enter a **Name**, for example `AdOperator`.
5. Leave **Cost currency** on **USD**. AdOperator budgets and bids are in USD.

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

| Name | TS Parameter | TS Token (AdOperator macro) | ClickFlare Token | What it carries |
| - | - | - | - | - |
| externalId | `conversion` | `{conversion}` | `{external_id}` | AdOperator's unique click ID. Required for the postback. |
| Campaign ID | `campaign` | `{campaign}` | `{trackingField1}` | Your AdOperator campaign ID |
| Publisher sub ID | `subid` | `{subid}` | `{trackingField2}` | The publisher feed sub ID. This is the source you blacklist or whitelist. |
| User agent | `user_agent` | `{user_agent}` | `{trackingField3}` | The visitor's user agent. `{user_agent}` is not in AdOperator's published macro list, so check that it fills in. |
| Operating system | `os` | `{os}` | `{trackingField4}` | The visitor's operating system |
| Browser | `browser` | `{browser}` | `{trackingField5}` | The visitor's browser |
| Country | `country` | `{country}` | `{trackingField6}` | The two-letter country code |

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

Each tracking field becomes a column you can group reports by. **Publisher sub ID** is the one you will use most. It tells you which publisher feeds convert, so you can blacklist or whitelist them in AdOperator's campaign settings.

> [!WARNING]
>
> Don't change or remove the `externalId` row. AdOperator says that without `{conversion}` in the campaign URL it cannot match a conversion to the original click.

To pass more AdOperator data, click **Add Parameter**, give it a name and parameter, and enter the AdOperator macro as the **TS Token**. ClickFlare assigns the next free tracking field. AdOperator's documented URL macros are `{subid}`, `{campaign}`, `{bid}`, `{os}`, `{browser}`, `{country}` and `{conversion}`. The useful one the template doesn't include is `{bid}`, the click price. Add it as a parameter named `bid` to see what you paid per click next to each visit.

## Step 2 – Set up the postback

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

### Get your postback URL from AdOperator

AdOperator uses one global postback for all your campaigns. You find it on any campaign's page:

1. In AdOperator, click **Campaigns** in the left menu and open or create a campaign.
2. Scroll to **Conversion Tracking**. Under *Add this postback to your tracker* AdOperator shows:

```text theme={null}
https://s2s.adoperator.com/conversion?c={conversion}&value={payout}
```

`c` carries the click ID and `value` carries the payout. AdOperator's own instructions say to replace `{conversion}` and `{payout}` with your tracker's tokens. In ClickFlare those are `{external_id}` and `{payout}`.

### 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}
https://xml.adop.co/conversion?c={external_id}
```

![The Traffic source postback URL switched on, showing the AdOperator template's postback](https://mintcdn.com/clickflare/j4F_mr_BIrMz-iaH/images/integrations/templates/adoperator/postback.png?fit=max\&auto=format\&n=j4F_mr_BIrMz-iaH\&q=85\&s=90a6b36aba25efc3fd16ccb213b7a3e1)

It sends the click ID (`{external_id}`) in the right parameter, but it has two problems. The host `xml.adop.co` is not the host AdOperator gives you, and its security certificate has expired, so the request can fail. And it sends no payout.

3. Replace the whole URL with AdOperator's postback, with ClickFlare's tokens in place of AdOperator's:

```text theme={null}
https://s2s.adoperator.com/conversion?c={external_id}&value={payout}
```

Compare it with the URL in AdOperator's **Conversion Tracking** section. Only the tokens should differ: `{conversion}` becomes `{external_id}`, and `{payout}` stays `{payout}`, because both ClickFlare and AdOperator use that name.

4. 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.
5. Click **Save**. You are back in the campaign editor with the AdOperator traffic source selected.

> [!WARNING]
>
> Don't keep `{conversion}` in the postback. It is AdOperator's macro, not a ClickFlare token, so ClickFlare sends it as literal text and AdOperator cannot match the conversion. In the postback, the click ID is always `{external_id}`.

`value` is read as USD, the currency of your AdOperator account. If your offers pay in another currency, see [Multicurrency in ClickFlare](https://clickflare.com/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](https://clickflare.com/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 **CPC** and enter your AdOperator bid as the cost. See [Cost](#cost).
3. Choose **Redirect** or **Direct** tracking. Redirect is the usual choice for popunder and push 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 AdOperator macro from the template, for example `conversion={conversion}` and `subid={subid}`.

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

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

## Step 4 – Create the campaign in AdOperator

1. In AdOperator, click **Campaigns** and create a campaign.
2. Enter the campaign name and paste the ClickFlare campaign URL into **Target Url**.
3. Choose the format: **Popunder**, **Push Notifications** or in-page push.
4. Under **Budget and Limits**, set the **Total Budget**, **Daily Budget** and your bid. For popunder this is the **CPV (cost per 1 view)**. Watch the CPV: a CPV of 0.001 USD is a CPM of 1 USD, and a typo here overspends fast.
5. Set **Targeting** (geo, OS, browser) and, if you need it, **Advanced Targeting** (connection type, browser language, IP lists, domains, day and time).
6. For push and in-page push, add your creatives (up to four per campaign).
7. Click **Start Campaign**. AdOperator reviews it before it goes live.

Paste the URL exactly as ClickFlare gives it. AdOperator replaces each `{...}` macro when the ad is clicked.

## Step 5 – Test the integration

AdOperator doesn't document a test-conversion tool, so test with a small live budget.

1. Launch the campaign with a low daily budget.
2. In ClickFlare, open the campaign report and group by **Publisher sub ID**. Values like `12345` mean the macros are filling in. If you see the literal text `{subid}`, the URL was edited or pasted in the wrong field.
3. Check that the visits have an **External ID**. An empty External ID means `{conversion}` didn't reach ClickFlare, and no postback can work.
4. When the first conversion arrives, go to **Logs → Postback Status** and filter by the campaign. A successful request to `s2s.adoperator.com` confirms ClickFlare sent it.
5. In AdOperator, open **Reports** and check that the conversion shows on the campaign.

***

## Choosing the event to send

AdOperator's postback has no event parameter. Every postback it receives counts as one conversion type. Send the conversion you actually want AdOperator to count.

> **Sending only your final conversion**
>
> If your funnel has several steps (lead, then sale), create a [custom conversion](https://clickflare.com/docs/en/settings/custom-conversions.md) for each step in ClickFlare. Then map the AdOperator postback to the final step only, for example `purchase`. Earlier steps still show in ClickFlare. They just don't reach AdOperator.
>
> 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.

> **One traffic source, many campaigns**
>
> AdOperator's postback is global: the same URL works for every campaign, because the click ID tells AdOperator which campaign the conversion belongs to. One AdOperator traffic source in ClickFlare is enough for all your AdOperator campaigns.

## Cost

The template doesn't pass cost. It has no Cost row, so ClickFlare can't read AdOperator's price from the campaign URL.

Set the campaign's **Cost Model** to **CPC** and enter your AdOperator price:

| AdOperator format | AdOperator charges | Enter in ClickFlare (CPC) |
| - | - | - |
| Push notifications | Per click (CPC) | Your CPC bid |
| In-page push | Per click (CPC) | Your CPC bid |
| Popunder | Per view (CPV) | Your CPV. A popunder view is roughly one visit. |

If you buy popunder thinking in CPM, divide the CPM by 1,000 to get the CPV.

> [!NOTE]
>
> AdOperator's `{bid}` macro carries the click price. Adding it as a tracking field (see Step 1) lets you check the real price per click against the cost you entered. It doesn't set the cost by itself.

For AdOperator campaigns bought on a CPA goal, set the Cost Model to **CPA**, with your price per conversion.

When the recorded spend differs from your AdOperator spend, correct it with a [manual cost upload](https://clickflare.com/docs/en/settings/manual-cost-upload.md). See [Cost Models](https://clickflare.com/docs/en/core-platform-concepts/cost-models.md).

## Delayed revenue

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

***

## Troubleshooting

> **Conversions show in ClickFlare but not in AdOperator**
>
> * The postback still uses the template's `xml.adop.co` host. Change it to `https://s2s.adoperator.com/conversion`.
> * **Traffic source postback URL** is off on the AdOperator 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 or error AdOperator's server returned.

> **AdOperator doesn't match the conversions**
>
> * The campaign URL in AdOperator is missing `conversion={conversion}`, or the macro was edited. Copy the URL from ClickFlare again.
> * The postback uses AdOperator's `{conversion}` instead of ClickFlare's `{external_id}`.
> * The `externalId` row was removed from the traffic source.

> **AdOperator shows conversions with no payout**
>
> The template's postback has no `value` parameter. Add `&value={payout}` at the end of the postback.

> **Sub ID or other columns are empty**
>
> The macros were not replaced, usually because the URL was edited or pasted somewhere AdOperator doesn't process macros. Paste the campaign URL from ClickFlare unchanged into **Target Url**. If only **User agent** is empty, AdOperator doesn't fill `{user_agent}`. Remove the row or leave it. See [Traffic Source Tokens Arriving Empty](https://clickflare.com/docs/en/troubleshooting/tokens-arriving-empty.md).

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

***

**FREQUENTLY ASKED QUESTIONS**

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

**A1:** Yes. AdOperator's postback is global, and ClickFlare's postback lives on the traffic source. Every campaign that uses it sends conversions the same way.

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

**A2:** They are two halves of the same value. ClickFlare reads AdOperator's click ID from its own `conversion` parameter. AdOperator expects it back in its own `c` parameter. Change neither.

> **Q3:** Older guides mention a goal ID in the AdOperator postback. Do I need one?

**A3:** Not with the postback AdOperator shows today. Its **Conversion Tracking** section gives `https://s2s.adoperator.com/conversion?c={conversion}&value={payout}`, with no goal ID. If your account shows a different URL, use the one in your account and keep `{external_id}` and `{payout}` as the tokens.

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

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

> **Q5:** Does ClickFlare pull my AdOperator spend automatically?

**A5:** No. There is no AdOperator cost integration. Use the CPC cost model with your bid, and correct any gap with a manual cost upload.

## Related

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

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

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

> **[Conversions not showing](https://clickflare.com/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.