#seo #cookies #nextjs #lanzamiento
Checklist para lanzar una web: las 7 más importantes a revisar
Lucas Trubiano
14 de octubre de 2026
En esta guía (11)
Vi una lista corta de cosas que hay que dejar resueltas antes de lanzar un producto digital y me di cuenta de que a mi propio sitio le faltaban varias. Así que la usé como checklist, la amplié con lo que fui encontrando y la dejé escrita acá. El sitio está hecho con Next.js 14 (App Router), así que los ejemplos son de ahí, pero la lista aplica a cualquier stack.
Resumen
| # | Qué revisar | Para qué |
|---|---|---|
| 1 | App y web en dominios separados | Que rediseñar la web no toque el producto |
| 2 | Mails en subdominios separados | Que el spam de uno no arrastre a los otros |
| 3 | Sitemap en Search Console | Que Google encuentre y indexe tus páginas |
| 4 | robots.txt con el sitemap | Decirle a los crawlers qué rastrear y dónde está el mapa |
| 5 | Imagen Open Graph | Que el link compartido tenga preview |
| 6 | Analítica de eventos | Ver dónde se traba la gente |
| 7 | Analítica detrás del consentimiento | Cumplir la normativa de cookies |
1. La app y la web, cada una en su dominio
Si hay un producto con login, conviene que viva en app.tudominio.com y que la web pública esté en el dominio principal. Son dos cosas con ritmos distintos: la web se rediseña, se migra o se rompe sin que eso toque al producto. Además las cookies de sesión de la app quedan separadas de las del sitio público.
En mi caso no aplica: el sitio es de contenido y no tiene login. Si algún día hay una app, va en app.trubidata.com.
2. Los mails, en subdominios separados
La reputación de envío se mide por dominio. Si mandás todo desde el mismo, una newsletter marcada como spam puede arrastrar a los mails que el usuario necesita para entrar, como el de recuperar contraseña. La separación habitual es:
mail.tudominio.compara los mails transaccionales.newsletter.tudominio.compara marketing.- Un dominio aparte si hacés envío en frío, para que ese riesgo no toque al dominio principal.
Cada subdominio lleva sus propios SPF, DKIM y DMARC. Mi sitio hoy no manda mails (los botones de contacto abren WhatsApp), así que no aplica; si sumo una newsletter, va en su subdominio.
3. Sitemap y Search Console
El sitemap es la lista de páginas públicas que querés que Google indexe. En Next.js se genera con un archivo app/sitemap.ts:
import type { MetadataRoute } from 'next';
import { getWikiPosts } from '@/lib/wiki';
const BASE_URL = 'https://www.tudominio.com';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getWikiPosts('es');
return [
{ url: `${BASE_URL}/es`, changeFrequency: 'weekly' },
...posts.map((post) => ({
url: `${BASE_URL}/es/wiki/${post.slug}`,
lastModified: new Date(post.date),
})),
];
}
Dos cuidados: incluir solo páginas públicas (nada de borradores ni rutas internas) y no olvidarse de las URLs por idioma si el sitio es bilingüe. El mío termina con 54 URLs.
Después hay que verificar el dominio en Google Search Console. La opción más robusta es "propiedad de dominio" con un registro DNS TXT. Yo lo hice en Hostinger, donde tengo el DNS, y quedó verificado el 14/10/2026. Falta un paso: enviar sitemap.xml en Search Console, que hago cuando el sitio esté en producción.
4. robots.txt que apunte al sitemap
Es el primer archivo que piden los buscadores. En Next.js sale de app/robots.ts:
import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
return {
rules: { userAgent: '*', allow: '/' },
sitemap: 'https://www.tudominio.com/sitemap.xml',
};
}
La línea sitemap hace que el mapa no dependa de que alguien lo envíe a mano. Si hay rutas que no querés que se rastreen, se agregan en disallow.
5. Imagen Open Graph
Cuando alguien comparte tu link en WhatsApp, LinkedIn o X, la red busca una imagen en las etiquetas Open Graph. Si no la encuentra, el link sale como un cuadro gris o sin preview, y eso se nota en cuánta gente lo abre.
En Next.js alcanza con un archivo opengraph-image.tsx (o un opengraph-image.png estático) dentro del segmento de ruta. Se genera con ImageResponse, el tamaño recomendado es 1200x630, y conviene tener una distinta para el sitio, las guías y los cursos, además de title y description propios en generateMetadata. Después probás el link en el depurador de cada red, porque cachean agresivamente. En mi sitio hay una para la home, otra por guía y otra por curso.
6. Analítica de eventos
Contar visitas no alcanza. Lo útil es saber qué hace la gente: qué botón toca, qué video reproduce, hasta qué lección de un curso llega. Con eso se ve dónde se traba el recorrido.
En mi sitio uso Google Analytics 4 con @next/third-parties y un helper propio para eventos: cta_click, video_play, code_copy, course_start, lesson_view y course_complete. Solo corre en producción, para que mis pruebas locales no ensucien los datos. Me falta sumar Microsoft Clarity para tener mapas de calor, y va a ir detrás del mismo consentimiento del punto siguiente.
7. La analítica no carga hasta que el usuario acepta
Es el punto que más me hizo cambiar de idea. En España, usar cookies sin informar ni obtener consentimiento (art. 22.2 de la LSSI) es una infracción leve (art. 38.4.g) con multa de hasta 30.000 euros (art. 39); si hay reincidencia dentro de los 3 años pasa a grave, de 30.001 a 150.000 euros. Está en las resoluciones de la AEPD, el regulador español de protección de datos.
El caso que mejor lo ilustra es Vueling: la AEPD la multó con 30.000 euros porque su banner no ofrecía ninguna herramienta para rechazar o gestionar cookies (solo decía que configures el navegador) y tomaba "seguir navegando" como consentimiento. La multa quedó en 18.000 euros por reconocimiento y pago voluntario.
El criterio que la AEPD publica en su guía de cookies es claro en dos cosas: rechazar tiene que estar en la primera capa del banner, con el mismo nivel que aceptar, y no puede haber rastreo antes del consentimiento. No tengo cifras sobre cuántos expedientes se abren ni cómo se detectan; lo que sí sé es que las reclamaciones de usuarios los disparan.
En código, la idea es que el script de analítica no exista en la página hasta que haya un "sí". Un componente cliente guarda la decisión y recién ahí monta GA:
'use client';
import { useEffect, useState } from 'react';
import { GoogleAnalytics } from '@next/third-parties/google';
type Consent = 'accepted' | 'rejected' | null;
export function AnalyticsGate({ gaId }: { gaId: string }) {
const [consent, setConsent] = useState<Consent>(null);
useEffect(() => {
const saved = localStorage.getItem('analytics-consent') as Consent;
if (saved) setConsent(saved);
}, []);
const decide = (value: Exclude<Consent, null>) => {
localStorage.setItem('analytics-consent', value);
setConsent(value);
};
return (
<>
{consent === 'accepted' && <GoogleAnalytics gaId={gaId} />}
{consent === null && (
<div role="dialog" aria-label="Cookies">
<p>Uso cookies de analítica para entender qué contenido sirve.</p>
<button onClick={() => decide('accepted')}>Aceptar</button>
<button onClick={() => decide('rejected')}>Rechazar</button>
</div>
)}
</>
);
}
Los dos botones tienen que pesar lo mismo visualmente. Es un esbozo de la idea, no un componente listo para pegar: falta, por ejemplo, un enlace a la política de cookies y una forma de cambiar la decisión después. En mi sitio el banner tiene Aceptar y Rechazar del mismo peso, la analítica no carga hasta aceptar y un link "Cookies" en el pie permite cambiar la decisión.
Otras cosas que sumé a la lista
- Apex a
wwwcon HTTPS válido: quehttps://tudominio.comredirija awwwcon un certificado que cubra los dos. A mí se me rompió por un registro DNS sobrante del hosting de dominios. - Staging fuera del índice: los entornos de prueba no deberían indexarse.
- Título y descripción propios en cada página: sin títulos repetidos.
- Una página 404 propia: con salida al inicio, en vez de la genérica.
- Favicon y páginas legales: privacidad y términos enlazados en el pie.
Cómo lo uso
Dejé la lista en el repo del sitio como checklist reutilizable, con el estado de cada punto. Antes de publicar algo nuevo la recorro de arriba abajo; lleva diez minutos y evita descubrir los problemas después, con el sitio ya en producción.