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, por sus siglas en inglés) es una de las métricas de rendimiento más críticas y, a la vez, más pasadas por alto para los sitios web. Mientras 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 su sitio, y eso importa tanto para los motores de búsqueda como para los rastreadores de IA. Un TTFB lento puede significar que los sistemas de IA rastreen menos páginas, prioricen su contenido más abajo o desistan por completo de rastrear su sitio. 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/rastreador envía una solicitud HTTP hasta que recibe el primer byte de datos desde el servidor.

Componentes del TTFB:

  1. Búsqueda 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 (handshake) SSL/TLS — Tiempo para establecer la conexión HTTPS (si corresponde)

  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 regreso

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 para todas las demás métricas de carga.

Por qué el TTFB importa para los rastreadores de IA

1. Presupuestos de rastreo (Crawl budgets)

Los rastreadores de IA (y los motores de búsqueda) tienen un tiempo limitado por sitio. Si su 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 3 veces más cobertura de rastreo.

2. Priorización de rastreo

Los rastreadores priorizan los sitios rápidos. Si su TTFB es constantemente lento, 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.

Directrices 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 importa para el SEO

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

Impacto:

  • TTFB lento → LCP lento → Peor posicionamiento

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

Mida su TTFB actual

Herramientas para desarrolladores del navegador (Chrome DevTools)

  1. Abra Chrome DevTools (F12)

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

  3. Actualice la página

  4. Haga clic en la primera solicitud (normalmente su documento HTML)

  5. Consulte la pestaña Timing (Tiempo)

Verá algo como esto:




PageSpeed Insights

  1. Vaya a https://pagespeed.web.dev/

  2. Introduzca su URL

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

WebPageTest

  1. Vaya a https://www.webpagetest.org/

  2. Introduzca su URL y seleccione la ubicación de la prueba

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

WebPageTest también muestra:

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

  • Desglose de DNS, Conexión, SSL y Espera

Prueba en 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/

# Resultado:
# 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/

# Resultado:
# 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/

# Resultado:
# 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 medir_ttfb(url):
    inicio = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - inicio
    return ttfb * 1000  # Convertir a milisegundos

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

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

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

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

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

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

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

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

Identifique qué hace que su TTFB sea lento

El TTFB se desglosa en varios componentes. Identifique los cuellos de botella:

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

Problema: Resolutor de DNS lento.

Prueba:

Solución:

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

  • Habilite la prebúsqueda 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:

  • Utilice una red de distribución de contenido (CDN) para estar más cerca de los usuarios/rastreadores

  • Reduzca el número de conexiones (HTTP/2 ayuda)

3. Handshake 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:

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

  • Utilice el grapado OCSP (OCSP stapling)

  • Habilite HTTP/2 o HTTP/3

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

Problema: Consultas lentas a la base de datos o en el backend.

Este suele ser el mayor cuello de botella.

Identificación:

  • Revise los registros del servidor en busca de solicitudes lentas

  • Utilice herramientas APM (New Relic, Datadog)

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

Optimice el tiempo de procesamiento del servidor

Aquí es donde obtendrá el mayor impacto.

1. Implemente el almacenamiento en caché

Caché en el lado del servidor:

Utilice 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));  // Caché por 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));  // Caché por 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));  // Caché por 1 hora
} else {
    $data = unserialize($data);
}

echo json_encode($data);

Caché de página completa (Full-page caching):

Almacene en caché respuestas HTML completas.

Ejemplo en 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. Optimice las consultas a la base de datos

Problema: Consultas N+1 o consultas sin indexar.

Identificación de 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 tabla
SELECT * FROM products WHERE category = 'electronics';

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

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

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

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

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

  • Utilizar el almacenamiento en 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 combinaciones (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 combinaciones (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 combinaciones (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. Actualice los recursos del servidor

Compruebe la carga del servidor:

top
# Ver el uso de CPU y de memoria

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

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

htop
# Alternativa más intuitiva para el usuario

Si es constantemente alta (>80% CPU):

  • Mejore la CPU

  • Añada más memoria RAM

  • Utilice balanceo de carga

4. Utilice una CDN

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

CDNs populares:

  • Cloudflare — Ofrece un plan gratuito, excelente para sitios pequeños y medianos

  • AWS CloudFront — Altamente escalable

  • Fastly — Gran rendimiento, más técnico

  • BunnyCDN — Económico

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 de servidor)

Con CDN:

  • El usuario en EE. UU. realiza 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. Habilite la compresión Gzip/Brotli

La compresión reduce el tamaño de la respuesta, acelerando 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. Reduzca el procesamiento en el lado del servidor

Minimice:

  • Los cálculos pesados en cada solicitud

  • Las llamadas a APIs externas

  • Las operaciones de E/S de archivos (File I/O)

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. Utilice HTTP/2 o HTTP/3

HTTP/2 permite la multiplexación, reduciendo 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/
# Busque "HTTP/2 200" en la respuesta
curl -I --http2 https://ditwebsite.dk/
# Busque "HTTP/2 200" en la respuesta
curl -I --http2 https://ditwebsite.dk/
# Busque "HTTP/2 200" en la respuesta

Optimice específicamente para rastreadores de IA

1. Priorice las páginas importantes

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

Nginx: Caché separada para páginas clave:

location = / {
    proxy_cache_valid 200 120m;  # Guardar en caché la página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Guardar en caché los productos por 1 hora
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Guardar en caché la página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Guardar en caché los productos por 1 hora
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Guardar en caché la página de inicio por 2 horas
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Guardar en caché los productos por 1 hora
    proxy_pass http

2. Detecte y optimice para rastreadores

Ofrezca 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. Prepare la caché antes de las visitas de los rastreadores

Si sabe cuándo le visitan los rastreadores (por ejemplo, después de enviar un sitemap), prepare previamente la caché (pre-warm):

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

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

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

Monitoree el TTFB de forma continua

Configure la monitorización automatizada

Pingdom:

  1. Cree una cuenta en pingdom.com

  2. Añada comprobaciones de URL

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

UptimeRobot:

  1. Monitorización gratuita cada 5 minutos

  2. Alertas por correo electrónico

Script personalizado (tarea cron):

#!/bin/bash
# Comprobar el 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 el 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 el 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 mayor prioridad de rastreo)

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

  • Aceptable: 600 ms - 1000 ms (menor frecuencia de rastreo)

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

Problemas comunes de TTFB y 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 alto para 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 variable

Guardar en caché las respuestas de la API, usar llamadas asíncronas

Lista de verificación para la implementación

Utilice esta lista de verificación para mejorar el TTFB:

  1. Medir el TTFB de referencia — Utilice PageSpeed Insights o WebPageTest

  2. Identificar el cuello de botella — ¿DNS, conexión, SSL o procesamiento del servidor?

  3. Implementar almacenamiento en caché del lado del servidor — Redis/Memcached para resultados de bases de datos

  4. Habilitar caché de página completa — Para páginas estáticas o semiestáticas

  5. Optimizar las consultas a la base de datos — Añadir índices, eliminar consultas N+1

  6. Habilitar Gzip/Brotli — Comprimir las respuestas

  7. Utilizar CDN — Cloudflare, AWS CloudFront o BunnyCDN

  8. Habilitar HTTP/2 — Reducir la sobrecarga de la conexión

  9. Monitorear el TTFB — Configurar Pingdom o una monitorización personalizada

  10. Probar con curl — Verificar las mejoras

Conclusión

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

Comience por medir su TTFB actual, identifique el mayor cuello de botella (normalmente el procesamiento del servidor) e implemente almacenamiento en caché. Para la mayoría de los sitios, es posible bajar de 600 ms con una optimización básica, y de 300 ms utilizando una CDN y un almacenamiento en caché agresivo.

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