[Monetización Web #2] Automatizar la Aprobación de Google AdSense en Sitios Estáticos: Solución al Error 404 de ads.txt e Integración de HeadTags

📌 Puntos Clave (TL;DR)
- El Problema: A diferencia de los CMS dinámicos (WordPress), los generadores de sitios estáticos (Docusaurus, Next.js SSG) en GitHub Pages suelen activar la alerta "Ingresos en riesgo: falta el archivo ads.txt" y fallar la verificación de propiedad debido a retrasos de hidratación y bloqueos del WAF.
- La Solución: Inyectar la etiqueta meta de verificación en
<head>medianteheadTagsen Docusaurus, ubicarads.txtenstatic/ads.txtpara despliegue en la raíz y configurar reglas de omisión en Cloudflare WAF paraGooglebot-AdsTxt.- El Resultado: 100% de accesibilidad para rastreadores, cero errores 404 en
/ads.txt, cumplimiento de requisitos de AdSense y puntuaciones Lighthouse superiores a 95.
1. El Desafío de AdSense en Sitios Estáticos
Migrar un blog técnico a un dominio personalizado (https://globaldevlog.com) abre la puerta a la monetización con Google AdSense. Sin embargo, los generadores de sitios estáticos (SSG) presentan particularidades arquitectónicas:
- Ausencia de Servidor y Plugins Dinámicos: No existen plugins como Site Kit que inyecten scripts dinámicamente; cada archivo debe configurarse en tiempo de compilación.
- Hidratación del Cliente vs. Inyección Estática: Los rastreadores de verificación inspeccionan el HTML estático sin ejecutar scripts complejos de React.
- La Trampa del Error 404 en
ads.txt: Si el rastreadorGooglebot-AdsTxtno puede leerhttps://tudominio.com/ads.txt, la monetización se bloquea.
2. Paso 1: Inyectar la Verificación de Propiedad en Docusaurus
Al registrar el dominio en la consola de AdSense (Sitios > Añadir sitio), Google solicita verificar la propiedad. En entornos estáticos, inyectar la etiqueta meta en headTags es la solución más limpia y eficiente.
📐 Configuración (docusaurus.config.ts)
import type {Config} from '@docusaurus/types';
const config: Config = {
title: 'Global Dev Blog',
url: 'https://globaldevlog.com',
baseUrl: '/',
// Etiqueta Meta de Verificación de Google AdSense
headTags: [
{
tagName: 'meta',
attributes: {
name: 'google-adsense-account',
content: 'ca-pub-XXXXXXXXXXXXXXXX', // Tu ID de editor de AdSense
},
},
],
// ... resto de tu configuración
};
export default config;
3. Paso 2: Despliegue de ads.txt en la Raíz
Para erradicar la alerta "Ingresos en riesgo: archivo ads.txt no encontrado", colocamos el archivo en el directorio estático de Docusaurus:
- Crear
static/ads.txt:google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0 - Desplegar en producción:
npm run deploy
- Verificar con
curl:Debe devolver un código de estadocurl -I https://globaldevlog.com/ads.txtHTTP/2 200concontent-type: text/plain.
4. Paso 3: Configuración de Seguridad en Cloudflare WAF
Si el dominio está bajo el proxy de Cloudflare, la protección contra bots podría bloquear accidentalmente a los rastreadores de Google.
flowchart LR
Bot["Rastreador Googlebot-AdsTxt"] --> Edge["Cloudflare Edge WAF"]
Edge -->|"Verifica User-Agent y ASN"| Rule{"Regla de Seguridad WAF"}
Rule -->|"Bot Fight Mode (Falso Positivo)"| Drop["403 Forbidden / Desafío"]
Rule -->|"Regla de Omisión"| Origin["GitHub Pages (/ads.txt)"]
Regla Personalizada en Cloudflare WAF
- Expresión:
(http.user_agent contains "Googlebot-AdsTxt") or (http.user_agent contains "Mediapartners-Google")
- Acción: Omitir (Skip) — Evita el control de bots y permite el acceso directo al archivo
ads.txt.
5. Lista de Verificación para Aprobación en el Primer Intento
| Pilar de Evaluación | Criterio Obligatorio | Consecuencia del Incumplimiento |
|---|---|---|
| 1. Páginas de Políticas | Páginas completas de /privacy-policy, /about y /contact | Violación de Políticas de Navegación |
| 2. Volumen de Contenido | Más de 20 artículos técnicos originales y extensos | Contenido de Poco Valor |
| 3. Cero Enlaces Rotos | Sin enlaces 404 ni etiquetas de anclaje rotas | Sitio no Disponible |
| 4. Diseño Responsivo | Visualización fluida en dispositivos móviles | Mala Usabilidad Móvil |
6. Conclusión y Próximos Pasos
Con la etiqueta meta en headTags, static/ads.txt en la raíz y las reglas de Cloudflare configuradas, tu sitio estático cumple todos los requisitos técnicos para la aprobación de AdSense.
- En el Episodio #3, analizaremos la indexación en motores de búsqueda: ¡Google Search Console, Naver Search Advisor y Bing Webmaster Tools con mapas de sitio en 6 idiomas!
📌 Artículos Relacionados en Global Dev Blog:
• Global Dev Blog - Dominio Personalizado en GitHub Pages y Cloudflare DNS
• Global Dev Blog - Seguridad en Sitios Estáticos y la Verdad de npm audit
• Visita el Inicio de Global Dev Blog (Disponible en 6 Idiomas)
