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

# AdsKeeper Conversion Tracking & Postback Setup

> Set up AdsKeeper conversion tracking in ClickFlare: click_id and click_price macros, and the a.adskeeper.com postback with client ID and goal.

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

AdsKeeper is a self-serve native advertising network from the MGID group. It shows your ads (teasers) in recommendation widgets on publisher sites, and bills on a prepaid cost-per-click basis. This guide sets up AdsKeeper as a traffic source in ClickFlare. It covers passing AdsKeeper's click data and click price into your reports and sending conversions, with revenue, back to AdsKeeper so its optimization and your stats agree.

AdsKeeper runs on the same platform as MGID, so the setup is close to the [MGID guide](/docs/en/integrations/mgid-as-a-traffic-source.md). The postback host, the client ID and the macro list are AdsKeeper's own, so use this page and the **AdsKeeper** template, not the MGID one.

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

## At a glance

| | |
| - | - |
| **Ad formats** | Native ads (teasers) in publisher widgets |
| **Click ID macro** | `{click_id}`, mandatory for postback tracking |
| **Conversion tracking** | S2S postback to `a.adskeeper.com` |
| **Payout passed back** | Yes, in the `r` parameter |
| **What you replace** | `REPLACE_WITH_CLIENT_ID` and `REPLACE_WITH_EVENT_NAME` in the postback |
| **Multiple events** | Up to 3 conversion goals per campaign, one postback per goal |
| **Cost** | Passed per click with `{click_price}`. Cost Model: **Not Tracked**. |
| **Conversion API** | No |

## How it works

**1. AdsKeeper sends the click**

A visitor clicks your teaser. AdsKeeper opens your ClickFlare campaign URL and fills in its macros: the click ID in `click_id`, the click price in `click_price`, plus the campaign, teaser, widget and title.

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

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

**3. The conversion reaches ClickFlare**

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

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

ClickFlare fires the AdsKeeper postback, replacing `{external_id}` with the stored AdsKeeper click ID and `{payout}` with the revenue. AdsKeeper matches it to the original click and records it under the goal named in `e`.

> [!NOTE]
>
> The mirror to keep straight: in the **campaign URL** you write *ClickFlare's* parameter (`click_id`) and *AdsKeeper's* macro (`{click_id}`). The template does this for you. In the **postback URL** you write *AdsKeeper's* parameter (`c`) 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).
* **Plan your AdsKeeper conversion goals.** AdsKeeper allows up to three per campaign: a **Main goal** and two additional ones. Goal names may contain only Latin letters and numbers, for example `purchase` or `lead1`.
* **Decide which conversions AdsKeeper should receive.** AdsKeeper optimizes on what you send it. See [Tracking several events](#tracking-several-events).

***

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

1. Go to **Campaigns** and click **New**.
2. In **Traffic Source**, open the dropdown and click **+ New Traffic Source**.
3. Type `adskeeper` in the search box and select the **AdsKeeper** template.
4. Enter a **Name**, for example `AdsKeeper`.
5. Set **Cost currency** to the currency of your AdsKeeper account. The click price arrives in that currency.

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

| Name | TS Parameter | TS Token (AdsKeeper macro) | ClickFlare Token | What it carries |
| - | - | - | - | - |
| External ID | `click_id` | `{click_id}` | `{external_id}` | AdsKeeper's click ID. Required for the postback. |
| Cost | `click_price` | `{click_price}` | `{cost}` | The price of the click. See [Cost](#cost). |
| Campaign ID | `campaign_id` | `{campaign_id}` | `{trackingField1}` | The AdsKeeper campaign ID |
| Teaser ID | `teaser_id` | `{teaser_id}` | `{trackingField2}` | The ad (teaser) |
| Widget ID | `widget_id` | `{widget_id}` | `{trackingField3}` | The publisher widget that showed the ad |
| Targeted Countries | `geo` | `{geo}` | `{trackingField4}` | The countries targeted in the campaign, not the visitor's own country. See below. |
| Targeted Regions | `geo_region` | `{geo_region}` | `{trackingField5}` | The regions or cities targeted in the campaign, not the visitor's own region |
| Ad Title | `title` | `{title}` | `{trackingField6}` | The ad title |

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

Each tracking field becomes a column you can group reports by. `widget_id` tells you which publisher placements convert, so you can block them or adjust their bids. `teaser_id` and `title` tell you which creative won.

As their names say, the **Targeted Countries** and **Targeted Regions** rows carry your campaign's targeting, not the visitor's location. MGID, whose platform AdsKeeper shares, documents `{geo}` as the countries selected in the campaign settings and `{geo_region}` as the selected regions or cities. For the visitor's real country and region, use ClickFlare's own geo data.

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

To pass more data, click **Add Parameter**, give it a name and parameter, and enter the AdsKeeper macro as the **TS Token**. ClickFlare assigns the next free tracking field. AdsKeeper says only its own macros work in tracking links. Its list is `{widget_id}`, `{teaser_id}`, `{campaign_id}`, `{geo}`, `{geo_region}`, `{click_id}`, `{click_price}`, `{client_id}` and `{title}`, so the template already uses almost all of them.

## Step 2 – Set up the postback

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

### Get your client ID and goal name from AdsKeeper

The template's postback needs two values from AdsKeeper: your client ID and the name of the conversion goal. AdsKeeper shows both in the postback URL it generates inside each campaign.

1. In AdsKeeper, create a campaign, or open an existing one and click its edit icon.
2. Go to the **Conversion Tracking** section and, on the **Tracking Settings** tab, choose **Postback**.
3. Choose **Manual Setup**. ClickFlare isn't one of AdsKeeper's ready-made templates.
4. Under **Main goal**, create a conversion goal: give it a **Conversion Name**, an **Event Name** (Latin letters and numbers only, for example `purchase`), and a **Conversion Category**. **Conversion Value** is optional. Add **Additional 1** and **Additional 2** goals if you track several events.
5. Optional: under **Advanced Settings**, choose whether each goal counts only unique conversions or non-unique ones too, such as upsells.
6. Click **Get Postback URL** and copy it.

The URL AdsKeeper gives you has this shape:

```text theme={null}
https://a.adskeeper.com/postback/CLIENT_ID?c={click_id}&e=purchase&r={revenue}
```

Note two values from it: the client ID after `/postback/`, and the event name in `e`. You only need these two. The ClickFlare template already has the click ID and revenue tokens in place.

Keep the AdsKeeper tab open for Step 4.

### 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://a.adskeeper.com/postback/REPLACE_WITH_CLIENT_ID?c={external_id}&e=REPLACE_WITH_EVENT_NAME&r={payout}
```

3. Replace the two placeholders:

| Placeholder | Replace with | Where to find it |
| - | - | - |
| `REPLACE_WITH_CLIENT_ID` | Your AdsKeeper client ID | The value after `/postback/` in the URL from **Get Postback URL** |
| `REPLACE_WITH_EVENT_NAME` | The goal's event name, for example `purchase` | The **Event Name** of the goal you created in **Conversion Tracking**. It must match exactly. |

Leave `{external_id}` and `{payout}` as they are. ClickFlare fills them in. AdsKeeper's own ClickFlare guide describes the same swap: `{click_id}` becomes `{external_id}`, `{revenue}` becomes `{payout}`. With client ID `12345` and the goal `purchase`, the result is:

```text theme={null}
https://a.adskeeper.com/postback/12345?c={external_id}&e=purchase&r={payout}
```

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 AdsKeeper traffic source selected.

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

> [!WARNING]
>
> Replace both placeholders. If `REPLACE_WITH_CLIENT_ID` stays in the URL, the postback goes to no account. If `REPLACE_WITH_EVENT_NAME` stays, or doesn't match the goal's event name, AdsKeeper doesn't know which goal the conversion belongs to.

Only `c` and `e` are mandatory. `r` is optional, but without it AdsKeeper doesn't know your revenue. AdsKeeper shows revenue in your account's currency, so send payouts in that currency. 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 click price AdsKeeper passes. See [Cost](#cost).
3. Choose **Redirect** or **Direct** tracking. Redirect is the usual choice.
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 AdsKeeper macro from the template, for example `click_id={click_id}` and `click_price={click_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 AdsKeeper.

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

## Step 4 – Create the campaign in AdsKeeper

1. Return to the AdsKeeper campaign from Step 2 and finish its targeting, budget and bid.
2. In **Tracking link settings**, the click ID parameter in **Tracking Tags** must be `click_id`, the name ClickFlare reads. AdsKeeper adds `{click_id}` automatically for postback tracking.
3. Check the **Tracking link preview**. `click_id={click_id}` must appear only once, because the ClickFlare URL already carries it. Don't paste the full ClickFlare URL into **Tracking Tags**.
4. Save the changes, or publish if this is a new campaign.
5. Create your ads and paste the ClickFlare campaign URL into each ad's URL field.

Paste the URL exactly as ClickFlare gives it. AdsKeeper replaces each macro in curly braces when the ad is clicked.

## Step 5 – Test the integration

AdsKeeper records test conversions separately from real ones.

1. In AdsKeeper, open the campaign's **Ads** section. Hover over an ad image and click the eye icon to open the preview.
2. Click the ad in the preview and complete the offer the way a real visitor would. Only clicks from the preview are flagged as tests. Clicking the ad from the ad list doesn't work.
3. In ClickFlare, check the visit. The **External ID** should hold an AdsKeeper click ID, not the literal text `{click_id}`.
4. Go to **Logs → Postback Status** and filter by the campaign. A successful request to `a.adskeeper.com` confirms ClickFlare sent the postback.
5. In AdsKeeper, wait 5–15 minutes and check the **Test conversions** column for the goal (Main Goal, Additional Goal 1 or Additional Goal 2). If the column is missing, enable it with **Columns** above the campaign list. It can take up to an hour.

If the offer ends in a real payment you can't skip, send the ad preview URL to your affiliate manager.

***

## Tracking several events

AdsKeeper tracks up to three goals per campaign, for example a lead, a deposit and a purchase. Each goal has its own postback, with its own event name in `e`:

```text theme={null}
https://a.adskeeper.com/postback/REPLACE_WITH_CLIENT_ID?c={external_id}&e=lead&r={payout}
https://a.adskeeper.com/postback/REPLACE_WITH_CLIENT_ID?c={external_id}&e=purchase&r={payout}
```

1. In AdsKeeper, add a goal for each step (**Main goal**, **Additional 1**, **Additional 2**) and note each event name.
2. In ClickFlare, create a [custom conversion](/docs/en/settings/custom-conversions.md) for each step, for example `lead` and `purchase`.
3. On the AdsKeeper traffic source, click **+ Another postback URL** once per extra goal, paste the template's URL and replace both placeholders.
4. Map each postback to its ClickFlare event: `lead` to the `e=lead` URL, `purchase` to `e=purchase`.
5. Test each goal. AdsKeeper shows test conversions under each goal separately.

> **Rules for AdsKeeper goals**
>
> * Three goals at most: a main goal and two additional ones.
> * One postback per goal. Don't combine goals in one URL.
> * Event names use Latin letters and numbers only. Use a unique name for each goal.
> * The `e` value must match the goal's event name in AdsKeeper exactly.
> * Choose unique or non-unique counting under **Advanced Settings**. Counting non-unique conversions you don't need inflates your numbers.

> **Sending only one event**
>
> If AdsKeeper 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 AdsKeeper.
>
> 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 click. AdsKeeper fills `{click_price}` with the price of each click, and ClickFlare stores it as the visit's cost. In the campaign editor, set the **Cost Model** to **Not Tracked**. ClickFlare then takes the cost from the `click_price` value in the URL. A fixed CPC would ignore AdsKeeper's real bid. See [Cost Models](/docs/en/core-platform-concepts/cost-models.md).

AdsKeeper bills on a prepaid cost-per-click model, so `{click_price}` is already a per-click value. You don't divide anything by 1,000.

> [!NOTE]
>
> `{click_price}` is an estimate. MGID, whose platform AdsKeeper shares, notes that some clicks are discounted after the fact and never charged, so the URL can overstate your spend. Compare ClickFlare's **Cost** column with your AdsKeeper spend after the first days.

ClickFlare's [MGID cost integration](/docs/en/integrations/mgid.md) connects to MGID accounts. It isn't documented for AdsKeeper accounts, so don't rely on it here. To correct a day's spend to the figure AdsKeeper bills, use a [manual cost upload](/docs/en/settings/manual-cost-upload.md). See also [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 AdsKeeper, the feed reports revenue hours or days after the click. To pass that revenue to AdsKeeper 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

> **AdsKeeper shows no test conversions**
>
> * `REPLACE_WITH_CLIENT_ID` is still in the postback, or the client ID belongs to another account. Copy it from **Get Postback URL**.
> * `REPLACE_WITH_EVENT_NAME` is still in the postback, or `e` doesn't match the goal's event name exactly.
> * The postback still uses AdsKeeper's `{click_id}` instead of ClickFlare's `{external_id}`. ClickFlare doesn't know `{click_id}` and sends it as literal text.
> * The test click wasn't made from the ad preview, so AdsKeeper didn't flag it as a test.

> **Conversions show in ClickFlare but not in AdsKeeper**
>
> * **Traffic source postback URL** is off on the AdsKeeper 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 AdsKeeper returned.

> **AdsKeeper shows conversions with no revenue**
>
> The postback has no `r={payout}`, or `r` still holds AdsKeeper's `{revenue}`. Use ClickFlare's `{payout}`.

> **Widget or teaser columns are empty**
>
> The macros were not replaced, usually because the URL was edited or **Tracking Tags** duplicated a parameter. Check the **Tracking link preview** 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 AdsKeeper traffic source for all my AdsKeeper campaigns?

**A1:** Yes, if they use the same event names. The postback is set once on the traffic source and every campaign using it sends conversions the same way. Create a second AdsKeeper traffic source only if a campaign needs different goals.

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

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

> **Q3:** AdsKeeper's own ClickFlare guide mentions adding `click_id={cf_click_id}` to the lander URL. Do I need that?

**A3:** Not for the AdsKeeper postback. `{cf_click_id}` is ClickFlare's own click ID. It belongs on the offer URL, where your affiliate network needs it to post the conversion back to ClickFlare. The AdsKeeper side only needs `{click_id}` in the campaign URL, which the template adds.

> **Q4:** Can I use the MGID template for AdsKeeper?

**A4:** No. The postback host and your client ID are different. Use the **AdsKeeper** template so conversions go to `a.adskeeper.com`. For MGID campaigns, see [MGID as a Traffic Source](/docs/en/integrations/mgid-as-a-traffic-source.md).

## Related

> **[MGID as a traffic source](/docs/en/integrations/mgid-as-a-traffic-source.md)**
>
> The sister network on the same platform.

> **[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.

> **[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.