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.
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
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.
Login no painel
Como entrar em /admin com segurança.
Abra /admin/login
Acesse seuresultado.com/admin/login. A página está marcada como noindex, nofollow — não aparece no Google.
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.
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.
Você caiu na lista de Artigos
A home do painel é /admin → lista dos últimos 200 artigos ordenados por updated_at.
Tour do /admin
As 6 abas do topo, o que faz cada uma.
Artigos (/admin)
Taxonomia
Autores
Redirects
/de para /para. Loops são bloqueados. Pode ativar/desativar sem excluir.API Keys
posts:write, posts:publish). A chave completa aparece uma única vez.Auditoria
Criar um novo artigo
Do botão “Novo artigo” até salvar o primeiro rascunho.
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.
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.
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."
Escreva o conteúdo no editor
Veja a próxima seção — o editor tem barra de ferramentas Tiptap.
Salve
A barra lateral direita tem Salvar (mantém o status atual como draft) e atalhos Rascunho / Em revisão / Aprovar / Agendar / Publicar agora.
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.
Editor Tiptap
Os botões da barra de ferramentas e o que fazem.
| Botão | O que faz | Quando usar |
|---|---|---|
| B | Negrito | Ênfase pontual. |
| I | Itálico | Nomes, títulos de obras, jargões. |
| H2 | Cabeçalho 2 | Cada nova seção do artigo. |
| H3 | Cabeçalho 3 | Subtópicos dentro de uma H2. |
| • Lista | Lista com marcadores | Enumerações sem ordem. |
| 1. Lista | Lista numerada | Passos, rankings. |
| Citação | Blockquote | Fala de terceiro, destaque. |
| Código | Bloco de código | Snippets técnicos. |
| Link | Abre prompt pedindo URL | Selecione o texto antes de clicar. |
| Imagem | Abre prompt pedindo URL da imagem | Cole uma URL pública (do Storage, por exemplo). |
| Colar Markdown | Abre prompt para colar MD; converte para HTML | Importar rascunho de Notion, Google Docs, IA. |
| HTML | Alterna para modo HTML bruto | Ajuste fino, iframe, embed. |
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.
Nunca use "clique aqui". Selecione o trecho que descreve o destino antes de clicar em Link. É acessibilidade + SEO.
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
og:image e o twitter:image quando o link é compartilhado.Formato & peso
Alt text obrigatório
img precisa de texto alternativo descritivo (não é a legenda — é o que um leitor de tela ouve).Direitos
Se um artigo não tiver imagem destacada, o SEO usa /og-default.jpg — genérico. Sempre preencha.
Autor, categoria e tags
Selecionados na barra lateral direita, no card ‘Publicação’.
Autor
/admin/authors.Categoria
/blog/categoria/[slug]. Cadastro em /admin/taxonomy.Tags (múltiplas)
keywords no JSON-LD e alimentam /blog/tag/[slug].3 a 6 tags por artigo. Categoria é grande (ex.: Branding); tag é específica (naming, rebranding-b2b).
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óriometa_descriptionobrigatóriofocus_keywordkeywords. Escolha uma só — é a que você quer rankear.secondary_keywordsO componente BlogSeo.tsx monta automaticamente:
<title>,meta description,canonicalrobots: 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.
Configurações avançadas
Campos que raramente você mexe — mas quando precisa, precisa muito.
canonical_urlhttps://seuresultado.com/blog/[slug]. Personalize apenas se o mesmo conteúdo existir em outro lugar (republicação parceira, por exemplo).index_pagenoindex. Use para conteúdos internos ou landing pages.published_atFluxo de status
Os 5 estados que um artigo pode ter.
Autor termina, clica em Em revisão. Fica pronto para o editor avaliar.
Editor revisa e clica em Aprovar. Estado pronto para publicação.
Define data futura em published_at e clica em Agendar.
Clicando em Publicar agora ou quando o horário agendado chega. published_at vira automaticamente now() se estiver vazio.
O painel deixa clicar direto de draft para published. O fluxo review→approved existe para equipes com editor — em blog solo, ignore.
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.
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.
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.
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.
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.
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.
Busque se já não existe algo parecido. Duplicar ("branding" e "Branding") fragmenta o SEO.
Autores
/admin/authors — cadastro completo do autor visível no artigo.
nameobrigatórioslugbioavatar_urllinkedin_urlis_defaultArtigos ficam com autor null — vão exibir aviso amarelo até você atribuir outro.
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 destinowindow.location.replace()como fallback JS
Você reescreveu o artigo e o slug ficou melhor:
- Duplique o conteúdo no artigo novo, publique.
- Despublique o antigo (ou apenas mude o slug do antigo).
- Crie redirect
/blog/slug-antigo → /blog/slug-novo.
Se você tentar apontar A→B com B→A ativo, o painel recusa. Desative ou exclua o outro antes.
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.
- 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.
Criar uma chave de API
Em /admin/api-keys — a chave completa só é exibida uma vez.
Dê um nome à chave
Ex.: n8n-producao, zapier-cases. Uma chave por integração.
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.
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.
Guarde só o prefixo
Depois de fechar a caixa, o painel só mostra o prefixo (primeiros 16 caracteres) da chave — nada mais.
Vá em /admin/api-keys, clique em Revogar. A chave para de funcionar imediatamente. Gere uma nova e atualize a integração.
Endpoints da Blog API
Base URL, autenticação e todos os endpoints disponíveis.
https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-apiHeader x-api-key: sua_chave em toda requisição.
| Método | Rota | Ação | Requer |
|---|---|---|---|
| GET | /posts | Lista artigos | posts:write |
| POST | /posts | Cria rascunho (retorna preview_url) | posts:write |
| GET | /posts/:id | Lê artigo | posts:write |
| PATCH | /posts/:id | Atualiza campos | posts:write |
| POST | /posts/:id/submit | Envia para revisão | posts:write |
| POST | /posts/:id/approve | Aprova | posts:publish |
| POST | /posts/:id/publish | Publica (retorna public_url) | posts:publish |
| POST | /posts/:id/schedule | Agenda: { "publish_at": "ISO" } | posts:publish |
Exemplo — criar rascunho
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
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
curl -X POST https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts/abc-123/publish \
-H "x-api-key: SUA_CHAVE"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.
n8n — publicar automaticamente
Fluxo de referência: gerar artigo com IA e publicar como rascunho.
Salve a chave no cofre
Em n8n → Credentials → Header Auth, crie uma credencial com:
- Name:
x-api-key - Value: cole a chave
HTTP Request node
Método POST, URL https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts, Body JSON, cabeçalho da credencial acima.
Body dinâmico
Puxe título, HTML, capa e categoria dos nós anteriores. Passe tag_slugs como array.
Use a resposta
O endpoint devolve id e preview_url. Envie o preview por Slack/e-mail para o editor revisar antes de publicar.
Publicar depois da aprovação humana
Um segundo workflow (acionado por reação no Slack, por exemplo) chama POST /posts/:id/publish.
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).
Papéis & permissões
Quem faz o quê no painel.
| Ação | Autor | Editor | Admin |
|---|---|---|---|
| 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 | — | — | ✓ |
O primeiro cadastro precisa ser promovido a admin manualmente no banco (tabela user_roles). Depois, o próprio painel gerencia os demais.
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.
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.
Aba Compartilhamento social
Como o link fica no WhatsApp, LinkedIn, Twitter.
og_titlemeta_title. Personalize quando quiser algo mais "cliqueável" nas redes.og_descriptionmeta_description.og_imageDepois de publicar, valide em: