Eureka SDK Full Integration Examples

Prev Next

The summary checklist for the Eureka SDK full integration is as follows:

  • Listen for eureka:sdk:campaign:ready.

  • Use Insider.eureka.isOnControlGroup(campId) to check if the user is in the control group. Both the control group and the variation users must send track logs to enable accurate A/B test comparison.

  • For variation users: fetch data using Insider.eureka.fetch.search or Insider.eureka.fetch.productListing, then render the page with Eureka data.

  • For control group users: render the page using your own data and UI.

  • Call the same track methods for both groups with the rendered product data.

  • Re-call fetch and track methods every time the user changes sorting, applies filters (facets), or uses pagination.

  • Verify integration using console warnings for missing parameters.

Category Listing Page

// Step 1: Listen for campaign ready event
Insider.eventManager.once('eureka:sdk:campaign:ready', function (event, data) {
    var campId = data.id;
    var listValue = 'categoryA~categoryB';
    var isControlGroup = Insider.eureka.isOnControlGroup(campId);
    var items, navigation;

    if (!isControlGroup) {
        // Variation: Fetch from Eureka and render
        Insider.eureka.fetch.productListing(campId, 'Category', listValue, {
            pagination: { from: 0, size: 25 },
            sorting: 'Relevancy'
        }).then(function (response) {
            items = response.data.items;
            navigation = response.data.navigation;
            renderCategoryPage(items);
            trackPageView();
        });
    } else {
        // Control Group: Use your own data and UI
        trackPageView();
    }

    // Step 2: Track the page view (same for both groups)
    function trackPageView() {
        Insider.eureka.track.productListingView(campId, listValue, {
            pagination: {
                resultCount: navigation.total,
                itemsPerPage: 25,
                totalPages: navigation.totalPageCount,
                currentPage: 1,
            },
            sorting: 'Relevancy',
            products: items.map(function (item, index) {
                return {
                    id: item.id,
                    groupCode: item.group,
                    price: item.price,
                    displayPosition: index + 1,
                };
            }),
        });
    }

    // Step 3: Write a click event and inside track product clicks (call when a user clicks a product)
    Insider.eureka.track.productClickAfterListing(campId, listValue, {
        pagination: { resultCount: 84 },
        product: {
            id: 'product-001',
            price: 99.99,
            displayPosition: 3,
        },
    });
});

When the user changes sorting, applies filters, or navigates to a different page, call both fetch.productListing() and track.productListingView() again with the updated parameters.

Search Results Page (with add to cart)

// Step 1: Listen for campaign ready event
Insider.eventManager.once('eureka:sdk:campaign:ready', function (event, data) {
    var campId = data.id;
    var searchQuery = 'queryA';
    var isControlGroup = Insider.eureka.isOnControlGroup(campId);
    var items, navigation;

    if (!isControlGroup) {
        // Variation: Fetch from Eureka and render
        Insider.eureka.fetch.search(campId, searchQuery, {
            pagination: { from: 0, size: 24 },
            sorting: 'Relevancy'
        }).then(function (response) {
            items = response.data.items;
            navigation = response.data.navigation;
            renderSearchResults(items);
            trackSearch();
        });
    } else {
        // Control Group: Use your own data and UI
        trackSearch();
    }

    // Step 2: Track the search event (same for both groups)
    function trackSearch() {
        Insider.eureka.track.search(campId, searchQuery, {
            pagination: {
                resultCount: navigation.total,
                itemsPerPage: 24,
                totalPages: navigation.totalPageCount,
                currentPage: 1,
            },
            products: items.map(function (item, index) {
                return {
                    id: item.id,
                    price: item.price,
                    displayPosition: index + 1,
                };
            }),
        });
    }

    // Step 3: Write a click event and inside track product clicks (call when a user clicks a product)
    function onProductClick(product) {
        Insider.eureka.track.productClickAfterSearch(campId, searchQuery, {
            pagination: { resultCount: 25 },
            product: {
                id: product.id,
                price: product.price,
                displayPosition: product.position,
                clickPosition: product.position,
            },
        });
    }

    // Step 4: Write a click event and inside track add-to-cart from search results (click must be sent first)
    function onAddToCartFromSearch(product) {
        // Send click event first
        Insider.eureka.track.productClickAfterSearch(campId, searchQuery, {
            pagination: { resultCount: 25 },
            product: {
                id: product.id,
                price: product.price,
                displayPosition: product.position,
            },
        });

        // Then send add-to-cart event
        Insider.eureka.track.productAddToCartAfterSearch(campId, searchQuery, {
            pagination: { resultCount: 25 },
            product: {
                id: product.id,
                price: product.price,
                displayPosition: product.position,
            },
        });
    }
});

When the user changes sorting, applies filters, or navigates to the next page, call both fetch.search() and track.search() again with the updated parameters.

Brand Listing Page

// Step 1: Listen for campaign ready event
Insider.eventManager.once('eureka:sdk:campaign:ready', function (event, data) {
    var campId = data.id;
    var brand = 'BrandName';
    var isControlGroup = Insider.eureka.isOnControlGroup(campId);
    var items, navigation;

    if (!isControlGroup) {
        // Variation: Fetch from Eureka and render
        Insider.eureka.fetch.productListing(campId, 'Brand', brand, {
            pagination: { from: 0, size: 25 },
            sorting: 'Relevancy'
        }).then(function (response) {
            items = response.data.items;
            navigation = response.data.navigation;
            renderBrandPage(items);
            trackPageView();
        });
    } else {
        // Control Group: Use your own data and UI
        trackPageView();
    }

    // Step 2: Track the page view (same for both groups, source = 'brand-listing')
    function trackPageView() {
        Insider.eureka.track.productListingView(campId, brand, {
            source: 'brand-listing',
            pagination: {
                resultCount: navigation.total,
                itemsPerPage: 25,
                totalPages: navigation.totalPageCount,
                currentPage: 1,
            },
            products: items.map(function (item, index) {
                return {
                    id: item.id,
                    price: item.price,
                    displayPosition: index + 1,
                };
            }),
        });
    }

    // Step 3: Write a click event and inside track product clicks (call when a user clicks a product, source = 'brand-listing')
    function onProductClick(product) {
        Insider.eureka.track.productClickAfterListing(campId, brand, {
            source: 'brand-listing',
            pagination: { resultCount: 50 },
            product: {
                id: product.id,
                price: product.price,
                displayPosition: product.position,
            },
        });
    }
});

When the user changes sorting, applies filters, or navigates to a different page, call both fetch.productListing() and track.productListingView() again with the updated parameters.