Saltar al contenido principal

Gestión del consentimiento

Según el país en el que opere su sitio web, es posible que necesite gestionar el consentimiento antes de recopilar cualquier dato sobre sus visitantes. Puede obtener más información al respecto en la documentación.

Reconciliación del historial entre dispositivos

La función de reconciliación del historial entre dispositivos de Kameleoon combina el historial y las acciones de un usuario en distintos dispositivos. Cuando un usuario visita un sitio web varias veces desde diferentes dispositivos, Kameleoon lo identifica como un visitante recurrente e informa con precisión del número de visitas. Esta función es sencilla de habilitar siempre que pueda identificar a los usuarios, normalmente mediante un inicio de sesión de cliente. Al utilizar la reconciliación del historial entre dispositivos, obtiene tres ventajas significativas:
  • Un sistema de segmentación coherente que tiene en cuenta todas las visitas y acciones en todos los dispositivos.
  • Garantía de que un visitante vea la misma variación para un experimento A/B determinado, independientemente del dispositivo que esté utilizando.
  • Un sistema de informes preciso y exacto que cuenta correctamente los visitantes únicos.
Para obtener más información sobre esta funcionalidad, puede consultar esta documentación.

Gestión de ITP

Si una parte significativa del tráfico de su sitio web procede de dispositivos móviles, implemente un método de sincronización de cookies para evitar problemas con la Intelligent Tracking Prevention (ITP) en Safari. Para más detalles técnicos sobre la gestión de ITP, consulte la documentación. Hay varias opciones disponibles para sincronizar el identificador visitorCode (mediante la cookie kameleoonVisitorCode) entre el front-end y el back-end y evitar problemas de ITP en Safari. Estas opciones incluyen:
  • Modificar la configuración de su servidor web frontal o de su Content Delivery Network (CDN) para generar y añadir la cookie kameleoonVisitorCode. Kameleoon puede proporcionar instrucciones para Akamai.
  • Implementar un fragmento de código específico en su servidor backend (Java, NodeJS u otro lenguaje).

Fragmento de código para Nginx

Para la integración con Nginx, utilice el siguiente fragmento de código:
server {
    listen 80;
    server_name MY_DOMAIN;

    set $visitorCode "";

        if ($http_cookie ~* "kameleoonVisitorCode=([^;]+)") {
        set $visitorCode $1;
    }

        if ($visitorCode = "") {
        set_by_lua_block $visitorCode '{
            local alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" 
            local code = "" 
            for i = 1, 16 do
                local randomNumber = math.random(1, #alphabet)
                code = code .. alphabet:sub(randomNumber, randomNumber)
            end
            return code
        }';
    }

    location / {
        add_header Set-Cookie "kameleoonVisitorCode=$visitorCode; Expires=$expires; Path=/; Domain=MY_DOMAIN;";
        return 204; 
    }
}

Fragmentos de código de backend

Puede alojar uno de los fragmentos de código de back-end en una única URL perteneciente a su dominio principal de nivel superior o en cada página. Si opta por un único endpoint, Kameleoon realiza una llamada por sesión al endpoint indicado para garantizar que su servidor establezca la cookie kameleoonVisitorCode. Esta llamada es asíncrona y se produce después de que la página haya terminado de cargarse. Póngase en contacto con su Customer Success Manager para activar esta opción. Kameleoon necesitará la URL que haya elegido.
El endpoint de sincronización que cree no debe devolver ningún dato. Un código de respuesta 204 No Content es suficiente. Este endpoint se utiliza únicamente para establecer una cookie del lado del servidor y debe aceptar una solicitud GET enviada a la URL de sincronización que defina, utilizando el siguiente código:
const e = new XMLHttpRequest;
e.open("GET", Kameleoon.Internals.configuration.synchronizationEndpointURL + "?visitorCode=" + this.visitorCode, !0);
Si integra el fragmento de código de back-end en cada página, no se requieren acciones adicionales. La cookie se creará automáticamente cuando se realicen las solicitudes normales de página a sus servidores.
Puede proporcionar su propio visitor code, normalmente un identificador único de su base de datos, en lugar de basarse en la generación automática. Asegúrese de que el visitorCode que proporcione sea único para cada visitante con el fin de garantizar la exactitud de los datos de sus experimentos.
Si utiliza tanto Kameleoon Web como Feature Experiments con uno de los SDKs del lado del servidor, puede utilizar directamente el método getVisitorCode(). Este método auxiliar recupera automáticamente el visitor code de Kameleoon para el visitante actual y crea la cookie en el back end.

Java

javax.servlet.http.HttpServletRequest request; // Provide a reference to the HttpServletRequest
javax.servlet.http.HttpServletResponse response; // Provide a reference to the HttpServletResponse
String topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
String visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

String cookiesHeader = request.getHeader("Cookie");
if (cookiesHeader != null) {
	String[] cookies = cookiesHeader.split(";");
	for (String cookieNameAndValue : cookies) {
		String[] cookieNameAndValuePair = cookieNameAndValue.split("=");
		if (cookieNameAndValuePair[0].trim().equals("kameleoonVisitorCode")) {
			visitorCode = cookieNameAndValuePair[1];
		}
	}
}
if (visitorCode == null) {
	final String alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	final int alphabetLength = alphabet.length();
	final int visitorCodeLength = 16;
	final StringBuilder visitorCodeBuilder = new StringBuilder(visitorCodeLength);
	for (int i = 0; i < visitorCodeLength; ++i) {
		visitorCodeBuilder.append(
				alphabet.charAt(java.util.concurrent.ThreadLocalRandom.current().nextInt(alphabetLength))
		);
	}
	visitorCode = visitorCodeBuilder.toString();
}

javax.servlet.http.Cookie cookie = new Cookie("kameleoonVisitorCode", visitorCode);
cookie.setMaxAge(32_832_000);
cookie.setHttpOnly(false); // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
cookie.setPath("/");
cookie.setDomain(topLevelDomain);
response.addCookie(cookie);

NodeJS

let topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
let visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

request.headers && request.headers.cookie.split(';').forEach(function (cookie) {
	let cookieNameAndValuePair = cookie.match(/(.*?)=(.*)$/);
	if (cookieNameAndValuePair[1].trim() == "kameleoonVisitorCode") {
		visitorCode = cookieNameAndValuePair[2].trim();
	}
});
if (!visitorCode) {
	let alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	let alphabetLength = alphabet.length;
	visitorCode = "";
	for (let i = 0; i < 16; ++i) {
		let randomNumber = Math.floor(Math.random() * alphabetLength);
		visitorCode += alphabet[randomNumber];
	}
}

let expires = new Date(new Date().getTime() + 32832000000);
response.writeHead(200, {
		'Set-Cookie': [`kameleoonVisitorCode=${visitorCode}; expires=${expires}; path=/; domain=${topLevelDomain};`]
});

PHP

<?php
$topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
$visitorCode = NULL; // Here you can provide your own identifier if needed, else it will be generated randomly

if (isset($_COOKIE["kameleoonVisitorCode"])) {
	$visitorCode = $_COOKIE["kameleoonVisitorCode"];
}
if (is_null($visitorCode)) {
	$alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	$alphabetLength = strlen($alphabet);
	$visitorCode = "";
	for ($i = 0; $i < 16; $i++) {
		$randomNumber = floor((mt_rand() / mt_getrandmax()) * $alphabetLength);
		$visitorCode .= substr($alphabet, $randomNumber, 1);
	}
}

setcookie("kameleoonVisitorCode", $visitorCode, time() + 32832000, "/", $topLevelDomain);
?>
Copie y pegue este código y sustituya MY_DOMAIN por su dominio base de nivel superior (es decir, mydomain.com).

C#

System.Security.Cryptography.RandomNumberGenerator rng; // A concurrent RNG for generating unique visitor codes
Microsoft.AspNetCore.Http.HttpRequest request; // Provide a reference to the HttpRequest
Microsoft.AspNetCore.Http.HttpResponse response; // Provide a reference to the HttpResponse
string topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
string visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

if (request.Cookies.ContainsKey("kameleoonVisitorCode"))
visitorCode = request.Cookies["kameleoonVisitorCode"];

if (visitorCode == null)
{
const string alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
const int visitorCodeLength = 16;
char[] visitorCodeBuffer = new char[visitorCodeLength];
byte[] randBuffer = new byte[visitorCodeLength];
rng.GetBytes(randBuffer);
for (int i = 0; i < visitorCodeLength; i++)
    visitorCodeBuffer[i] = alphabet[randBuffer[i] % alphabet.Length];
visitorCode = new string(visitorCodeBuffer);
}

var cookieOptions = new Microsoft.AspNetCore.Http.CookieOptions.CookieOptions();
cookieOptions.Expires = DateTime.Now.AddSeconds(32_832_000);
cookieOptions.HttpOnly = false; // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
cookieOptions.Path = "/";
cookieOptions.Domain = topLevelDomain;
response.Cookies.Append("kameleoonVisitorCode", visitorCode, cookieOptions);

Go

var request *fasthttp.Request // Provide a reference to the Request
var response *fasthttp.Response // Provide a reference to the Response
const topLevelDomain = "MY_DOMAIN" // Here you must provide your own base domain, eg mydomain.com
var visitorCode string // Here you can provide your own identifier if needed, else it will be generated randomly

if binaryVisitorCode := request.Header.Cookie("kameleoonVisitorCode"); binaryVisitorCode != nil {
	visitorCode = string(binaryVisitorCode)
}
if visitorCode == "" {
	const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
	const visitorCodeLength = 16
	visitorCodeBuilder := strings.Builder{}
	visitorCodeBuilder.Grow(visitorCodeLength)
	randomBuffer := make([]byte, visitorCodeLength)
	if _, err := rand.Read.Read(randomBuffer); err != nil { // crypto/rand
		// handle error
	}
	for i := 0; i < visitorCodeLength; i++ {
		visitorCodeBuilder.WriteByte(alphabet[randomBuffer[i] % len(alphabet)])
	}
	visitorCode = visitorCodeBuilder.String()
}

ck := fasthttp.AcquireCookie()
ck.SetKey("kameleoonVisitorCode")
ck.SetValue(visitorCode)
ck.SetExpire(time.Now().Add(380 * 24 * time.Hour))
ck.SetHTTPOnly(false) // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
ck.SetPath("/")
ck.SetDomain(topLevelDomain)
response.Header.SetCookie(ck)
fasthttp.ReleaseCookie(ck)

Python

import random

topLevelDomain = "MY_DOMAIN" # Here you must provide your own base domain, eg mydomain.com

# Here you can provide your own identifier via customer_visitor_code if needed, else it will be generated randomly
def fill_visitor_code(request, response, customer_visitor_code):
    visitor_code = request.cookies.get("kameleoonVisitorCode")
    if "kameleoonVisitorCode" in request.cookies:
        visitor_code = request.cookies.get("kameleoonVisitorCode")
    else:
        visitor_code = customer_visitor_code if customer_visitor_code is not None else "".join(
            random.choice(string.ascii_lowercase + string.digits) for _ in range(16)
        )
    response.set_cookie("kameleoonVisitorCode", visitor_code, max_age=32832000, domain=topLevelDomain)

fill_visitor_code(request, response) # The method must be called with correct arguments (depending on your Python web framework)

Ruby

# Define constants
KAMELEOON_COOKIE_VALUE_LENGTH = 16
KAMELEOON_COOKIE_NAME = 'kameleoonVisitorCode'.freeze
EXPIRE_DAYS = 365

# Method to generate a random visitor code
def generate_visitor_code(length)
  alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789'
  alphabet_length = alphabet.length
  visitor_code = ''

  length.times do
    random_number = rand(alphabet_length)
    visitor_code.concat(alphabet[random_number])
  end

  visitor_code
end

# Main code
top_level_domain = 'MY_DOMAIN' # Replace with your actual domain
visitor_code = cookies[KAMELEOON_COOKIE_NAME]

visitor_code = generate_visitor_code(KAMELEOON_COOKIE_VALUE_LENGTH) if visitor_code.nil? || visitor_code.empty?

kameleoon_cookie = {
  value: visitor_code,
  expires: Time.now + 60 * 60 * 24 * EXPIRE_DAYS,
  path: '/',
  domain: top_level_domain
}

cookies[KAMELEOON_COOKIE_NAME] = kameleoon_cookie

Uso de un dominio personalizado

Si desea utilizar su propio dominio en lugar del dominio predeterminado de Kameleoon, o si los bloqueadores de anuncios están impidiendo que algunos usuarios sean incluidos en los experimentos, Kameleoon ofrece una opción premium para configurar un dominio personalizado y evitar la detección. Más información sobre cómo habilitar un dominio personalizado.

Uso de su propio CDN o servidor de alojamiento (self-hosting)

El archivo de aplicación de Kameleoon engine.js (anteriormente denominado kameleoon.js) puede alojarse en el CDN de Kameleoon o en su propio CDN o servidores. Alojarlo en sus propios servidores puede ofrecer una ligera mejora de rendimiento al evitar una consulta DNS adicional y un handshake SSL que requiere el CDN de Kameleoon. Además, el self-hosting puede preferirse por razones de seguridad, ya que puede garantizar el cumplimiento de sus políticas de seguridad internas y asumir la responsabilidad de la seguridad de sus servidores de alojamiento. Si desea alojar usted mismo el archivo de aplicación de Kameleoon, consulte la documentación de self hosting.