Skip to main content
These are the maintained reference templates for placing EF.click() on a landing page. Each recipe is a complete, copy-paste snippet — pick the one that matches your funnel, replace the INSERT_* placeholders, and paste it before the closing </body> tag. For what each option does under the hood, see Configuration (organic fallback, cross-subdomain cookies) and Click Tracking (parameters reference).

Choosing a recipe

Answer two questions: where does the script run, and what does your funnel need?
RecipeOrganic fallbackCross-subdomain cookieCross-domain checkoutForm-based conversionNon-blocking load
Basic
Shopify (Custom Pixel)
Organic
Cross-Subdomain
Organic + Cross-Subdomain
Cross-Site
Cross-Site + Organic + Cross-Subdomain
Cross-Site + Hidden Field + Organic + Cross-Subdomain
Cross-Site + Hidden Field + Organic + Cross-Subdomain + Async
EF to EF
EF to EF + Organic + Cross-Subdomain
The EF-to-EF recipes are for pages tracked by two Everflow accounts (a brand network forwarding clicks to a partner network).
If your scenario needs a combination that isn’t listed here (for example Cross-Site without Organic), reach out to your CSM — these templates are maintained as a set, and we’ll help you adapt one safely.

Basic

A standard tracking link landing on a single page. No cross-domain redirects, no organic fallback, no chained partner attribution.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
});
</script>
Setup:
  1. Replace INSERT_TRACKING_DOMAIN with your network tracking domain.
  2. Paste both <script> blocks before the closing </body> tag on the landing page.
  3. Test by clicking through a tracking link with ?oid=N&affid=M URL params.

Shopify (Custom Pixel)

For Shopify checkouts using the Custom Pixel feature. There are no outer <script> tags (Shopify wraps the pixel itself), __cc carries Shopify’s coupon-code parameter, and the call chains .then(x => {}) for pixel-sandbox compatibility.
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    creative_id: EF.urlParameter('creative_id'),
    coupon_code: EF.urlParameter('__cc')
}).then(x => {});
Setup:
  1. In your Shopify admin: Customer events → Add custom pixel.
  2. Paste this snippet into the pixel body (no outer <script> tags — Shopify adds them).
  3. Set the pixel to fire on Page viewed.
  4. Test by clicking a tracking link with ?oid=N&affid=M&__cc=PROMO.

Organic

A landing page that receives both tracked traffic and direct/organic traffic. Untagged visitors get attributed to a default offer and affiliate so conversions from organic sources aren’t lost. See Organic tracking for how the fallback works.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
EF.configure({
    organic: {
        offer_id: INSERT_ORGANIC_OFFER_ID,
        affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
    }
});
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
});
</script>
Setup:
  1. Replace INSERT_TRACKING_DOMAIN, INSERT_ORGANIC_OFFER_ID, and INSERT_ORGANIC_AFFILIATE_ID.
  2. The organic fallback fires only when no ?oid / ?affid params are present.
  3. Visit the page directly (no URL params) to verify a click is recorded against the organic offer.

Cross-Subdomain

When your funnel spans multiple subdomains of the same site (e.g. www.example.comcheckout.example.com), the tracking cookie must be stored at the root domain so every subdomain shares attribution. The tld option does exactly that. See Cross-subdomain tracking for details.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
EF.configure({
    tld: "INSERT_TOP_LEVEL_DOMAIN"
});
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
});
</script>
Setup:
  1. Replace INSERT_TOP_LEVEL_DOMAIN with the apex domain (e.g. "example.com", including quotes).
  2. Paste before </body> on every page in the funnel that needs to share the tracking cookie.
Always load pages on a fully qualified subdomain (www.example.com, not example.com) to avoid cookie scoping issues.

Organic + Cross-Subdomain

Combines the Organic and Cross-Subdomain recipes. Use when you have organic traffic on a multi-subdomain funnel.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
EF.configure({
    tld: "INSERT_TOP_LEVEL_DOMAIN",
    organic: {
        offer_id: INSERT_ORGANIC_OFFER_ID,
        affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
    }
});
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
});
</script>
Setup:
  1. Replace all four INSERT_* placeholders.
  2. Paste before </body> on every page in the funnel.

Cross-Site

When the click and the conversion happen on different domains (e.g. landing page on brand.com, checkout on cart.com). The script appends the EF transaction ID to outbound links pointing at the cross-site domain, so attribution survives the domain change.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
var siteUrl = "INSERT_CROSS_DOMAIN_URL";
var advertiserId = INSERT_ADVERTISER_ID;
var elems = document.body.getElementsByTagName("a");
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
}).then(function(transactionId) {
    if (transactionId) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", transactionId);
                elems[i].href = url.href;
            }
        }
    } else if (EF.getAdvertiserTransactionId(advertiserId)) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", EF.getAdvertiserTransactionId(advertiserId));
                elems[i].href = url.href;
            }
        }
    }
});
</script>
Setup:
  1. Replace INSERT_CROSS_DOMAIN_URL with the URL fragment that identifies cross-site links (e.g. "checkout.example.com").
  2. Replace INSERT_ADVERTISER_ID with the advertiser ID used for the fallback path (EF.getAdvertiserTransactionId()).
  3. Paste before </body> on the landing page only — outbound links automatically inherit the transaction ID.

Cross-Site + Organic + Cross-Subdomain

Cross-Site tracking with organic fallback and a shared cross-subdomain cookie. Use when your funnel spans multiple domains and you receive organic traffic and your tracked subdomains need shared attribution.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
var siteUrl = "INSERT_CROSS_DOMAIN_URL";
var advertiserId = INSERT_ADVERTISER_ID;
var elems = document.body.getElementsByTagName("a");
EF.configure({
    tld: "INSERT_TOP_LEVEL_DOMAIN",
    organic: {
        offer_id: INSERT_ORGANIC_OFFER_ID,
        affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
    }
})
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
}).then(function(transactionId) {
    if (transactionId) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", transactionId);
                elems[i].href = url.href;
            }
        }
    } else if (EF.getAdvertiserTransactionId(advertiserId)) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", EF.getAdvertiserTransactionId(advertiserId));
                elems[i].href = url.href;
            }
        }
    }
});
</script>
Setup:
  1. Replace all six INSERT_* placeholders.
  2. Paste before </body> on the landing page.

Cross-Site + Hidden Field + Organic + Cross-Subdomain

Cross-site tracking that also writes the EF transaction ID into a hidden form field on the page. Use when the conversion is sent server-side and a form POST is the trigger.
<script type="text/javascript"
    src="https://INSERT_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
var siteUrl = "INSERT_CROSS_DOMAIN_URL";
var advertiserId = INSERT_ADVERTISER_ID;
var elems = document.body.getElementsByTagName("a");
var field_id = "INSERT_HIDDEN_FIELD_ID";
var field = document.getElementById(field_id);
EF.configure({
    tld: "INSERT_TOP_LEVEL_DOMAIN",
    organic: {
        offer_id: INSERT_ORGANIC_OFFER_ID,
        affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
    }
})
EF.click({
    offer_id: EF.urlParameter('oid'),
    affiliate_id: EF.urlParameter('affid'),
    sub1: EF.urlParameter('sub1'),
    sub2: EF.urlParameter('sub2'),
    sub3: EF.urlParameter('sub3'),
    sub4: EF.urlParameter('sub4'),
    sub5: EF.urlParameter('sub5'),
    uid: EF.urlParameter('uid'),
    source_id: EF.urlParameter('source_id'),
    transaction_id: EF.urlParameter('_ef_transaction_id'),
}).then(function(transactionId) {
    if (transactionId) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", transactionId);
                elems[i].href = url.href;
            }
        }
        field.value = transactionId;
    } else if (EF.getAdvertiserTransactionId(advertiserId)) {
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].href.includes(siteUrl)) {
                var url = new URL(elems[i].href);
                url.searchParams.set("_ef_transaction_id", EF.getAdvertiserTransactionId(advertiserId));
                elems[i].href = url.href;
            }
        }
        field.value = EF.getAdvertiserTransactionId(advertiserId);
    } else {
        field.value = "No EFTID";
    }
});
</script>
Setup:
  1. Replace all seven INSERT_* placeholders. INSERT_HIDDEN_FIELD_ID is the id attribute of an <input type="hidden"> in your form.
  2. Add the hidden input to your form: <input type="hidden" id="ef_tid" name="ef_tid">
  3. Paste before </body>. The script populates the hidden field on page load; the form POST carries it server-side.

Cross-Site + Hidden Field + Organic + Cross-Subdomain + Async

Same as the previous recipe but loads the SDK asynchronously so it never blocks page render. Use when the landing page has page-speed concerns or the SDK shouldn’t block above-the-fold content.
<script type="text/javascript">
var script = document.createElement('script');
script.src = "https://INSERT_TRACKING_DOMAIN/scripts/main.js";
script.defer = true;
script.onload = function() {
    var siteUrl = "INSERT_CROSS_DOMAIN_URL";
    var advertiserId = INSERT_ADVERTISER_ID;
    var elems = document.body.getElementsByTagName("a");
    var field_id = "INSERT_HIDDEN_FIELD_ID";
    var field = document.getElementById(field_id);
    EF.configure({
        tld: "INSERT_TOP_LEVEL_DOMAIN",
        organic: {
            offer_id: INSERT_ORGANIC_OFFER_ID,
            affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
        }
    })
    EF.click({
        offer_id: EF.urlParameter('oid'),
        affiliate_id: EF.urlParameter('affid'),
        sub1: EF.urlParameter('sub1'),
        sub2: EF.urlParameter('sub2'),
        sub3: EF.urlParameter('sub3'),
        sub4: EF.urlParameter('sub4'),
        sub5: EF.urlParameter('sub5'),
        uid: EF.urlParameter('uid'),
        source_id: EF.urlParameter('source_id'),
        transaction_id: EF.urlParameter('_ef_transaction_id'),
    }).then(function(transactionId) {
        if (transactionId) {
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].href.includes(siteUrl)) {
                    var url = new URL(elems[i].href);
                    url.searchParams.set("_ef_transaction_id", transactionId);
                    elems[i].href = url.href;
                }
            }
            field.value = transactionId;
        } else if (EF.getAdvertiserTransactionId(advertiserId)) {
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].href.includes(siteUrl)) {
                    var url = new URL(elems[i].href);
                    url.searchParams.set("_ef_transaction_id", EF.getAdvertiserTransactionId(advertiserId));
                    elems[i].href = url.href;
                }
            }
            field.value = EF.getAdvertiserTransactionId(advertiserId);
        } else {
            field.value = "No EFTID";
        }
    });
}
document.body.append(script);
</script>
Setup:
  1. Replace all seven INSERT_* placeholders.
  2. Paste this single block before </body> — note this version is one combined <script>, not two.
  3. The SDK loads with defer so it doesn’t block render; tracking fires once the SDK finishes loading.

EF to EF

When a brand network forwards clicks to a partner network on the same page (e.g. a brand running a partner program through another Everflow instance). The partner click fires first; its transaction ID becomes sub5 on the brand click.
<script type="text/javascript"
    src="https://INSERT_BRAND_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
if (EF.urlParameter("affid2")) {
  EF.click({
    tracking_domain: "https://INSERT_PARTNER_TRACKING_DOMAIN",
    offer_id: EF.urlParameter("oid2"),
    affiliate_id: EF.urlParameter("affid2"),
    sub1: EF.urlParameter("sub1"),
    sub2: EF.urlParameter("sub2"),
    sub3: EF.urlParameter("sub3"),
    sub4: EF.urlParameter("sub4"),
    sub5: EF.urlParameter("sub5"),
  }).then(function (transaction_id) {
    EF.click({
      tracking_domain: "https://INSERT_BRAND_TRACKING_DOMAIN",
      offer_id: EF.urlParameter("oid"),
      affiliate_id: EF.urlParameter("affid"),
      sub1: EF.urlParameter("sub1"),
      sub2: EF.urlParameter("sub2"),
      sub3: EF.urlParameter("sub3"),
      sub4: EF.urlParameter("sub4"),
      sub5: transaction_id,
      uid: EF.urlParameter("uid"),
      source_id: EF.urlParameter("source_id"),
    });
  });
} else {
  EF.click({
    tracking_domain: "https://INSERT_BRAND_TRACKING_DOMAIN",
    offer_id: EF.urlParameter("oid"),
    affiliate_id: EF.urlParameter("affid"),
    sub1: EF.urlParameter("sub1"),
    sub2: EF.urlParameter("sub2"),
    sub3: EF.urlParameter("sub3"),
    sub4: EF.urlParameter("sub4"),
    sub5: EF.urlParameter("sub5"),
    uid: EF.urlParameter("uid"),
    source_id: EF.urlParameter("source_id"),
    transaction_id: EF.urlParameter("_ef_transaction_id"),
  });
}
</script>
Setup:
  1. Replace INSERT_BRAND_TRACKING_DOMAIN and INSERT_PARTNER_TRACKING_DOMAIN.
  2. Tracking links from the partner network must include ?affid2= and ?oid2= params.
  3. Visitors with affid2 get the chained pattern; visitors without it are attributed only to the brand network.
The chained pattern reserves sub5 on the brand click for the partner transaction ID — it overrides any incoming sub5 value. Plan your sub-placement usage accordingly.

EF to EF + Organic + Cross-Subdomain

The EF to EF chain plus organic fallback and a shared cross-subdomain cookie. The else branch (no affid2) gets the full Organic + Cross-Subdomain configuration.
<script type="text/javascript"
    src="https://INSERT_BRAND_TRACKING_DOMAIN/scripts/main.js"></script>

<script type="text/javascript">
if (EF.urlParameter("affid2")) {
  EF.click({
    tracking_domain: "https://INSERT_PARTNER_TRACKING_DOMAIN",
    offer_id: EF.urlParameter("oid2"),
    affiliate_id: EF.urlParameter("affid2"),
    sub1: EF.urlParameter("sub1"),
    sub2: EF.urlParameter("sub2"),
    sub3: EF.urlParameter("sub3"),
    sub4: EF.urlParameter("sub4"),
    sub5: EF.urlParameter("sub5"),
  }).then(function(transaction_id) {
    EF.configure({
      tld: "INSERT_TOP_LEVEL_DOMAIN",
    })
    EF.click({
      tracking_domain: "https://INSERT_BRAND_TRACKING_DOMAIN",
      offer_id: EF.urlParameter("oid"),
      affiliate_id: EF.urlParameter("affid"),
      sub1: EF.urlParameter("sub1"),
      sub2: EF.urlParameter("sub2"),
      sub3: EF.urlParameter("sub3"),
      sub4: EF.urlParameter("sub4"),
      sub5: transaction_id,
      uid: EF.urlParameter("uid"),
      source_id: EF.urlParameter("source_id"),
    });
  });
} else {
  EF.configure({
    tld: "INSERT_TOP_LEVEL_DOMAIN",
    organic: {
      offer_id: INSERT_ORGANIC_OFFER_ID,
      affiliate_id: INSERT_ORGANIC_AFFILIATE_ID,
    }
  })
  EF.click({
    tracking_domain: "https://INSERT_BRAND_TRACKING_DOMAIN",
    offer_id: EF.urlParameter("oid"),
    affiliate_id: EF.urlParameter("affid"),
    sub1: EF.urlParameter("sub1"),
    sub2: EF.urlParameter("sub2"),
    sub3: EF.urlParameter("sub3"),
    sub4: EF.urlParameter("sub4"),
    sub5: EF.urlParameter("sub5"),
    uid: EF.urlParameter("uid"),
    source_id: EF.urlParameter("source_id"),
    transaction_id: EF.urlParameter("_ef_transaction_id"),
  });
}
</script>
Setup:
  1. Replace all five INSERT_* placeholders.
  2. Same setup as the basic EF to EF chain; the else branch handles untagged and organic traffic.

Placeholder reference

PlaceholderMeaningExample
INSERT_TRACKING_DOMAINYour network tracking domainwww.trk.yourbrand.com
INSERT_BRAND_TRACKING_DOMAINBrand network tracking domain (EF to EF)www.trk.yourbrand.com
INSERT_PARTNER_TRACKING_DOMAINPartner network tracking domain (EF to EF)www.trk.partner.com
INSERT_TOP_LEVEL_DOMAINApex domain for shared cookies"yourbrand.com"
INSERT_ORGANIC_OFFER_IDFallback offer ID for organic traffic1
INSERT_ORGANIC_AFFILIATE_IDFallback affiliate ID for organic traffic1
INSERT_CROSS_DOMAIN_URLDomain that identifies cross-site links"checkout.partner.com"
INSERT_ADVERTISER_IDAdvertiser ID for the cross-site fallback path2
INSERT_HIDDEN_FIELD_IDid of the hidden form input"ef_tid"