17 de Octubre
Master de SEO Técnico

Utilizar las cookies a tu favor en el SEO

Descubre cómo usar las cookies en el mundo del Marketing

Utilizar las cookies a tu favor en el SEO
Autor:
Carlos Sánchez
Temática:
Rastreo
,
Tecnologías
Fecha de publicación:
2025-09-23

Última revisión:
2025-09-25

Las cookies son un elemento web sobre el que se ha legislado mucho sin conocimiento. Pero sobre todo es un elemento que ha quedado casi relegado a los cambios de idiomas, herramientas externas de analítica y carritos de la compra.

Sin embargo, podemos utilizar las cookies para muchas cuestiones a nuestro favor. Te animo a ver este vídeo y veamos varios casos prácticos.

Es importante enfatizar lo siguiente: tras revisarlo con detalle, aunque se trate de cookies analíticas propias o destinadas a mejorar la personalización, legalmente deben implementarse únicamente tras el consentimiento (recuerda que puedes implementar el constent mode tu mismo), salvo que sean estrictamente necesarias para el funcionamiento de la página.

En cualquier caso, recomiendo revisar cada situación con el departamento legal, ya que cada casuística específica puede interpretarse de una forma u otra en función de las circunstancias. Una idea también es ponerla en sessionStorage o localStorage hasta que acepte el usuario y luego se pasan a cookies persistentes.

Voy a centrarme en ejemplos de implementaciones técnicas que podrías adaptar y aplicar a tu negocio.

Como digo son ejemplos, que pueden servir para inspirarte o darte ideas sobre la cantidad de aplicaciones que pueden tener.

UTM de ChatGPT

Para comprobar si nos está funcionando nuestra estrategia de SEO en LLMs podemos hacer una comprobación muy sencilla.

ChatGPT a día de hoy pone enlaces con un parámetro UTM, y si los usuarios acceden a nuestra web, gracias a ese parámetro lo podemos comprobar en el Google Analytics.

Pero, ¿qué ocurre si no tenemos GA o queremos comprobar los Leads de una forma más directa?

Podemos hacer que la web vaya dejando una cookie por cada página visitada (o, si se prefiere, ir añadiendo todos los pasos dentro de una única cookie en formato JSON para no sobrecargar el navegador). Yo prefiero enseñarlo en la forma simple, y que luego cada uno lo optimice a su gusto.

El seguimiento empieza cuando el usuario accede a una URL con la UTM definida.
A partir de ahí, se le va creando una cookie por cada página en orden secuencial, de manera que al final tenemos un listado completo de la ruta que ha seguido el posible lead dentro de la web.

Tened en cuenta que este sistema de trackeo lo he puesto como ejemplo con el UTM de ChatGPT, pero lo podemos hacer con absolutamente cualquier cosa, además de que se puede personalizar de forma muy sencilla. Podríamos incluso guardar los datos en nuestro panel de WordPress y crear nuestro propio analytics, más fiable, sin muestrear y registrando los datos que nos interesen.

Si no quieres liarte con el código ni aprenderlo, pero quieres tener esta implementación en tu proyecto de forma sencilla y personalizable, estará pronto disponible en GEOhat LLM

Así añadiríamos con PHP nuestro sistema secuencial de Cookies:
// Configuración
$utm_param_key = 'utm_source';
$utm_param_value = 'chatgpt.com';
$master_cookie = 'Track-ChatGPT';
$counter_cookie = 'track_chatgpt_counter';
$prefix = 'track-ChatGPT-';
$expiry_seconds = 30 * 60;
$max_cookies = 50;
$cookie_options = [
'expires' => time() + $expiry_seconds,
'path' => '/',
'secure' => is_ssl(),
'httponly' => false,
'samesite' => 'Lax',
];
$set_cookie = function(string $name, string $value, array $options) {
setcookie($name, $value, $options);
$_COOKIE[$name] = $value;
};
// Filtro: evitar registrar favicons, scripts, REST, etc.
$excluded_patterns = '#\.(ico|png|jpg|jpeg|gif|svg|webp|js|css|woff2?|ttf|eot)$#i';
$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
$is_valid_path = (
$method === 'GET' &&
!preg_match($excluded_patterns, $uri) &&
strpos($uri, '/wp-json/') === false
);
// Paso 1: ¿Hay que activar tracking?
$activating = (
!isset($_COOKIE[$master_cookie]) &&
isset($_GET[$utm_param_key]) &&
$_GET[$utm_param_key] === $utm_param_value
);
// Paso 2: ¿Ya está activo?
$active = (
isset($_COOKIE[$master_cookie]) &&
$_COOKIE[$master_cookie] === 'activo'
);
// Si se está activando o ya está activo Y es una página válida
if (($activating || $active) && $is_valid_path) {
$path = rawurlencode($_SERVER['REQUEST_URI']);
$count = isset($_COOKIE[$counter_cookie]) ? max(0, intval($_COOKIE[$counter_cookie])) : 0;
// Solo si no se ha llegado al límite
if ($count < $max_cookies) {
$next = $count + 1;
$name = $prefix . str_pad($next, 2, '0', STR_PAD_LEFT);
$set_cookie($name, $path, $cookie_options);
$set_cookie($counter_cookie, (string) $next, $cookie_options);
$set_cookie($master_cookie, 'activo', $cookie_options);
}
}

De esta forma vamos registrando en el navegador del usuario el viaje que está haciendo por nuestra web.

Recuerda que puedes ver las Cookies que ha puesto la web en tu navegador por medio de la DevTools > Aplicaciones > Cookies.

Así que ahora la idea, es que si el usuario ha venido por ChatGPT, que lo ponga en el formulario y así sepa la empresa que viene por ahí (esto también nos valdría para aplicarlo con UTMs de SEM/SEA o con otras prácticas que realicemos) es un chivato para recordarle a la empresa de donde ha venido el Lead.

Para conseguir que se nos vea así (probablemente con calma lo puedes hacer más bonito):

Te enseño a hacerlo con contact form o con tu sistema de envío propio

Añadir el tracking en el contact form 7:

function asdrubal_get_chatgpt_steps(): array { $master = 'Track-ChatGPT'; $counter = 'track_chatgpt_counter'; $prefix = 'track-ChatGPT-'; if (empty($_COOKIE[$master]) || $_COOKIE[$master] !== 'activo') { return []; } $count = isset($_COOKIE[$counter]) ? max(0, (int)$_COOKIE[$counter]) : 0; if ($count === 0) return []; $steps = []; for ($i = 1; $i <= $count; $i++) { $name = $prefix . str_pad($i, 2, '0', STR_PAD_LEFT); if (empty($_COOKIE[$name])) continue; $url = rawurldecode($_COOKIE[$name]);
// Se filtran URLs que no son de navegación real del usuario
if (preg_match('#/(wp-json|xmlrpc\.php|favicon\.ico|contact-form-7)/#', $url)) continue; if (preg_match('#\.(js|css|map|png|jpe?g|gif|svg|webp)(\?.*)?$#i', $url)) continue; $steps[] = esc_url($url); } return $steps; }
// SHORTCODE para mostrar la ruta en cualquier parte de la web con [chatgpt_route]
add_shortcode('chatgpt_route', function($atts){ $steps = asdrubal_get_chatgpt_steps(); if (!$steps) return '<div><strong>ChatGPT Route:</strong> (sin datos)</div>'; $html = '<div style="border:1px solid #ddd;padding:10px;border-radius:6px;margin:10px 0">'; $html .= '<strong>ChatGPT Route</strong>'; $html .= '<ol style="margin:6px 0 0 18px;padding:0">'; foreach ($steps as $url) { $html .= '<li><a href="'. $url .'">'. $url .'</a></li>'; } $html .= '</ol></div>'; return $html; });
// ETIQUETA ESPECIAL para insertar la ruta en los correos de Contact Form 7
add_filter('wpcf7_special_mail_tags', function($output, $name, $html){ if ('_chatgpt_route_block' !== strtolower($name)) return $output; $steps = asdrubal_get_chatgpt_steps(); if (!$steps) { return $html ? '<div><strong>ChatGPT Route:</strong> (sin datos)</div>' : 'ChatGPT Route: (sin datos)'; } if ($html) { $out = '<div style="border:1px solid #ddd;padding:10px;border-radius:6px;margin:10px 0">'; $out .= '<strong>ChatGPT Route</strong>'; $out .= '<ol style="margin:6px 0 0 18px;padding:0">'; foreach ($steps as $url) { $out .= '<li><a href="'. $url .'">'. $url .'</a></li>'; } $out .= '</ol></div>'; return $out; } else { $lines = ["ChatGPT Route", "Secuencia (" . count($steps) . " pasos):"]; foreach ($steps as $i => $url) { $lines[] = ($i + 1) . ') ' . $url; } return implode("\n", $lines); } }, 10, 3);
// ETIQUETA DE FORMULARIO para añadir los datos como campos ocultos en Contact Form 7
add_action('wpcf7_init', function () { if (function_exists('wpcf7_add_form_tag')) { wpcf7_add_form_tag('chatgpt_route', 'asdrubal_cf7_chatgpt_route_form_tag_handler', ['name-attr' => false]); } }); function asdrubal_cf7_chatgpt_route_form_tag_handler($tag) { $steps = asdrubal_get_chatgpt_steps(); $origin = !empty($steps) ? $steps[0] : ''; $json = !empty($steps) ? wp_json_encode($steps, JSON_UNESCAPED_SLASHES) : '[]'; return sprintf( '<input type="hidden" name="chatgpt_origin_url" value="%s" />' . "\n" . '<input type="hidden" name="chatgpt_route" value="%s" />', esc_attr($origin), esc_attr($json) ); }

En un formulario personalizado:

// === Funciones de ayuda para el rastreo de ChatGPT ===
function _as_fmt_duration($seconds) {
if ($seconds === null) return 's/d';
$seconds = max(0, (int)$seconds);
$h = floor($seconds / 3600);
$m = floor(($seconds % 3600) / 60);
$s = $seconds % 60;
return $h > 0 ? sprintf('%02d:%02d:%02d', $h, $m, $s) : sprintf('%02d:%02d', $m, $s);
}
/**
* Lee las cookies de seguimiento y devuelve una estructura con la URL de origen,
* la secuencia de pasos y el tiempo de permanencia en cada página (limitado a 30 min).
*/
function _as_get_chatgpt_route_summary() {
$master_cookie = 'Track-ChatGPT';
$counter_cookie = 'track_chatgpt_counter';
$prefix = 'track-ChatGPT-';
$expiry_cap = 30 * 60; // Límite de 30 minutos
$out = [
'active' => (isset($_COOKIE[$master_cookie]) && $_COOKIE[$master_cookie] === 'activo'),
'origin_url' => '',
'steps' => [] // Formato: ['i'=>1, 'url'=>'...', 'ts'=>int, 'dwell'=>int|null]
];
if (!$out['active']) return $out;
$count = isset($_COOKIE[$counter_cookie]) ? max(0, (int)$_COOKIE[$counter_cookie]) : 0;
if ($count === 0) return $out;
$steps = [];
for ($i = 1; $i <= $count; $i++) {
$name = $prefix . str_pad($i, 2, '0', STR_PAD_LEFT);
if (!isset($_COOKIE[$name])) continue;
$raw = $_COOKIE[$name];
$url = '';
$ts = null;
// Soporta el nuevo valor JSON {url, ts} o el formato antiguo (solo la URL)
if ($raw && $raw[0] === '{') {
$data = json_decode($raw, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($data)) {
$url = isset($data['url']) ? (string)$data['url'] : '';
$ts = isset($data['ts']) ? (int)$data['ts'] : null;
}
} else {
$url = rawurldecode($raw);
}
$steps[] = ['i'=>$i, 'url'=>$url, 'ts'=>$ts, 'dwell'=>null];
}
if (!$steps) return $out;
$out['origin_url'] = $steps[0]['url'];
// Calcula la permanencia (dwell) entre pasos, limitando al máximo definido
$n = count($steps);
for ($k = 0; $k < $n; $k++) {
$cur = $steps[$k];
$next = $steps[$k+1] ?? null;
if (!empty($cur['ts']) && !empty($next['ts'])) {
$delta = max(0, $next['ts'] - $cur['ts']);
$steps[$k]['dwell'] = min($delta, $expiry_cap);
} elseif (!empty($cur['ts']) && $next === null) {
// Última página: calcula el tiempo desde que entró hasta ahora
$delta = max(0, time() - $cur['ts']);
$steps[$k]['dwell'] = min($delta, $expiry_cap);
} else {
$steps[$k]['dwell'] = null; // No hay datos suficientes
}
}
$out['steps'] = $steps;
return $out;
}
/**
* Construye y devuelve el bloque HTML completo con el resumen del tracking,
* listo para ser insertado en el cuerpo de un correo electrónico.
*/
function _as_build_chatgpt_tracking_block_html() {
$s = _as_get_chatgpt_route_summary();
if (!$s['active']) {
return '<p><strong>Seguimiento ChatGPT:</strong> sin datos (sin cookie/consentimiento).</p>';
}
$html = '<h3 style="margin:16px 0 8px">URL origen de chatGPT</h3>';
$orig = htmlspecialchars($s['origin_url'] ?: 's/d', ENT_QUOTES, 'UTF-8');
$html .= $s['origin_url'] ? '<p><a href="'. $orig .'">'. $orig .'</a></p>' : '<p>s/d</p>';
$html .= '<h3 style="margin:16px 0 8px">Secuencia de páginas y permanencia</h3>';
$html .= '<ol style="padding-left:20px;margin:0">';
foreach ($s['steps'] as $step) {
$idx = str_pad((string)$step['i'], 2, '0', STR_PAD_LEFT);
$url = htmlspecialchars($step['url'] ?: 's/d', ENT_QUOTES, 'UTF-8');
$dwell = _as_fmt_duration($step['dwell']);
$html .= '<li style="margin:4px 0"><strong>'. $idx .')</strong> ';
$html .= $step['url'] ? '<a href="'. $url .'">'. $url .'</a>' : $url;
$html .= ' — permanencia: <em>'. $dwell .'</em></li>';
}
$html .= '</ol>';
return $html;
}

Recuerda que estos son simplemente ejemplos, puedes aprender a programarlos tú mismo desde el máster de SEO Técnico o pedirle ayuda a un LLM para que adapte el código a tu caso e ir probando poco a poco hasta que lo tengas personalizado.

POP UP dinámico

Podemos hacer que nuestra web favorezca el orden de determinados productos o páginas, incluso que nos muestre CTAs concretos y banners personalizados si ha accedido a determinada página.

Esta es una explicación bastante simple de por qué en las webs de las aerolíneas los precios de un mismo vuelo es más caro después de haberlo visitado pero en incógnito no.

En este caso adjunto el ejemplo de alguien que se mete en mi página del máster y tras navegar 2 o 3 páginas, manda un recordatorio de que aún hay plazas abiertas.

Ejemplo del código:

<?php
add_action('init', function () {
// ==== CONFIGURACIÓN ====
$master_path = '/master-seo-tecnico/';
$cookie_visit_name = 'mst_master_visit';
$cookie_dismiss = 'mst_popup_dismissed';
$cookie_views = 'mst_views_after_master';
$cookie_threshold = 'mst_popup_threshold';
$visit_ttl_seconds = 60 * 60 * 24 * 30;
$dismiss_ttl_sec = 60 * 60 * 24 * 30;
$views_ttl_seconds = 60 * 60 * 24 * 30;
// Marca cookie si entra al máster
$current_path = parse_url((is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], PHP_URL_PATH);
if (trailingslashit($current_path) === $master_path) {
if (!isset($_COOKIE[$cookie_visit_name]) || $_COOKIE[$cookie_visit_name] !== '1') {
setcookie($cookie_visit_name, '1', [
'expires' => time() + $visit_ttl_seconds,
'path' => '/',
'secure' => is_ssl(),
'httponly' => false,
'samesite' => 'Lax',
]);
$_COOKIE[$cookie_visit_name] = '1';
}
setcookie($cookie_views, '0', [
'expires' => time() + $views_ttl_seconds,
'path' => '/',
'secure' => is_ssl(),
'httponly' => false,
'samesite' => 'Lax',
]);
$_COOKIE[$cookie_views] = '0';
}
// Script del popup
add_action('wp_enqueue_scripts', function () use ($master_path, $cookie_visit_name, $cookie_dismiss, $cookie_views, $cookie_threshold, $dismiss_ttl_sec, $views_ttl_seconds) {
wp_register_script('mst-popup', false, [], null, true);
wp_enqueue_script('mst-popup');
$data = [
'masterPath' => $master_path,
'visitCookie' => $cookie_visit_name,
'dismissCookie'=> $cookie_dismiss,
'viewsCookie' => $cookie_views,
'thCookie' => $cookie_threshold,
'viewsTtl' => $views_ttl_seconds,
'dismissTtl' => $dismiss_ttl_sec,
'isMasterPage' => (trailingslashit(parse_url((is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], PHP_URL_PATH)) === $master_path),
'popup' => [
'title' => '¿Aún te interesa el Máster SEO Técnico?',
'msg' => 'Seguimos teniendo plazas abiertas, puedes reunirte conmigo y pedir información sin compromiso',
'cta' => 'Volver al Máster',
'close' => 'No mostrar de nuevo',
],
];
wp_add_inline_script('mst-popup', 'window.MST_POPUP = ' . wp_json_encode($data) . ';', 'before');
wp_add_inline_script('mst-popup', <<<JS
(function(){
var cfg = window.MST_POPUP || {};
if (!cfg || cfg.isMasterPage) return;
function getCookie(name){ var v=document.cookie.match('(?:^|; )'+name.replace(/([.$?*|{}()\\[\\]\\\\\\/\\+^])/g,'\\\\$1')+'=([^;]*)'); return v?decodeURIComponent(v[1]):null;}
function setCookie(name,value,seconds){var d=new Date(); d.setTime(d.getTime()+(seconds*1000)); document.cookie=name+'='+encodeURIComponent(value)+'; expires='+d.toUTCString()+'; path=/; samesite=Lax'+(location.protocol==='https:'?'; secure':'');}
if(getCookie(cfg.visitCookie)!=='1'||getCookie(cfg.dismissCookie)==='1')return;
if(location.pathname.replace(/\\/+$/,'/')===cfg.masterPath)return;
var th=parseInt(getCookie(cfg.thCookie)||'',10); if(!th||(th!==2&&th!==3)){th=(Math.random()<0.5?2:3); setCookie(cfg.thCookie,String(th),cfg.viewsTtl);}
var views=parseInt(getCookie(cfg.viewsCookie)||'0',10); views=isNaN(views)?0:views; views++; setCookie(cfg.viewsCookie,String(views),cfg.viewsTtl);
if(views<th)return; if(window.__mst_popup_shown)return; window.__mst_popup_shown=true;
var backdrop=document.createElement('div'); backdrop.id='mst-popup-backdrop';
var box=document.createElement('div'); box.id='mst-popup-box';
box.innerHTML=`<div class="mst-popup-title">${cfg.popup.title}</div><div class="mst-popup-msg">${cfg.popup.msg}</div><div class="mst-popup-actions"><a class="mst-popup-cta" href="${cfg.masterPath}">${cfg.popup.cta}</a><button type="button" class="mst-popup-close">${cfg.popup.close}</button></div>`;
backdrop.appendChild(box); document.body.appendChild(backdrop);
function closeForever(){setCookie(cfg.dismissCookie,'1',cfg.dismissTtl); backdrop.remove();}
box.querySelector('.mst-popup-close').addEventListener('click',function(e){e.preventDefault();closeForever();});
backdrop.addEventListener('click',function(e){if(e.target===backdrop){closeForever();}});
var css=document.createElement('style'); css.textContent=`
#mst-popup-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;z-index:999999;}
#mst-popup-box{background:#fff;max-width:520px;width:90%;border-radius:14px;padding:22px 20px;box-shadow:0 10px 30px rgba(0,0,0,.2);font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Arial,sans-serif;}
.mst-popup-title{font-size:20px;font-weight:700;margin:0 0 8px;}
.mst-popup-msg{font-size:15px;margin:0 0 16px;}
.mst-popup-actions{display:flex;gap:10px;justify-content:flex-end;}
.mst-popup-cta{padding:10px 14px;border-radius:10px;text-decoration:none;background:var(--main);color:#fff;font-weight:600;}
.mst-popup-close{padding:10px 14px;border-radius:10px;border:1px solid #ddd;background:#f7f7f7;cursor:pointer;}
`; document.head.appendChild(css);
})();
JS
, 'after');
});
});

Este sería un ejemplo base de lo que tengo adaptado en esta web. Pero se puede hacer de cara a ofrecer diferentes precios, de cara a poner un banner o incluso de cara a artículos-productos recomendados al usuario.

Contingencia

Imagina que un día tu web tiene algún problema concreto. Los usuarios no pudieron enviar formularios de contacto, comprar cierto artículo, agendar una reunión o subscribirse a una newsletter.

Es posible que el usuario vuelva a la web después de la incidencia, pero a lo mejor piensa que dicha funcionalidad está rota y no lo vuelve a intentar.

Aquí es donde tendrías la posibilidad de jugar con las cookies inyectandole al usuario una cookie diaria.

El código para conseguir esto sería muy sencillo:

<?php
$cookie_name = 'sesion-' . date('d-m-y');
$cookie_value = 'activo';
$expiry_time = time() + (60 * 60 * 24 * 60);
setcookie($cookie_name, $cookie_value, [
'expires' => $expiry_time,
'path' => '/',
'samesite' => 'Lax'
]);

Ahora, podríamos generar este efecto si alguien que se metió el día en el que la web se encontraba con el problema que queramos imaginar:

El código:

<?php
if (!isset($_COOKIE['sesion-22-09-25'])) return;
?>
<div id="popup" style="position:fixed;top:0;left:0;right:0;bottom:0;
background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:9999;">
<div style="background:#fff;padding:20px;border-radius:8px;max-width:400px;text-align:center;">
<p>El 22/09/2025 hubo un problema de mantenimiento y no te pudiste suscribir.<br>¿Quieres hacerlo ahora?</p>
<button onclick="document.getElementById('popup').remove()">Cerrar</button>
</div>
</div>

De esta manera podemos ir cargando códigos dinámicos en función del día en el que entró el usuario.

Banner promocionado:

Geohat LLM

Conclusión

Es importante tener en cuenta de que las Cookies se pueden implementar por PHP y también por JS, por lo cual podemos insertar cookies por desplazamiento en el scroll o por interacción en algún elemento. Por ejemplo podemos ponerle cookies a los usuarios que les gusta clickar vídeos o diferenciar a los usuarios que hacen un tipo de click u otro para estudiarlos.

Se puede aplicar gamificación en tu propia web y hacerla mucho más interactiva combinando los lenguajes de programación con las propias cookies, mejorando no solo las analíticas dandote datos más concretos sino personalizando la web para que sea más agradable y útil para los usuarios.

Si te gusta este artículo, me ayudarías un montón compartiendo mi contenido:
No se te da mal el SEO Técnico

Te falta mi máster. Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB

¡Accede al Máster de SEO Técnico!
Tal vez te interesen otros artículos:
Artículos de SEO
Usamos cookies para asegurar que te damos la mejor experiencia en nuestra web. Aquí tienes nuestra política de Cookies.