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

# How to Rotate Landing Pages with Direct Tracking

> Split-test landing pages on Google Ads and other traffic sources that don't allow redirects: duplicate ads per lander, or rotate server-side with LanderLab and report by variantId in ClickFlare.

With **redirect tracking**, rotating landing pages is built in: you add several landers to a campaign path, set their weights, and ClickFlare picks a lander for every click before sending the visitor on.

Some traffic sources don't allow that redirect. **Google Ads** is the best-known example, and many other ad platforms (Facebook, Newsbreak, Snapchat and more) prefer or require the ad to point straight at the page. For those you use **direct tracking**: the ad links directly to your landing page and the ClickFlare script on the page records the visit.

The catch is that with direct tracking **the destination is fixed**. The visitor lands on the URL in your ad, and ClickFlare never gets a chance to choose a different lander. So ClickFlare's own lander rotation does not work in a direct tracking campaign.

This guide covers two ways to test several landing pages anyway:

| | Method 1: One ad per lander | Method 2: Server-side rotation with LanderLab |
| - | - | - |
| **How it works** | Each lander gets its own direct URL; you duplicate the ad and use one URL per ad | One URL; LanderLab serves a different variant to each visitor |
| **Real rotation** | No. The ad platform decides which ad gets traffic | Yes. Traffic is split by the weights you set |
| **Even split** | Not guaranteed. Platforms favour the ad that performs best early | Yes, by LanderLab variant weights |
| **Works with** | Any lander, any host | Landers built and hosted on LanderLab |
| **Report in ClickFlare** | By lander (each lander is its own ClickFlare lander) | By the `variantId` traffic source parameter |
| **Recommended** | As a workaround | **Yes** |

> [!TIP]
>
> If your landing pages are on LanderLab, use **Method 2**. It is the only one that gives you a true, controlled split on a single ad URL while keeping direct tracking.

***

## Before you start

* **Your own tracking domain.** Set up a custom tracking domain before anything else. Shared domains get flagged by ad platforms and blocked by browsers. See [Tracking domains](/docs/en/settings/tracking-domains.md).
* **A direct tracking campaign.** The campaign's **Transition between ad and campaign funnel** is set to **Direct**. If you have not built one yet, follow [Direct campaign tracking](/docs/en/campaigns/direct-campaign-tracking.md) first.
* **The ClickFlare direct tracking script on every landing page** (or every LanderLab variant) you want to test, and CTAs that use the ClickFlare **Click URL**.

***

## Why rotation needs a redirect

In a redirect campaign the click goes through ClickFlare first:

```text theme={null}
Ad → https://trk.yourdomain.com/cf/r/CAMPAIGN_ID  →  ClickFlare picks Lander A or Lander B  →  Lander
```

In a direct campaign there is no step in between:

```text theme={null}
Ad → https://lander-a.com/?cpid=CAMPAIGN_ID  →  Lander A (always)
```

The ad URL is the lander URL. Whatever page is in the ad is the page every visitor sees. To test more than one page you either need more than one URL (Method 1), or a landing page host that can show different content on the same URL (Method 2).

***

## Method 1: Duplicate the ad, one lander per ad

This is a workaround, not true rotation. It works with any landing page, wherever it is hosted.

### How it works

When you add two or more landers to a path in a direct tracking campaign, ClickFlare gives you a **separate direct tracking URL for each lander**. Each URL is the lander's own URL plus the campaign ID (`cpid`) and your traffic source parameters.

You then **duplicate the ad** in your traffic source and give each copy a different lander URL:

```text theme={null}
Ad 1 → https://lander-a.com/?cpid=CAMPAIGN_ID&gclid={gclid}...
Ad 2 → https://lander-b.com/?cpid=CAMPAIGN_ID&gclid={gclid}...
```

Both ads belong to the same ClickFlare campaign, so all visits, clicks and conversions land in one campaign, broken down by lander.

### Setup

**1. Add the direct tracking script to every lander**

Each landing page you want to test needs the ClickFlare direct tracking script, placed right before the closing `</body>` tag, and its CTA must use the ClickFlare **Click URL**. See [Direct campaign tracking](/docs/en/campaigns/direct-campaign-tracking.md).

**2. Create or open the direct tracking campaign**

Go to **Campaigns**, open your campaign (or create one with **New**), and on the **General** tab set **Transition between ad and campaign funnel** to **Direct**.

**3. Add all landers to the path**

On the **Destination** tab, open the path, choose **Landers & Offers** as the **Path Destination**, and add every lander you want to test under **Landers**. Add your offer(s) under **Offers**. Save the campaign.

> [!NOTE]
>
> The lander weights in the path have no effect here. With direct tracking ClickFlare does not choose the lander; the ad does.

**4. Copy one direct tracking URL per lander**

Open the campaign's tracking links. ClickFlare lists a direct tracking URL for each lander in the path. Copy all of them.

**5. Duplicate the ad in your traffic source**

In Google Ads (or your other platform), create one copy of the ad per lander. Keep the creative, targeting and bid identical so the only difference between the ads is the landing page. Paste a different lander URL as the **Final URL** of each ad.

**6. Compare landers in ClickFlare**

In the campaign report, group by **Lander** to compare visits, CTR, conversions and ROI for each page.

### Limitations

> [accordion] The ad platform decides the split, not you
>
> Ad platforms optimise delivery. Google Ads, Meta and most others quickly shift impressions to the ad they predict will perform best, so one lander can end up with most of the traffic after a few hundred impressions. You can reduce this with even-rotation settings where the platform offers them (for example, ad rotation set to **Do not optimize** in Google Ads, where still available), but there is no guarantee of an even split.

> [accordion] The test mixes ad performance with lander performance
>
> Each lander sits behind a different ad, so differences in CTR, quality score or approval status between the ads also affect the result. Keep the ads as identical as you can.

> [accordion] More ads to manage
>
> Every new lander means another ad copy in every ad group. With several ad groups and campaigns this grows quickly, and every ad goes through review separately.

> [accordion] Changing the winner means editing ads
>
> To stop a losing lander you pause its ad in the traffic source. Changing weights in ClickFlare does nothing in a direct campaign.

***

## Method 2: Server-side rotation with LanderLab (recommended)

[LanderLab](https://landerlab.io) is a landing page builder with built-in **A/B testing**. Its A/B testing is server-side: the page keeps **one URL**, and LanderLab serves a different version of the page, called a **variant**, to each visitor according to the weights you set.

That is exactly what direct tracking needs. The ad keeps a single, fixed URL, there is no redirect, and the rotation still happens.

### How ClickFlare knows which variant was shown

When A/B testing is on and more than one variant is active, LanderLab automatically appends a `variantId` parameter to the page URL, identifying the variant the visitor is seeing.

The ClickFlare direct tracking script reads the full landing page URL on every visit. If your ClickFlare traffic source has a parameter called `variantId`, ClickFlare captures its value like any other traffic source parameter (campaign ID, ad ID, keyword and so on) and stores it in a ClickFlare tracking field. You can then break down any report by variant.

```text theme={null}
Ad → https://offer.mylanderlabpage.com/roofing?cpid=CAMPAIGN_ID&gclid=...
       LanderLab serves Variant B and adds &variantId=<variant B id> to the URL
       ClickFlare script records the visit with variantId = <variant B id>
     → CTA (ClickFlare Click URL) → Offer → Conversion
       Conversion is attributed to the visit, so it carries variantId too
```

You get visits, clicks, conversions, revenue and ROI **per lander variant**, on a direct tracking campaign, from a single ad.

### Setup

**1. Build your variants in LanderLab**

Open your landing page in the LanderLab editor and click **A/B Test** in the top bar. In **Add New Variant**, give the variant a name and choose what to duplicate:

* **Existing Variant** copies a variant of the same page, so you only change what you want to test (headline, hero image, layout).
* **Another Landing Page** brings in a different LanderLab page as a variant, so you can test two completely different landers on the same URL.

  ![The Add New Variant dialog in LanderLab: name the variant and duplicate an existing variant or another landing page](https://mintcdn.com/clickflare/tilB0t0HdactcyFp/images/campaigns/lander-rotation/landerlab-add-new-variant.png?fit=max\&auto=format\&n=tilB0t0HdactcyFp\&q=85\&s=228032b3cfcd87bb91f52718f8e6f9de)

Repeat for every variant you want to test.

**2. Add the ClickFlare script and Click URL to every variant**

Each variant is its own page content, so each one needs the ClickFlare direct tracking script and CTAs that use the ClickFlare **Click URL**. If you created a variant by duplicating one that is already set up, it inherits the script and CTAs. If you brought in another landing page, check it.

See [Direct campaign tracking](/docs/en/campaigns/direct-campaign-tracking.md) for the script.

**3. Set the variant weights and publish**

In the A/B test, use **Manage Weights** to set how traffic is split, or **Spread Equally** for an even split. Weights are relative: for example A = 300, B = 100, C = 100 sends 60% / 20% / 20% of visitors. Publish the page.

> [!NOTE]
>
> LanderLab only appends `variantId` when A/B testing is enabled **and** more than one variant is active.

**4. Add variantId to your ClickFlare traffic source**

Go to **Traffic Sources** and open the traffic source you use for this campaign (for example, Google Ads). In the **Parameters** section, click **Add Parameter** and fill in:

| Field | Value |
| - | - |
| **Name** | `variantId` (or a label such as "Lander variant") |
| **TS Parameter** | `variantId` |
| **TS Token** | Leave **empty** |

ClickFlare assigns the next free **ClickFlare Token** (`{trackingFieldN}`) automatically. Make sure the parameter is switched on, then save.

![A ClickFlare traffic source with a variantId parameter added at the bottom: Name and TS Parameter are variantId, TS Token is empty, and ClickFlare Token is trackingField9](https://mintcdn.com/clickflare/2iHoghFjDLR-UBEr/images/campaigns/lander-rotation/clickflare-traffic-source-parameters.png?fit=max\&auto=format\&n=2iHoghFjDLR-UBEr\&q=85\&s=eccce2baf1883028b359ab6c051dfe4f)

> [!NOTE]
>
> Leave the **TS Token** empty. The value doesn't come from the traffic source, so there is no macro to fill in. ClickFlare only needs the **TS Parameter** name to read `variantId` from the landing page URL. An empty token also keeps `variantId` out of your campaign and lander tracking URLs, so the only `variantId` in the URL is the one LanderLab adds.

> [!WARNING]
>
> The **TS Parameter** must be exactly `variantId`. Parameter names are case-sensitive: `variantid` or `variant_id` will not match what LanderLab adds to the URL.

You only do this once per traffic source. Every campaign that uses it can then report by variant. See [How to add a custom traffic source](/docs/en/tracking/creating-a-traffic-source.md) for the full parameter reference.

**5. Set up the direct tracking campaign with the LanderLab page**

In the campaign, set **Transition between ad and campaign funnel** to **Direct**. On the **Destination** tab, add the LanderLab page as the **single lander** in the path (its main URL, the same for all variants) and add your offer(s).

**6. Use one direct tracking URL in the ad**

Copy the campaign's direct tracking URL for the lander and use it as the ad's **Final URL**. One ad, one URL. LanderLab does the rotation behind it.

**7. Test before sending traffic**

Open the direct tracking URL in a private window a few times. Check that:

* Different variants load across visits.
* The address bar shows `variantId=` with a value.
* The visits appear in ClickFlare with a value in the `variantId` column.

See [How to test a campaign before sending traffic](/docs/en/getting-started-with-click-flare/how-to-test-a-campaign-before-sending-traffic.md).

### Reading the results

In ClickFlare, open the campaign report and group by the **`variantId`** traffic source parameter (the name you gave it in the traffic source). Each row is one LanderLab variant, with its own visits, lander clicks, CTR, conversions, revenue, cost and ROI.

Because `variantId` is stored like any other traffic source parameter, you can combine it with other groupings, for example **variantId → Country** or **variantId → Device**, to see whether a variant wins only for part of your audience.

When you have a winner, go back to LanderLab, use **Set as Main** on the winning variant and switch the page from A/B Test mode back to Standard mode. The main variant then receives 100% of the traffic. Nothing needs to change in ClickFlare or in the ad.

### Things to know

> [accordion] The variants appear as one lander in ClickFlare
>
> ClickFlare sees one landing page URL, so the **Lander** report shows a single lander for the whole test. The split between variants is in the `variantId` breakdown, not in the Lander breakdown.

> [accordion] Weights are set in LanderLab, not in ClickFlare
>
> Lander weights and AI Smart Traffic in the ClickFlare path do not affect the variant split. Change the split in LanderLab with **Manage Weights**.

> [accordion] Visits with an empty variantId
>
> If some visits have no `variantId`, check that A/B testing is still enabled with at least two active variants, and that the parameter name in the traffic source is spelled exactly `variantId`. Visits recorded before you added the parameter to the traffic source will not have a value.

> [accordion] Does this work with traffic sources other than Google Ads?
>
> Yes. It works with any traffic source and any campaign that uses direct tracking, because the parameter comes from LanderLab, not from the ad platform. Add `variantId` to each traffic source you run LanderLab tests on.

> [accordion] Can I use this with redirect tracking too?
>
> You can, but with redirect tracking you normally don't need it: add the landers to the path and let ClickFlare rotate them. The LanderLab method is meant for campaigns where a redirect is not allowed.

***

## Which method should I use?

* **Your landers are on LanderLab:** use **Method 2**. True rotation on one URL, controlled weights, one ad to manage, and a per-variant breakdown in ClickFlare.
* **Your landers are hosted elsewhere and you can't move them:** use **Method 1**, and keep the ads identical so the lander is the only difference.
* **Your traffic source allows redirects:** you don't need either method. Use a redirect campaign and rotate landers in the path. See [Redirect vs. direct tracking](/docs/en/tracking/tracking-methods-in-clickflare.md).

***

## Related

> [card] [Direct campaign tracking](/docs/en/campaigns/direct-campaign-tracking.md)
>
> Set up a campaign without a redirect.

> [card] [Direct tracking explained](/docs/en/tracking/direct-tracking-clickflare.md)
>
> Benefits, limits and best practices.

> [card] [Custom traffic source](/docs/en/tracking/creating-a-traffic-source.md)
>
> Add parameters such as variantId.

> [card] [Google Ads](/docs/en/integrations/google-ads.md)
>
> Connect Google Ads to ClickFlare.


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