Introdução

Quando seu blog começa a ganhar leitores, surgem três necessidades naturais:

NecessidadeFerramenta Google
Saber quantas pessoas visitam e de onde vêmGoogle Analytics 4
Aparecer no Google e ser indexado corretamenteGoogle Search Console
Gerar receita sem invadir a experiência do leitorGoogle AdSense

As três ferramentas compartilham a mesma conta Google e se complementam. Este guia cobre as três do zero — da criação da conta à integração real com Hugo + PaperMod — incluindo os arquivos exatos que precisam ser criados ou editados.

Diagrama mostrando o blog Hugo conectado ao Google Search Console, Google Analytics e Google AdSense

Pré-requisitos

Antes de começar, confirme que você tem:

  • Blog Hugo publicado em domínio próprio (https://seudominio.com.br) com HTTPS ativo
  • Tema PaperMod instalado (qualquer versão recente)
  • Conta Google (Gmail serve)
  • Pelo menos algumas páginas publicadas (o Google rejeita sites vazios)
  • enableRobotsTXT = true no hugo.toml ✅ (este blog já tem)

Estrutura de arquivos relevante para este tutorial:

1
2
3
4
5
6
7
8
blog/
├── hugo.toml                        ← configuração principal
├── config/
│   └── development/
│       └── hugo.toml                ← overrides para ambiente de desenvolvimento
└── layouts/
    └── partials/
        └── extend_head.html         ← arquivo que vamos CRIAR</p>

Parte 1 — Google Search Console (indexação e SEO)

O Search Console diz ao Google que seu site existe, quais páginas indexar e fornece relatórios de desempenho orgânico: cliques, impressões, posição média para cada palavra-chave.

Passo 1.1 — Criar a propriedade no Search Console

  1. Acesse search.google.com/search-console e clique em “Adicionar propriedade”.
  2. Escolha “Prefixo de URL” e informe https://seudominio.com.br (com HTTPS, sem barra no final).
  3. Na tela de verificação, selecione o método “Tag HTML”.
    O console exibirá algo como:
    1
    
    <meta name="google-site-verification" content="AbCdEfGhIjKlMnOpQrStUvWxYz1234567" />
    
  4. Copie apenas o valor do content — no exemplo acima: AbCdEfGhIjKlMnOpQrStUvWxYz1234567.
    Não clique em “Verificar” ainda (o site precisa estar publicado com a tag primeiro).

Passo 1.2 — Adicionar a verificação ao hugo.toml

Abra hugo.toml na raiz do projeto e, dentro do bloco [params] existente, adicione a linha:

1
2
3
# Google Search Console — verificação da propriedade
[params.analytics.google]
  SiteVerificationTag = "AbCdEfGhIjKlMnOpQrStUvWxYz1234567"

O PaperMod renderiza automaticamente essa meta-tag no <head> de todas as páginas.

Como verificar que a tag foi inserida: publique o blog, abra qualquer página no browser, pressione Ctrl+U para ver o código-fonte e procure por google-site-verification. Ela deve aparecer dentro do <head>.

Passo 1.3 — Verificar a propriedade

  1. Volte ao Search Console e clique em “Verificar”.
  2. O status deverá mudar para “Verificado” ✅.
  3. Se falhar, aguarde alguns minutos (o cache do CDN pode atrasar a atualização) e tente novamente.

Passo 1.4 — Enviar o sitemap

O Hugo gera sitemap.xml automaticamente na raiz de public/. Precisamos informar ao Google:

  1. No painel do Search Console, vá em Índice → Sitemaps.
  2. No campo “Adicionar novo sitemap”, digite sitemap.xml e clique Enviar.
  3. Aguarde; após processamento, o status muda para “Sucesso” e exibe a contagem de URLs encontradas.

Este blog já tem enableRobotsTXT = true no hugo.toml, então o Google também receberá um robots.txt correto automaticamente. Confirme em https://seudominio.com.br/robots.txt que não há Disallow: /.

Passo 1.5 — Verificar a indexação de páginas individuais

Após alguns dias, use a Inspeção de URL (ícone de lupa no topo do Search Console):

  1. Cole a URL completa de qualquer artigo.
  2. Se aparecer “URL não está no Google”, clique em “Solicitar indexação”.
  3. O Google coloca a URL na fila de rastreamento — normalmente aparece indexada em 24–72 horas.

Parte 2 — Google Analytics 4 (estatísticas de visitas)

O GA4 registra sessões, usuários únicos, páginas mais visitadas, origem do tráfego, dispositivos, duração de sessão e muito mais.

Passo 2.1 — Criar a conta e a propriedade GA4

  1. Acesse analytics.google.com“Começar a medir”.
  2. Preencha o nome da conta (ex.: Blog zocate.li).
  3. Crie a Propriedade:
    • Nome: nome do seu blog
    • Fuso horário: (GMT-03:00) Horário de Brasília
    • Moeda: Real Brasileiro (BRL)
  4. Em Plataforma, selecione Web.
  5. Informe a URL do site e o nome do stream de dados (ex.: zocate.li).
  6. Anote o ID de medição no formato G-XXXXXXXXXX — você vai precisar dele no próximo passo.

Passo 2.2 — Integrar o GA4 ao Hugo

O Hugo possui suporte nativo ao Google Analytics via o bloco [services]. O PaperMod lê automaticamente essa configuração, portanto basta adicionar ao hugo.toml:

1
2
3
# ── Google Analytics 4 ──────────────────────────────────────────────────────
[services.googleAnalytics]
  ID = "G-XXXXXXXXXX"   # substitua pelo seu ID de medição

Onde colocar: fora do bloco [params], no nível raiz do hugo.toml. Veja o exemplo completo na Parte 4.

Como o PaperMod controla quando o script é carregado

O PaperMod injeta o script do GA4 somente quando params.env = "production". Este blog já tem isso definido em hugo.toml:

1
2
[params]
  env = "production"

Quando você executa hugo server localmente, o Hugo carrega o ambiente development e aplica as overrides de config/development/hugo.toml. Para desativar o GA em desenvolvimento e não poluir suas métricas, adicione ao arquivo config/development/hugo.toml:

1
2
3
# Overrides aplicados no ambiente de desenvolvimento (hugo server)
[params]
  env = "development"   # ← impede que o PaperMod injete GA4 e AdSense localmente

Após essa adição, seu config/development/hugo.toml fica assim:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Overrides aplicados automaticamente quando Hugo roda em --environment development
# (hugo server usa "development" por padrão)
[params]
  env = "development"           # ← NOVO: desativa GA4 e AdSense localmente

[params.comentario]
  serverURL = "http://localhost:8080"
  domainID  = "14b8bc07-f786-458c-9f9e-39ad81c8ae67"

[params.newsletter]
  listmonkURL = "http://localhost:9000"
  listUUID = "5ae5e010-188f-47fd-812c-970ba1d57f43"

Verificar se o GA4 está sendo carregado em produção

Publique o blog e inspecione o HTML de qualquer página:

1
curl -s https://seudominio.com.br | grep googletagmanager

Você deve ver algo como:

1
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>

Passo 2.3 — Confirmar coleta de dados no painel GA4

  1. Acesse o GA4 e vá em Relatórios → Tempo real.
  2. Abra seu blog em outra aba (com o ambiente production publicado).
  3. O painel de “Tempo real” deve mostrar 1 usuário ativo. ✅

Passo 2.4 — Vincular GA4 ao Search Console

Isso permite ver no Analytics quais termos de busca trouxeram visitantes orgânicos.

  1. No GA4: Administrador (engrenagem) → Vínculos de produtos → Search Console.
  2. Clique em Vincular → selecione sua propriedade do Search Console → Confirmar.
  3. Após alguns dias, o relatório “Aquisição → Aquisição de tráfego → Search Console” mostrará palavras-chave e posições.

Parte 3 — Google AdSense (monetização suave)

O AdSense exibe anúncios contextualmente relevantes. O modo Anúncios automáticos é o mais “suave”: o Google escolhe posicionamento e formato com mínima intrusão ao leitor.

Passo 3.1 — Criar a conta AdSense

  1. Acesse adsense.google.com“Começar agora”.
  2. Informe a URL do site (https://seudominio.com.br) e o idioma principal (Português).
  3. Preencha dados fiscais (CPF ou CNPJ) e endereço — o Google exige isso para emitir pagamentos.
  4. Aceite os termos e envie o pedido de análise.

Critérios de aprovação:
— Site com HTTPS e domínio próprio ✅
— Conteúdo original (sem cópia de outros sites) ✅
— Política de Privacidade publicada e acessível ✅
— Sem conteúdo proibido (violência, adulto, pirataria)
— Volume mínimo de conteúdo (geralmente ≥ 20–30 artigos)

A análise pode levar de alguns dias até 2–3 semanas. O Google pode pedir revisão adicional.

Passo 3.2 — Escolher a estratégia de posicionamento

O AdSense oferece duas abordagens:

AbordagemComo funcionaPrósContras
Anúncios automáticosGoogle decide onde e quando exibirZero configuraçãoPode inserir ads no meio de blocos de código
Unidades manuaisVocê define posição e formato exatosControle total da experiênciaRequer configuração no template

Para um blog técnico, a abordagem manual é recomendada: evita que anúncios apareçam dentro de trechos de código e mantém a leitura fluida.

Obtendo o Publisher ID

  1. No painel AdSense, clique em Anúncios → Por unidade de anúncio.
  2. O seu Publisher ID (ca-pub-XXXXXXXXXXXXXXXXX) aparece no canto superior direito do painel.
  3. Anote-o — será usado no hugo.toml.

Criando as unidades de anúncio manuais

Crie duas unidades:

Unidade 1 — In-Article (exibida no meio do post, após o 4º parágrafo):

  1. Clique em “Criar unidade de anúncio” → “In-article”.
  2. Dê o nome in-article-post.
  3. Copie o valor de data-ad-slot exibido no snippet — ex.: 1234567890.

Unidade 2 — Display (exibida antes dos comentários):

  1. Clique em “Criar unidade de anúncio” → “Display”.
  2. Dê o nome display-pre-comments, formato Responsivo.
  3. Copie o valor de data-ad-slot — ex.: 0987654321.

Passo 3.3 — Adicionar o AdSense ao hugo.toml

Adicione o Publisher ID e os dois slot IDs ao hugo.toml, dentro do bloco [params]:

1
2
3
4
5
6
7
[params]
  # ... parâmetros existentes ...

  # Google AdSense
  googleAdSense              = "ca-pub-1234567890123456"  # Publisher ID
  googleAdSenseInArticleSlot = "1234567890"               # Slot do anúncio In-Article
  googleAdSenseDisplaySlot   = "0987654321"               # Slot do anúncio Display

Enquanto os slots estiverem com string vazia "", nenhum anúncio é renderizado — seguro para commits parciais.

Passo 3.4 — Atualizar layouts/partials/extend_head.html

O PaperMod expõe o hook extend_head.html para injetar código no <head> sem modificar o tema. O arquivo deve conter o Google Consent Mode v2 (obrigatório para GDPR/LGPD) seguido do script do AdSense:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{{- /* ================================================================
     extend_head.html — Consent Mode v2 + AdSense
     DEVE vir antes do gtag.js (google_analytics.html é carregado
     logo depois pelo PaperMod).
     ================================================================ */ -}}

{{- if eq .Site.Params.env "production" }}

{{- /* ── Google Consent Mode v2 ──────────────────────────────────── */ -}}
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('consent', 'default', {
    'ad_storage':         'denied',
    'ad_user_data':       'denied',
    'ad_personalization': 'denied',
    'analytics_storage':  'denied',
    'wait_for_update':    500
  });
  (function(){
    if (localStorage.getItem('cookie-consent') === 'granted') {
      gtag('consent', 'update', {
        'ad_storage':         'granted',
        'ad_user_data':       'granted',
        'ad_personalization': 'granted',
        'analytics_storage':  'granted'
      });
    }
  })();
</script>

{{- /* ── Google AdSense ─────────────────────────────────────────── */ -}}
{{- with .Site.Params.googleAdSense }}
<script async
  src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ . }}"
  crossorigin="anonymous"></script>
{{- end }}

{{- end }}

Consent Mode v2 é exigido pelo Google para publishers que atendem usuários europeus (GDPR). Os padrões são todos denied; o banner de cookies (implementado no extend_footer.html) chama gtag('consent', 'update', ...) quando o usuário aceita.
GA4: não inclua aqui — o PaperMod injeta automaticamente via [services.googleAnalytics].

Passo 3.5 — Criar os partials de anúncio

Crie dois arquivos em layouts/partials/:

layouts/partials/adsense-inarticle.html — anúncio In-Article:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{{- $pub  := site.Params.googleAdSense }}
{{- $slot := site.Params.googleAdSenseInArticleSlot }}
{{- if and (eq site.Params.env "production") $pub $slot }}
<div class="ad-inarticle" aria-label="Publicidade" style="text-align:center;margin:1.5rem 0;">
    <ins class="adsbygoogle"
         style="display:block;text-align:center;"
         data-ad-layout="in-article"
         data-ad-format="fluid"
         data-ad-client="{{ $pub }}"
         data-ad-slot="{{ $slot }}"></ins>
    <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>
{{- end }}

layouts/partials/adsense-display.html — anúncio Display:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{{- $pub  := site.Params.googleAdSense }}
{{- $slot := site.Params.googleAdSenseDisplaySlot }}
{{- if and (eq site.Params.env "production") $pub $slot }}
<div class="ad-display" aria-label="Publicidade" style="text-align:center;margin:2rem 0;">
    <ins class="adsbygoogle"
         style="display:block;"
         data-ad-client="{{ $pub }}"
         data-ad-slot="{{ $slot }}"
         data-ad-format="auto"
         data-full-width-responsive="true"></ins>
    <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
</div>
{{- end }}

Passo 3.6 — Atualizar layouts/_default/single.html

Este arquivo controla o layout de cada post. Edite-o para injetar os dois anúncios:

  • In-Article: via JavaScript, inserido dinamicamente após o 4º parágrafo do conteúdo
  • Display: posicionado entre as tags do post e a seção de comentários
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{{- if .Content }}
<div class="post-content">
    {{- partial "anchored_headings.html" .Content -}}
</div>

{{- /* Anúncio In-Article: injetado via JS após o 4º parágrafo */ -}}
{{- $pub := site.Params.googleAdSense }}
{{- $slot := site.Params.googleAdSenseInArticleSlot }}
{{- if and (eq site.Params.env "production") $pub $slot }}
<template id="ad-inarticle-tpl">{{- partial "adsense-inarticle.html" . -}}</template>
<script>
(function () {
  function injectAd() {
    var tpl = document.getElementById('ad-inarticle-tpl');
    var content = document.querySelector('.post-content');
    if (!tpl || !content) return;
    var paras = content.querySelectorAll('p');
    var target = paras.length >= 4 ? paras[3] : paras[paras.length - 1];
    if (!target) return;
    target.parentNode.insertBefore(document.importNode(tpl.content, true), target.nextSibling);
  }
  document.readyState === 'loading'
    ? document.addEventListener('DOMContentLoaded', injectAd)
    : injectAd();
})();
</script>
{{- end }}
{{- end }}

{{- if (.Param "comments") }}
{{- /* Anúncio Display: exibido antes dos comentários */ -}}
{{- partial "adsense-display.html" . }}
{{- partial "comments.html" . }}
{{- end }}

Por que usar <template>? O elemento <template> não é renderizado pelo browser até ser clonado via JS. Isso evita que o AdSense tente inicializar o anúncio antes de ele estar posicionado no DOM, eliminando erros de adsbygoogle.push.

Passo 3.7 — Verificar que os anúncios aparecem em produção

Após publicar:

1
curl -s https://seudominio.com.br | grep pagead2

Saída esperada:

1
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script>

Se não aparecer, confirme que env = "production" está em hugo.toml e que o build foi feito em modo production.


Parte 4 — Configuração final do hugo.toml

Consolidando todos os passos anteriores, o seu hugo.toml deve ter as seguintes adições:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
baseURL = "https://seudominio.com.br/"
# ... demais configurações existentes ...

# ── Google Analytics 4 ──────────────────────────────────────────────────────
[services.googleAnalytics]
  ID = "G-XXXXXXXXXX"

[params]
  env = "production"   # já existe — necessário para GA4 e AdSense funcionarem

  # Google AdSense
  googleAdSense              = "ca-pub-1234567890123456"  # Publisher ID
  googleAdSenseInArticleSlot = "1234567890"               # Slot do anúncio In-Article
  googleAdSenseDisplaySlot   = "0987654321"               # Slot do anúncio Display

  # ... demais parâmetros existentes (comentário, newsletter, etc.) ...

# Google Search Console — verificação da propriedade
[params.analytics.google]
  SiteVerificationTag = "AbCdEfGhIjKlMnOpQrStUvWxYz1234567"

E o config/development/hugo.toml com a override de ambiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Overrides aplicados automaticamente em hugo server (ambiente development)
[params]
  env = "development"   # desativa GA4 e AdSense em desenvolvimento local

[params.comentario]
  serverURL = "http://localhost:8080"
  domainID  = "14b8bc07-f786-458c-9f9e-39ad81c8ae67"

[params.newsletter]
  listmonkURL = "http://localhost:9000"
  listUUID = "5ae5e010-188f-47fd-812c-970ba1d57f43"

Parte 5 — Atualizar a Política de Privacidade

Com AdSense e Analytics ativos, a política de privacidade precisa mencionar o uso de cookies de terceiros. A página /privacy/ já existe neste blog — adicione uma nova seção 2.4 (ou equivalente) com o seguinte conteúdo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
### 2.X. Publicidade e Analytics (Google)

Este blog utiliza os seguintes serviços da Google LLC:

| Serviço | Finalidade |
|---|---|
| **Google Analytics 4** | Estatísticas de acesso: páginas visitadas, origem do tráfego, dispositivos, duração de sessão. Os dados são anonimizados por padrão. |
| **Google AdSense** | Exibição de anúncios contextuais. O AdSense pode usar cookies para personalizar anúncios com base em visitas anteriores. |

O Google pode usar as informações coletadas por esses serviços de acordo com sua
[Política de Privacidade](https://policies.google.com/privacy).

Para desativar a personalização de anúncios, acesse:
[https://www.google.com/settings/ads](https://www.google.com/settings/ads)

Para optar por não participar do Google Analytics, instale o
[Google Analytics Opt-out Browser Add-on](https://tools.google.com/dlpage/gaoptout).

Este blog já possui /privacy/ e /terms/ linkados no footer. Após editar, o conteúdo passa a estar em conformidade com os Termos do Programa AdSense e com a LGPD (Lei nº 13.709/2018).


Parte 6 — Testar localmente

Verificar que os scripts NÃO aparecem em desenvolvimento

1
2
3
4
# Inicie o servidor de desenvolvimento (usa config/development/hugo.toml automaticamente)
docker-compose up hugo
# ou diretamente:
hugo server

Abra http://localhost:1313, pressione Ctrl+U e confirme que não há referência a googletagmanager nem pagead2 no HTML. ✅

Simular o ambiente de produção localmente

1
hugo server --environment production

Agora os scripts devem aparecer no HTML (o override de env = "development" é ignorado pois você forçou production). Confirme com Ctrl+U.

Validar o build final

1
hugo --environment production

Examine public/index.html e confirme a presença dos scripts no <head>.


Parte 7 — Checklist de validação completo

Execute cada item após a publicação em produção:

Search Console

  • Propriedade verificada — status “Verificado” no painel
  • Sitemap enviado — status “Sucesso” com contagem de URLs
  • robots.txt acessível em https://seudominio.com.br/robots.txt sem Disallow: /
  • Inspeção de URL em pelo menos 3 artigos — todos com status “URL está no Google” ou “Solicitar indexação” acionado

Google Analytics 4

  • Relatório “Tempo real” mostra atividade ao navegar no blog em produção
  • ID G-XXXXXXXXXX aparece no <head> do HTML em produção
  • ID não aparece no HTML em desenvolvimento local (hugo server)
  • Search Console vinculado ao GA4 (em Administrador → Vínculos de produtos)

Google AdSense

  • Snippet ca-pub-XXXXXXXXXXXXXXXXX aparece no <head> em produção
  • Snippet não aparece em desenvolvimento local
  • Dados fiscais e endereço preenchidos no painel AdSense
  • ads.txt acessível em https://seudominio.com.br/ads.txt com a linha google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0
  • Revisão solicitada no painel AdSense após publicar o código
  • Unidade In-Article criada no painel — slot ID preenchido em googleAdSenseInArticleSlot
  • Unidade Display criada no painel — slot ID preenchido em googleAdSenseDisplaySlot
  • Anúncio In-Article aparece após o 4º parágrafo em posts com ≥ 4 parágrafos
  • Anúncio Display aparece antes dos comentários

Privacidade e conformidade

  • Página /privacy/ menciona Google Analytics e Google AdSense
  • Página /privacy/ contém link para https://www.google.com/settings/ads
  • Política de Privacidade acessível no footer do blog ✅ (já existe)

Segurança

  • HTTPS ativo e certificado válido (cadeado no browser)
  • extend_head.html usa if eq .Site.Params.env "production" para não vazar em dev

Parte 8 — Boas práticas de SEO para amplificar os resultados

Com o Search Console ativo, as práticas abaixo têm impacto direto mensurável:

description em todos os posts

O PaperMod usa o campo description do front matter como <meta name="description">. O Google exibe esse texto nos resultados de busca:

1
2
3
---
description: "Resumo claro do artigo em até 155 caracteres para aparecer nos resultados do Google."
---

alt descritivo em todas as imagens

O Google indexa imagens. Sempre preencha:

1
2
3
cover:
  image: images/cover.webp
  alt: "Descrição específica do que a imagem mostra — relevante para buscas"

keywords para reforçar o tema

O PaperMod suporta o campo keywords no front matter (renderizado como meta-tag):

1
2
3
4
keywords:
  - palavra-chave principal
  - variação de busca
  - termo técnico relacionado

slug amigável

Use slugs descritivos e sem stop words desnecessárias:

1
2
slug: "google-adsense-analytics-seo-hugo"   # ✅ bom
slug: "post-123-sobre-google"               # ❌ ruim

Dados estruturados (Schema.org)

O PaperMod já injeta automaticamente:

  • Article com autor, data e headline
  • BreadcrumbList para navegação

Verifique em search.google.com/test/rich-results colando a URL de qualquer artigo.

Core Web Vitals

No Search Console, acompanhe “Experiência na página → Core Web Vitals”. Para um blog Hugo estático os scores costumam ser excelentes por padrão. As principais causas de regressão são:

MétricaCausa comumSolução
LCP (Largest Contentful Paint)Imagem de capa muito grandeUsar .webp ≤ 150 KB
CLS (Cumulative Layout Shift)Imagens sem width/heightSempre definir dimensões
INP (Interaction to Next Paint)Scripts de terceiros bloqueantesasync obrigatório no AdSense ✅

Conclusão

Resumo do que foi configurado:

FerramentaArquivo modificadoO que ganha
Search Consolehugo.toml ([params.analytics.google])Indexação garantida, palavras-chave orgânicas, alertas de erros
GA4hugo.toml ([services.googleAnalytics]) + config/development/hugo.tomlSessões, usuários únicos, páginas populares, origem do tráfego
AdSensehugo.toml (googleAdSense + slots) + layouts/partials/extend_head.html + adsense-inarticle.html + adsense-display.html + layouts/_default/single.htmlReceita passiva com posicionamento controlado
Privacidadecontent/privacy/index.mdConformidade com LGPD e Termos do AdSense

O ciclo virtuoso: bom SEO → mais tráfego orgânico → mais dados no Analytics → mais receita no AdSense.

A aprovação do AdSense pode levar semanas; use esse tempo para publicar mais conteúdo, resolver eventuais alertas no Search Console e otimizar os Core Web Vitals. Com o tráfego crescendo, o ecossistema se retroalimenta.

Qualquer dúvida, deixe um comentário abaixo. 🚀