TTFB: Por qué el tiempo hasta el primer byte (Time To First Byte) es importante tanto para el SEO como para los LLM

El tiempo hasta el primer byte (TTFB, por sus siglas en inglés) es una de las métricas de rendimiento web más críticas y, a la vez, más ignoradas. Mientras que la mayoría de la gente se centra en el tiempo de carga de la página o en la renderización visual, el TTFB es el primer indicador de la capacidad de respuesta de tu sitio, y eso es importante tanto para los motores de búsqueda como para los rastreadores de IA. Un TTFB lento puede hacer que los sistemas de IA rastreen menos páginas, den menos prioridad a tu contenido o dejen de rastrear tu sitio por completo. Esta guía explica qué es el TTFB, por qué es importante y cómo optimizarlo.

TTFB: por qué el tiempo hasta el primer byte es importante tanto para el SEO como para los LLM

Publicado el

Autor

Jakob Langemark

Síguenos

TTFB: Por qué el tiempo hasta el primer byte es importante tanto para el SEO como para los LLM

El tiempo hasta el primer byte (TTFB) es una de las métricas de rendimiento más críticas y, a la vez, más ignoradas en los sitios web. Mientras que la mayoría se centra en el tiempo de carga de la página o en el renderizado visual, el TTFB es el primer indicador de la capacidad de respuesta de tu sitio, y esto es crucial tanto para los motores de búsqueda como para los rastreadores de IA. Un TTFB lento puede hacer que los sistemas de IA rastreen menos páginas, prioricen menos tu contenido o dejen de rastrear tu sitio por completo. Esta guía explica qué es el TTFB, por qué es importante y cómo optimizarlo.

¿Qué es el TTFB?

El tiempo hasta el primer byte (TTFB) es el tiempo que transcurre desde que un navegador o rastreador envía una solicitud HTTP hasta que recibe el primer byte de datos del servidor.

Componentes del TTFB:

  1. Búsqueda de DNS: tiempo para traducir el nombre de dominio a una dirección IP

  2. Tiempo de conexión: tiempo para establecer la conexión TCP

  3. Apretón de manos SSL/TLS: tiempo para establecer una conexión HTTPS (si aplica)

  4. Tiempo de procesamiento del servidor: tiempo que tarda el servidor en generar la respuesta

  5. Latencia de red: tiempo que tarda el primer byte en viajar de vuelta

Fórmula:

TTFB frente a otras métricas

El TTFB mide la capacidad de respuesta del servidor antes de que se envíe cualquier contenido.

El FCP (First Contentful Paint) mide cuándo se renderiza el primer contenido visual.

El LCP (Largest Contentful Paint) mide cuándo se carga el elemento principal.

El TTFB ocurre primero: es la base de todas las demás métricas de carga.

Por qué el TTFB es importante para los rastreadores de IA

1. Presupuesto de rastreo (Crawl budget)

Los rastreadores de IA (y los motores de búsqueda) tienen un tiempo limitado por sitio. Si tu TTFB es lento, rastrearán menos páginas antes de que se agote su presupuesto de tiempo.

Ejemplo:

  • Sitio A: TTFB = 200 ms → El rastreador logra rastrear 500 páginas en 5 minutos

  • Sitio B: TTFB = 2000 ms → El rastreador solo logra rastrear 150 páginas en 5 minutos

El Sitio A obtiene el triple de cobertura de rastreo.

2. Priorización del rastreo

Los rastreadores priorizan los sitios rápidos. Si tu TTFB es lento constantemente, los rastreadores:

  • Regresarán con menor frecuencia

  • Rastrearán menos páginas por visita

  • Priorizarán los sitios de la competencia

3. Calidad de los datos

Un TTFB prolongado puede provocar tiempos de espera agotados (timeouts). La IA obtiene datos incompletos o desiste por completo.

Recomendaciones de Google:

  • Buen TTFB: < 600 ms

  • TTFB aceptable: 600 ms - 1200 ms

  • Mal TTFB: > 1200 ms

Lo mismo se aplica a los rastreadores de IA.

Por qué el TTFB también es importante para el SEO

Google ha confirmado que el TTFB es un factor de posicionamiento indirecto a través de las Core Web Vitals (ya que afecta al LCP).

Impacto:

  • TTFB lento → LCP lento → Peor posicionamiento

  • TTFB rápido → LCP rápido → Mejor posicionamiento

Mide tu TTFB actual

DevTools del navegador (Chrome)

  1. Abre las DevTools de Chrome (F12)

  2. Ve a la pestaña Network (Red)

  3. Actualiza la página

  4. Haz clic en la primera solicitud (normalmente tu documento HTML)

  5. Consulta la pestaña Timing (Tiempos)

Verás algo como esto:




PageSpeed Insights

  1. Entra en https://pagespeed.web.dev/

  2. Introduce tu URL

  3. Busca "Tiempo de respuesta del servidor" en la sección de diagnósticos

WebPageTest

  1. Entra en https://www.webpagetest.org/

  2. Introduce tu URL y selecciona la ubicación de la prueba

  3. Busca "Time to First Byte" en los resultados

WebPageTest también muestra:

  • El TTFB por solicitud (no solo para el primer HTML)

  • El desglose de DNS, conexión, SSL y tiempo de espera

Prueba de línea de comandos con curl

# Medir TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConexión: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Salida:
# DNS: 0.015s
# Conexión: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Medir TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConexión: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Salida:
# DNS: 0.015s
# Conexión: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Medir TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConexión: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Salida:
# DNS: 0.015s
# Conexión: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s

Script de Python para pruebas masivas

import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir a milisegundos

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir a milisegundos

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def measure_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Convertir a milisegundos

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = measure_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")

Identifica qué ralentiza tu TTFB

El TTFB se divide en varios componentes. Identifica los cuellos de botella:

1. Búsqueda de DNS (debería ser < 20 ms)

Problema: Servidor de resolución de DNS lento.

Prueba:

Solución:

  • Utiliza un proveedor de DNS rápido (Cloudflare DNS, Google DNS)

  • Habilita la precarga de DNS (DNS prefetching):

<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">

2. Tiempo de conexión (debería ser < 50 ms)

Problema: Distancia geográfica con el servidor o red lenta.

Solución:

  • Utiliza una red de entrega de contenido (CDN) para estar más cerca de los usuarios y rastreadores

  • Reduce el número de conexiones (HTTP/2 ayuda en esto)

3. Apretón de manos SSL/TLS (debería ser < 100 ms)

Problema: Negociación SSL lenta.

Prueba:

openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www

Solución:

  • Habilita TLS 1.3 (apretón de manos más rápido)

  • Utiliza el grapado OCSP (OCSP stapling)

  • Habilita HTTP/2 o HTTP/3

4. Tiempo de procesamiento del servidor (debería ser < 200 ms)

Problema: Consultas de base de datos o backend lentos.

Este suele ser el cuello de botella más importante.

Identificación:

  • Revisa los registros del servidor para detectar solicitudes lentas

  • Utiliza herramientas APM (New Relic, Datadog)

  • Analiza el rendimiento de las consultas a la base de datos

Optimiza el tiempo de procesamiento del servidor

Aquí es donde conseguirás el mayor impacto.

1. Implementa almacenamiento en caché

Caché en el lado del servidor:

Utiliza Redis o Memcached para almacenar en caché los resultados de la base de datos.

Ejemplo (PHP con Redis):

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Los datos no están en caché, se obtienen de la base de datos
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Almacenar en caché durante 1 hora
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Los datos no están en caché, se obtienen de la base de datos
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Almacenar en caché durante 1 hora
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Los datos no están en caché, se obtienen de la base de datos
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Almacenar en caché durante 1 hora
} else {
    $data = unserialize($data);
}

echo json_encode($data);

Almacenamiento en caché de página completa:

Almacena en caché respuestas HTML completas.

Ejemplo con Nginx:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

2. Optimiza las consultas a la base de datos

Problema: Consultas N+1 o consultas sin indexar.

Identificar consultas lentas (MySQL):

-- Habilitar el registro de consultas lentas
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Consultas de más de 1 segundo

-- Ver consultas lentas
SELECT * FROM

-- Habilitar el registro de consultas lentas
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Consultas de más de 1 segundo

-- Ver consultas lentas
SELECT * FROM

-- Habilitar el registro de consultas lentas
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Consultas de más de 1 segundo

-- Ver consultas lentas
SELECT * FROM

Soluciones:

  • Añadir índices:

-- Antes: Escaneo completo de la tabla
SELECT * FROM products WHERE category = 'electronics';

-- Después: Crear índice
CREATE INDEX idx_category ON products(category)

-- Antes: Escaneo completo de la tabla
SELECT * FROM products WHERE category = 'electronics';

-- Después: Crear índice
CREATE INDEX idx_category ON products(category)

-- Antes: Escaneo completo de la tabla
SELECT * FROM products WHERE category = 'electronics';

-- Después: Crear índice
CREATE INDEX idx_category ON products(category)

  • Utilizar caché de consultas:

-- Habilitar la caché de consultas (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

-- Habilitar la caché de consultas (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

-- Habilitar la caché de consultas (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

  • Optimizar los JOINs:

-- Mal: Múltiples JOINs sin índices adecuados
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bien: Añadir índices compuestos
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Mal: Múltiples JOINs sin índices adecuados
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bien: Añadir índices compuestos
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Mal: Múltiples JOINs sin índices adecuados
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Bien: Añadir índices compuestos
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

3. Ampliar los recursos del servidor

Comprobar la carga del servidor:

top
# Ver el uso de CPU y memoria

htop
# Alternativa más intuitiva
top
# Ver el uso de CPU y memoria

htop
# Alternativa más intuitiva
top
# Ver el uso de CPU y memoria

htop
# Alternativa más intuitiva

Si es constantemente alta (> 80% de CPU):

  • Mejora la CPU

  • Añade más memoria RAM

  • Utiliza balanceo de carga

4. Utiliza una CDN

Las redes de entrega de contenido almacenan en caché el contenido en ubicaciones geográficamente cercanas a los usuarios o rastreadores.

CDNs populares:

  • Cloudflare: cuenta con un plan gratuito excelente para sitios pequeños y medianos

  • AWS CloudFront: altamente escalable

  • Fastly: gran rendimiento, con un enfoque más técnico

  • BunnyCDN: muy económica

Cómo mejora la CDN el TTFB:

Sin CDN:

  • Un usuario en EE. UU. solicita un sitio alojado en Europa

  • TTFB = 500 ms (200 ms de latencia de red + 300 ms de procesamiento del servidor)

Con CDN:

  • El usuario en EE. UU. hace la solicitud → Servidor periférico (edge) de la CDN en EE. UU.

  • TTFB = 150 ms (20 ms de latencia de red + 130 ms de acierto en caché)

5. Habilita la compresión Gzip o Brotli

La compresión reduce el tamaño de la respuesta, lo que acelera el tiempo de transferencia.

Configuración en Nginx:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Aún mejor: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Aún mejor: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Aún mejor: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

Configuración en Apache:

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

6. Reduce el procesamiento en el servidor

Minimiza:

  • Cálculos pesados en cada solicitud

  • Llamadas a APIs externas

  • Operaciones de E/S de archivos

Ejemplo (Python Flask):

from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mal: Llamada a API externa en cada solicitud
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bien: Almacenar en caché la llamada a la API externa
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mal: Llamada a API externa en cada solicitud
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bien: Almacenar en caché la llamada a la API externa
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Mal: Llamada a API externa en cada solicitud
@app.route('/weather')
def weather_bad():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Bien: Almacenar en caché la llamada a la API externa
@lru_cache(maxsize=128)
def fetch_weather_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def weather_good():
    data = fetch_weather_cached()
    return render_template('weather.html', data=data)

7. Utiliza HTTP/2 o HTTP/3

HTTP/2 permite la multiplexación, lo que reduce la sobrecarga de la conexión.

Habilitar HTTP/2 (Nginx):

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resto de la configuración

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resto de la configuración

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resto de la configuración

Comprobar si HTTP/2 está habilitado:

curl -I --http2 https://ditwebsite.dk/
# Busca "HTTP/2 200" en la respuesta
curl -I --http2 https://ditwebsite.dk/
# Busca "HTTP/2 200" en la respuesta
curl -I --http2 https://ditwebsite.dk/
# Busca "HTTP/2 200" en la respuesta

Optimiza específicamente para los rastreadores de IA

1. Prioriza las páginas clave

Asegúrate de que tus páginas más importantes (página de inicio, productos principales, artículos destacados) tengan el TTFB más rápido.

Nginx: Caché independiente para páginas clave:

location = / {
    proxy_cache_valid 200 120m;  # Cachear página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cachear productos por 1 hora
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cachear página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cachear productos por 1 hora
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cachear página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cachear productos por 1 hora
    proxy_pass http

2. Detecta los rastreadores y optimiza para ellos

Sirve una versión en caché a los rastreadores:

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir HTML estático en caché
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir contenido dinámico
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir HTML estático en caché
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir contenido dinámico
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servir HTML estático en caché
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servir contenido dinámico
    include('dynamic_page.php');
}

3. Prepara la caché antes de las visitas del rastreador

Si sabes cuándo suelen pasar los rastreadores (por ejemplo, después de enviar un mapa del sitio), puedes precalentar (pre-warm) la caché:

#!/bin/bash
# Calentar la caché solicitando todas las URLs
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Calentar la caché solicitando todas las URLs
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Calentar la caché solicitando todas las URLs
while read url; do
  curl -s "$url" > /dev/null
done

Monitorea el TTFB de forma continua

Configura un monitoreo automatizado

Pingdom:

  1. Crea una cuenta en pingdom.com

  2. Añade comprobaciones de URL

  3. Define un umbral de alerta (por ejemplo, "alerta si el TTFB es > 800 ms")

UptimeRobot:

  1. Monitoreo gratuito cada 5 minutos

  2. Alertas por correo electrónico

Script personalizado (tarea programada cron):

#!/bin/bash
# Comprobar TTFB y alertar si es > 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB demasiado alto: ${TTFB_MS}ms" | mail -s "Alerta de TTFB" admin@ditwebsite.dk
fi
#!/bin/bash
# Comprobar TTFB y alertar si es > 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB demasiado alto: ${TTFB_MS}ms" | mail -s "Alerta de TTFB" admin@ditwebsite.dk
fi
#!/bin/bash
# Comprobar TTFB y alertar si es > 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB demasiado alto: ${TTFB_MS}ms" | mail -s "Alerta de TTFB" admin@ditwebsite.dk
fi

Ejecutar cada hora:

crontab -e
# Añadir:
0

crontab -e
# Añadir:
0

crontab -e
# Añadir:
0

Objetivos de TTFB

Recomendaciones de Google

  • Bueno: < 600 ms

  • Necesita mejorar: 600 ms - 1200 ms

  • Deficiente: > 1200 ms

Para rastreadores de IA (recomendaciones)

  • Excelente: < 300 ms (obtiene la máxima prioridad de rastreo)

  • Bueno: 300 ms - 600 ms (tasa de rastreo normal)

  • Aceptable: 600 ms - 1000 ms (tasa de rastreo reducida)

  • Deficiente: > 1000 ms (riesgo de rastreos incompletos)

Problemas comunes de TTFB y sus soluciones

Problema

Síntoma

Solución

Sin almacenamiento en caché

TTFB > 1000 ms en todas las solicitudes

Implementar Redis/Memcached

Base de datos lenta

TTFB alto en páginas dinámicas

Añadir índices, optimizar consultas

Sin CDN

TTFB elevado para el tráfico internacional

Habilitar Cloudflare o AWS CloudFront

Sobrecarga del servidor

Picos de TTFB durante picos de tráfico

Escalar el servidor o añadir balanceo de carga

Código no optimizado

TTFB inconsistente

Analizar el código, eliminar cuellos de botella

Llamadas a APIs externas

TTFB alto y muy variable

Cachear respuestas de APIs, usar llamadas asíncronas

Lista de verificación de implementación

Utiliza esta lista de control para mejorar tu TTFB:

  1. Mide el TTFB base: utiliza PageSpeed Insights o WebPageTest

  2. Identifica el cuello de botella: ¿es DNS, la conexión, SSL o el procesamiento del servidor?

  3. Implementa caché en el servidor: Redis/Memcached para los resultados de la base de datos

  4. Habilita caché de página completa: para páginas estáticas o semiestáticas

  5. Optimiza las consultas de bases de datos: añade índices, elimina consultas N+1

  6. Habilita Gzip/Brotli: comprime las respuestas

  7. Utiliza una CDN: Cloudflare, AWS CloudFront o BunnyCDN

  8. Habilita HTTP/2: reduce la sobrecarga de conexión

  9. Monitorea el TTFB: configura Pingdom o un sistema de alertas personalizado

  10. Prueba con curl: verifica que haya mejoras reales

Conclusión

El TTFB es una métrica crucial tanto para el SEO como para la visibilidad en sistemas de IA. Un TTFB lento se traduce en menos páginas rastreadas, menor prioridad y la posibilidad de que los sistemas de IA recopilen datos incompletos. La mayoría de los sitios web pueden mejorar significativamente su TTFB mediante el almacenamiento en caché (tanto en el servidor como de página completa), la optimización de bases de datos y el uso de una CDN.

Comienza por medir tu TTFB actual, identifica el cuello de botella principal (que suele ser el procesamiento del servidor) e implementa almacenamiento en caché. En la mayoría de los sitios es viable bajar de los 600 ms con una optimización básica, y situarse por debajo de los 300 ms utilizando una CDN y una estrategia agresiva de caché.

Recuerda: el TTFB es la base; todas las demás métricas de rendimiento dependen de él. Optimiza primero el TTFB, y después el FCP y el LCP.