Seu Resultado
Playbook do Blog
Baixar em Markdown
Playbook interno · v2

Como usar o blog
do Seu Resultado

Guia completo do painel /admin — mapeado 1:1 com o código real. Do primeiro login à publicação via API, passando por SEO, agendamento, redirects, taxonomia e auditoria.

23 seções
Leitura em ~18 min
Iniciante → avançado
01 — Comece por aqui

Visão geral

O que existe, onde vive e como o conteúdo chega ao público.

O blog do Seu Resultado é composto por duas camadas:

Público (leitores)

  • /blog — listagem de artigos publicados
  • /blog/[slug] — leitura do artigo
  • /blog/categoria/[slug] — filtro por categoria
  • /blog/tag/[slug] — filtro por tag
  • /blog/preview/[token] — pré-visualização (noindex)

Painel (equipe)

  • /admin — lista de artigos
  • /admin/posts/[id] — editor
  • /admin/taxonomy — categorias e tags
  • /admin/authors — autores
  • /admin/redirects — redirects 301
  • /admin/api-keys — chaves de API
  • /admin/audit-logs — auditoria
Duas formas de publicar

Pelo painel (humano) ou pela Blog API (n8n, Zapier, scripts). As duas escrevem no mesmo banco, respeitam o mesmo fluxo de status e são rastreadas na auditoria.

02 — Comece por aqui

Login no painel

Como entrar em /admin com segurança.

1

Abra /admin/login

Acesse seuresultado.com/admin/login. A página está marcada como noindex, nofollow — não aparece no Google.

2

Entre com e-mail e senha (mínimo 8 caracteres)

A autenticação é feita pelo Supabase Auth. Se for o primeiro acesso, clique em "Primeiro acesso? Criar conta". Um admin precisa depois te promover — veja Papéis.

3

Verificação automática de permissão

O AdminLayout checa se seu usuário tem papel de admin. Se não tiver, você vê a mensagem "Acesso restrito" com botão para sair.

4

Você caiu na lista de Artigos

A home do painel é /admin → lista dos últimos 200 artigos ordenados por updated_at.

Um usuário por pessoa
A auditoria só é útil se cada colaborador tiver o próprio login. Nunca compartilhe senha.
03 — Comece por aqui

Tour do /admin

As 6 abas do topo, o que faz cada uma.

Artigos (/admin)

Lista com filtro por status. Botão Novo artigo cria um rascunho com slug temporário e abre o editor. Cada linha tem link de Preview ↗ e botão de Excluir.

Taxonomia

Cria, edita e exclui Categorias (com descrição) e Tags. Slug é gerado automaticamente pelo nome.

Autores

Cadastro com nome, slug, bio, avatar e LinkedIn. Um autor pode ser marcado como padrão — usado pela API quando o payload não informar autor.

Redirects

Cria redirect 301 client-side de /de para /para. Loops são bloqueados. Pode ativar/desativar sem excluir.

API Keys

Gera chaves para automações. Cada chave tem escopo (posts:write, posts:publish). A chave completa aparece uma única vez.

Auditoria

Últimas 500 chamadas autenticadas à API do blog. Filtre por chave, ação, status, artigo ou período.
04 — Criando um artigo

Criar um novo artigo

Do botão “Novo artigo” até salvar o primeiro rascunho.

1

Clique em ‘Novo artigo’

No topo de /admin. Um post é criado com título "Novo artigo" e slug novo-artigo-1737000000000 (timestamp). Você é enviado para o editor.

2

Ajuste o título e o slug

Escreva o título real. O slug é editável — mantenha curto, em kebab-case, sem stopwords. Um validador em tempo real checa se o slug já está em uso; se estiver, o botão Salvar trava.

3

Escreva o resumo (excerpt)

O resumo vira meta description por padrão e aparece no card do blog. Sem ele, uma faixa amarela avisa: "Sem resumo — a descrição no Google e no card social ficará vazia."

4

Escreva o conteúdo no editor

Veja a próxima seção — o editor tem barra de ferramentas Tiptap.

5

Salve

A barra lateral direita tem Salvar (mantém o status atual como draft) e atalhos Rascunho / Em revisão / Aprovar / Agendar / Publicar agora.

Avisos automáticos no topo do editor

O painel mostra faixas amarelas/vermelhas se faltar:

  • Imagem destacada
  • Resumo (excerpt)
  • Autor
  • Categoria
  • Meta title com mais de 60 caracteres
  • Meta description com mais de 160 caracteres
  • Slug em conflito com outro artigo

Resolva os erros vermelhos antes de publicar.

05 — Criando um artigo

Editor Tiptap

Os botões da barra de ferramentas e o que fazem.

BotãoO que fazQuando usar
BNegritoÊnfase pontual.
IItálicoNomes, títulos de obras, jargões.
H2Cabeçalho 2Cada nova seção do artigo.
H3Cabeçalho 3Subtópicos dentro de uma H2.
• ListaLista com marcadoresEnumerações sem ordem.
1. ListaLista numeradaPassos, rankings.
CitaçãoBlockquoteFala de terceiro, destaque.
CódigoBloco de códigoSnippets técnicos.
LinkAbre prompt pedindo URLSelecione o texto antes de clicar.
ImagemAbre prompt pedindo URL da imagemCole uma URL pública (do Storage, por exemplo).
Colar MarkdownAbre prompt para colar MD; converte para HTMLImportar rascunho de Notion, Google Docs, IA.
HTMLAlterna para modo HTML brutoAjuste fino, iframe, embed.
Fluxo recomendado

Escreva o rascunho em Markdown (Notion, IA), cole via Colar Markdown, revise no modo visual e só use HTML se precisar embutir vídeo/iframe.

Links: sempre âncora descritiva

Nunca use "clique aqui". Selecione o trecho que descreve o destino antes de clicar em Link. É acessibilidade + SEO.

06 — Criando um artigo

Imagem destacada (capa)

Como enviar, alt text e o que ela alimenta.

Na aba Conteúdo, o campo Imagem destacada aceita upload direto (função uploadBlogImage, envia para Supabase Storage e retorna a URL pública). Um segundo campo, Alt text, é preenchido automaticamente com o nome do arquivo — reescreva descrevendo o que a imagem mostra.

Dimensão

Proporção 16:9, mínimo 1600×900 px. É essa imagem que alimenta o og:image e o twitter:image quando o link é compartilhado.

Formato & peso

WebP ou JPEG otimizado. Até ~250 KB. Imagens gigantes derrubam Core Web Vitals.

Alt text obrigatório

Toda img precisa de texto alternativo descritivo (não é a legenda — é o que um leitor de tela ouve).

Direitos

Imagens próprias, banco licenciado ou geradas por IA. Nunca puxe do Google.
Fallback

Se um artigo não tiver imagem destacada, o SEO usa /og-default.jpg — genérico. Sempre preencha.

07 — Criando um artigo

Autor, categoria e tags

Selecionados na barra lateral direita, no card ‘Publicação’.

Autor

Escolha um autor cadastrado. Sem seleção, aparece o aviso amarelo. Cadastro em /admin/authors.

Categoria

Cada artigo tem uma categoria. Ela aparece no breadcrumb e em /blog/categoria/[slug]. Cadastro em /admin/taxonomy.

Tags (múltiplas)

Clique nas tags para marcar/desmarcar. Elas viram keywords no JSON-LD e alimentam /blog/tag/[slug].
Regra prática

3 a 6 tags por artigo. Categoria é grande (ex.: Branding); tag é específica (naming, rebranding-b2b).

08 — SEO & publicação

Aba SEO

Os campos que controlam como o artigo aparece no Google.

Cada campo tem modo automático (derivado de outro campo do artigo) e modo personalizado (ative o checkbox para editar). O contador mostra caracteres × ideal × limite.

meta_titleobrigatório
Título que aparece na aba do navegador e no resultado do Google. Padrão: usa o título do artigo. Ideal 40–60 caracteres; acima de 60 vira erro vermelho.
meta_descriptionobrigatório
Descrição no snippet do Google. Padrão: usa o resumo (excerpt). Ideal 120–160 caracteres; acima de 160 vira erro.
focus_keyword
Palavra-chave principal do artigo. Vai para o JSON-LD keywords. Escolha uma só — é a que você quer rankear.
secondary_keywords
Lista de palavras-chave secundárias (semânticas). Também entra no JSON-LD.
Como o SEO é aplicado

O componente BlogSeo.tsx monta automaticamente:

  • <title>, meta description, canonical
  • robots: index,follow,max-image-preview:large
  • Open Graph e Twitter Card completos
  • JSON-LD BlogPosting (autor, publisher, keywords, datas) + BreadcrumbList

Se index_page estiver desmarcado ou o status não for published, o robots vira noindex, follow.

09 — SEO & publicação

Aba Compartilhamento social

Como o link fica no WhatsApp, LinkedIn, Twitter.

og_title
Título do card social. Padrão: usa o meta_title. Personalize quando quiser algo mais "cliqueável" nas redes.
og_description
Descrição do card. Padrão: usa a meta_description.
og_image
Imagem do card. Padrão: usa a imagem destacada. Personalize se quiser uma imagem específica para redes (com título embutido, por exemplo).
Teste antes de compartilhar

Depois de publicar, valide em:

  • Facebook Sharing Debugger — força re-scan e mostra og:image.
  • LinkedIn Post Inspector — mesma coisa para o LinkedIn.
  • WhatsApp não tem debugger — envie para você mesmo e veja.
10 — SEO & publicação

Configurações avançadas

Campos que raramente você mexe — mas quando precisa, precisa muito.

canonical_url
URL canônica. Padrão: https://seuresultado.com/blog/[slug]. Personalize apenas se o mesmo conteúdo existir em outro lugar (republicação parceira, por exemplo).
index_page
Checkbox "Indexar (aparece em listas / sitemap)". Desligado, o artigo some da home, das listas de categoria/tag e do sitemap, e o robots vira noindex. Use para conteúdos internos ou landing pages.
published_at
Data de publicação. Editável — use para agendar (data futura) ou corrigir o histórico (backdate).
11 — SEO & publicação

Fluxo de status

Os 5 estados que um artigo pode ter.

Rascunho
Em revisão
Aprovado
Agendado
Publicado
draft → review

Autor termina, clica em Em revisão. Fica pronto para o editor avaliar.

review → approved

Editor revisa e clica em Aprovar. Estado pronto para publicação.

approved → scheduled

Define data futura em published_at e clica em Agendar.

→ published

Clicando em Publicar agora ou quando o horário agendado chega. published_at vira automaticamente now() se estiver vazio.

Você pode pular etapas

O painel deixa clicar direto de draft para published. O fluxo review→approved existe para equipes com editor — em blog solo, ignore.

12 — SEO & publicação

Agendar & publicar

Publicar agora ou marcar horário futuro.

Publicar agora

Botão Publicar agora na sidebar. Status vira published e o artigo fica disponível em /blog/[slug].

Agendar

Preencha published_at com data/hora futura e clique em Agendar. Status vira scheduled.

Publicação automática

Uma rotina roda a cada 1 minuto e promove todos os artigos scheduled cuja published_at já passou. Ou seja: agende para 09:00, ele vira público entre 09:00 e 09:01.

13 — SEO & publicação

Preview e banner de pré-visualização

Como revisar antes de publicar (e antes que o Google veja).

Todo artigo tem um preview_token único. A URL de preview é /blog/preview/[token]. Não precisa estar logado — o token já autentica. Compartilhe com cliente ou revisor.

Faixa fixa no topo

Quando você abre uma preview, aparece uma faixa mint fixa: "PRÉ-VISUALIZAÇÃO — RASCUNHO / EM REVISÃO / … — não indexável". A página inteira tem noindex, nofollow — nunca vai para o Google.

Se o token vazar

Basta abrir o artigo no painel e clicar em Excluir ou trocar o slug para invalidar links antigos. Novos tokens são gerados por artigo, não por sessão.

14 — Gestão do blog

Taxonomia (categorias e tags)

Criadas em /admin/taxonomy — organizadas por tabela.

Categorias

Campos: name, slug (auto), description.

Uma por artigo. Aparece em /blog/categoria/[slug] e no breadcrumb.

Tags

Campos: name, slug (auto). Sem descrição.

Múltiplas por artigo. Aparece em /blog/tag/[slug] e no JSON-LD.

Antes de criar uma nova

Busque se já não existe algo parecido. Duplicar ("branding" e "Branding") fragmenta o SEO.

15 — Gestão do blog

Autores

/admin/authors — cadastro completo do autor visível no artigo.

nameobrigatório
Nome exibido no artigo e no JSON-LD.
slug
Gerado automaticamente do nome. Editável.
bio
Aparece na assinatura do artigo.
avatar_url
URL pública da foto do autor.
linkedin_url
Link do LinkedIn — mostrado como ícone.
is_default
Marca este autor como padrão. Só pode haver um. É o autor usado pela API quando o payload de criação não especificar autor.
Excluir autor não apaga artigos

Artigos ficam com autor null — vão exibir aviso amarelo até você atribuir outro.

16 — Gestão do blog

Redirects 301

Quando você muda um slug, crie um redirect para não perder SEO.

O painel /admin/redirects mantém um mapa from_path → to_path com status 301. O componente RedirectClient aplica no lado do cliente usando 3 sinais para o Google:

  • <meta http-equiv="refresh"> instantâneo
  • <link rel="canonical"> apontando para o destino
  • window.location.replace() como fallback JS
Fluxo típico

Você reescreveu o artigo e o slug ficou melhor:

  1. Duplique o conteúdo no artigo novo, publique.
  2. Despublique o antigo (ou apenas mude o slug do antigo).
  3. Crie redirect /blog/slug-antigo → /blog/slug-novo.
Loops são bloqueados

Se você tentar apontar A→B com B→A ativo, o painel recusa. Desative ou exclua o outro antes.

17 — Gestão do blog

Auditoria da API

Toda chamada autenticada à Blog API é registrada.

/admin/audit-logs lista as últimas 500 chamadas com filtros por chave, ação, status, artigo e período. Colunas: quando, chave, ação, método, rota, http, status, artigo, origem, erro.

listcreatereadpatchsubmitapprovepublishschedulepreviewdelete
Use para
  • Descobrir qual workflow do n8n publicou um artigo estranho.
  • Provar (ou refutar) que uma chave está sendo usada.
  • Investigar erros 4xx/5xx que a automação está engolindo.
18 — Automação (API)

Criar uma chave de API

Em /admin/api-keys — a chave completa só é exibida uma vez.

1

Dê um nome à chave

Ex.: n8n-producao, zapier-cases. Uma chave por integração.

2

Marque as permissões

posts:write — criar e editar artigos.
posts:publish — publicar/agendar.

Sem posts:publish a chave só cria rascunhos — bom para automações que devem passar por revisão humana.

3

Clique em ‘Gerar chave’

O painel mostra a chave completa UMA ÚNICA VEZ em uma caixa mint com botão Copiar. Cole imediatamente no cofre do n8n / gerenciador de segredos.

4

Guarde só o prefixo

Depois de fechar a caixa, o painel só mostra o prefixo (primeiros 16 caracteres) da chave — nada mais.

Se vazar

Vá em /admin/api-keys, clique em Revogar. A chave para de funcionar imediatamente. Gere uma nova e atualize a integração.

19 — Automação (API)

Endpoints da Blog API

Base URL, autenticação e todos os endpoints disponíveis.

Base URL
https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api
Autenticação

Header x-api-key: sua_chave em toda requisição.

MétodoRotaAçãoRequer
GET/postsLista artigosposts:write
POST/postsCria rascunho (retorna preview_url)posts:write
GET/posts/:idLê artigoposts:write
PATCH/posts/:idAtualiza camposposts:write
POST/posts/:id/submitEnvia para revisãoposts:write
POST/posts/:id/approveAprovaposts:publish
POST/posts/:id/publishPublica (retorna public_url)posts:publish
POST/posts/:id/scheduleAgenda: { "publish_at": "ISO" }posts:publish

Exemplo — criar rascunho

POST /posts
curl -X POST https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts \
  -H "x-api-key: SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Como marcas B2B ganham autoridade",
    "slug": "marcas-b2b-autoridade",
    "excerpt": "Uma síntese de até 160 caracteres.",
    "content": "<p>Corpo em HTML…</p>",
    "featured_image": "https://…/capa.webp",
    "featured_image_alt": "Descrição da imagem",
    "category_slug": "branding",
    "tag_slugs": ["b2b", "autoridade"],
    "meta_title": "Autoridade B2B: guia prático",
    "meta_description": "…",
    "focus_keyword": "autoridade B2B"
  }'

Exemplo — agendar

POST /posts/:id/schedule
curl -X POST https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts/abc-123/schedule \
  -H "x-api-key: SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{ "publish_at": "2026-08-01T12:00:00.000Z" }'

Exemplo — publicar agora

POST /posts/:id/publish
curl -X POST https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts/abc-123/publish \
  -H "x-api-key: SUA_CHAVE"
Idempotência

Envie o header Idempotency-Key: uuid em POSTs. Se a mesma chave chegar duas vezes, o servidor devolve a resposta original — evita duplicar artigos quando o n8n reprocessa.

20 — Automação (API)

n8n — publicar automaticamente

Fluxo de referência: gerar artigo com IA e publicar como rascunho.

1

Salve a chave no cofre

Em n8n → Credentials → Header Auth, crie uma credencial com:

  • Name: x-api-key
  • Value: cole a chave
2

HTTP Request node

Método POST, URL https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts, Body JSON, cabeçalho da credencial acima.

3

Body dinâmico

Puxe título, HTML, capa e categoria dos nós anteriores. Passe tag_slugs como array.

4

Use a resposta

O endpoint devolve id e preview_url. Envie o preview por Slack/e-mail para o editor revisar antes de publicar.

5

Publicar depois da aprovação humana

Um segundo workflow (acionado por reação no Slack, por exemplo) chama POST /posts/:id/publish.

Segurança do fluxo

Dê à chave do n8n apenas posts:write. A publicação passa por revisão humana com uma chave separada de posts:publish (ou pelo painel).

21 — Suporte

Papéis & permissões

Quem faz o quê no painel.

AçãoAutorEditorAdmin
Criar rascunho e editar próprios artigos
Enviar para revisão
Editar artigos de terceiros
Aprovar / rejeitar
Publicar / agendar
Excluir artigo publicado
Gerenciar autores, taxonomia, redirects
Gerar e revogar API Keys
Ver Auditoria da API
Promover outro usuário a admin
Primeiro usuário

O primeiro cadastro precisa ser promovido a admin manualmente no banco (tabela user_roles). Depois, o próprio painel gerencia os demais.

22 — Suporte

Problemas comuns

Se algo deu errado, provavelmente é uma destas.

O botão ‘Salvar’ está travado (cinza)

Provavelmente o slug já está em uso — aviso vermelho no topo. Troque o slug e o botão libera. Também trava se o meta title/description passar do limite.

Meu artigo agendado não publicou no horário

A rotina roda a cada 1 minuto. Espere até 60s. Se passou disso: confira se o status realmente ficou ‘scheduled’ (não ‘approved’) e se ‘published_at’ está no passado.

Publiquei mas não aparece em /blog

1) A listagem é cacheada por alguns minutos. 2) Confira se ‘Indexar’ está marcado — se não, o artigo é acessível pelo link direto mas não entra em listas nem sitemap.

Imagem quebrada no post publicado

A URL provavelmente é local. Use o upload da aba Conteúdo — ele sobe para o Storage e devolve URL pública.

Compartilhei no WhatsApp/LinkedIn e não veio card

Falta ‘Imagem destacada’ (ou og:image). Preencha, publique de novo e force re-scan no Facebook Sharing Debugger.

API retornou 401 Unauthorized

Chave inválida, revogada ou faltando o header ‘x-api-key’. Não confunda com Authorization Bearer — não é.

API retornou 403 Forbidden

A chave existe mas não tem a permissão da ação. Ex.: chamou /publish com uma chave só de posts:write. Adicione posts:publish (ou crie outra chave).

API retornou 409 Conflict

Slug já existe. Envie um slug diferente no PATCH ou omita o campo para o servidor gerar.

API retornou 429 Too Many Requests

Rate limit. Reduza a frequência do workflow ou espalhe as chamadas com atraso.

Redirect 301 não está funcionando

Confira se está marcado como ‘ativo’ e se não há loop. Redirects só se aplicam a rotas /blog/* — não redirecionam páginas fora do blog.

Sumiu o autor do meu artigo

Alguém excluiu o autor em /admin/authors. Selecione um novo autor no card ‘Publicação’ e salve.

‘Acesso restrito’ ao entrar no /admin

Seu usuário existe mas não é admin ainda. Peça a um admin para te adicionar em user_roles.

23 — Suporte

Checklist antes de publicar

Passe por esta lista em cada artigo. Sempre.

  • Título curto, específico e com a palavra-chave no início
  • Slug em kebab-case, sem stopwords, sem conflito
  • Resumo (excerpt) entre 120 e 160 caracteres
  • Imagem destacada 1600×900, ≤ 250 KB
  • Alt text descritivo em todas as imagens
  • Autor e categoria selecionados (sem aviso amarelo)
  • 3–6 tags marcadas
  • H2 e H3 estruturados (sem pular níveis)
  • Ao menos 2 links internos para outros artigos
  • Ao menos 1 CTA claro no fim (contato, newsletter, case)
  • Aba SEO: meta title ≤ 60, meta desc ≤ 160, focus keyword
  • Aba Social: og_image renderiza bem no card
  • ‘Indexar’ marcado (a menos que seja conteúdo privado)
  • Preview aberto em mobile e desktop, sem quebras
  • Revisão ortográfica passada
  • Se substitui artigo antigo: redirect 301 criado

Pronto para publicar

Se você chegou até aqui e marcou todos os itens, é só clicar em Publicar agora. Boa escrita.