CLI das lojas Unbox. O comando é unbox, e o primeiro subcomando, unbox create, gera um
storefront Next.js completo integrado com a API Unbox, a partir da foundation oficial
(storefront-foundation), já com a sua marca aplicada: estilo visual (layout, fontes, neutros),
cores e nome da loja. Os próximos subcomandos levam a loja ao ar pela Partners API (veja
Comando unbox).
Passo 0: precisa do Node.js instalado (baixe em nodejs.org, botão "LTS", instalador comum de 2 minutos). É o único pré-requisito da máquina.
Navegue até a pasta onde queira criar o projeto e rode:
npx --package=@unbox-plus/cli unbox createO npx roda o CLI direto do pacote publicado no NPM, sem instalar nada global. O
--package= é obrigatório: veja Dois cuidados com o npx.
O comando antigo, create-unbox-store, continua funcionando com as mesmas flags e gera o mesmo
projeto; ele só avisa que o padrão agora é unbox create.
Ele vai perguntar:
- Nome da pasta/projeto
- Nome de exibição da loja
- Cor primária (hex) — botões, preços, links
- Cor de destaque/CTA (hex) — banners de oferta
- Site atual da marca (opcional, Enter pra pular)
- Instagram da marca (opcional, Enter pra pular)
- Objetivo da loja em uma frase (opcional, Enter pra pular)
- Estilo visual da loja — o CLI sugere um a partir do objetivo/site/Instagram e você confirma ou troca: Essencial (completo e equilibrado), Promocional (oferta em primeiro plano), Editorial (clube/assinatura, tipografia de revista) ou Boutique (minimal premium). O estilo define layout da home, fontes, neutros, chrome e raios já no scaffold; o agente de Branding refina depois no briefing.
- Se você já tem as credenciais da loja Unbox (
UNBOX_PARTNER_API_KEY,UNBOX_USER,UNBOX_PASS)- Não tem ainda? Sem problema — responda "não" e o projeto sobe em modo mockup
(layout completo, sem dados reais da loja). Preencha
.env.localdepois.
- Não tem ainda? Sem problema — responda "não" e o projeto sobe em modo mockup
(layout completo, sem dados reais da loja). Preencha
- Checkout customizável (código no projeto) ou padrão hospedado da Unbox
- Se quer que ele já rode
npm install
Tudo (menos credenciais) fica registrado em marca/briefing.json do projeto gerado — é a
"memória" do formulário pro agente de Branding não reperguntar nada.
Ao final, o próximo passo é o briefing de marca no Claude Code (não npm run dev):
cd <nome-do-projeto>
claudeO Claude Code abre direto no briefing (agente 15, via .claude/settings.json +
.claude/agents/branding-briefing.md gerados no projeto) e conduz a personalização ANTES de o
cliente ver a loja padrão — regra "perguntar antes de mostrar". Encerrado o briefing, o próprio
agente remove a chave "agent" do .claude/settings.json e as sessões seguintes voltam ao
Claude normal.
Se npx der algum problema no ambiente da outra pessoa (versão de npm diferente), esse caminho
funciona em qualquer npm recente:
npm install -g @unbox-plus/cli
unbox createSe você recebeu a pasta inteira (zip) ou clonou o repositório:
cd unbox-cli
npm install
node bin/unbox.js createnpx --package=@unbox-plus/cli unbox create minha-loja --yes --no-installGera com as cores/nome default e o estilo essencial — use --estilo <nome>
(essencial, promocional, editorial, boutique) pra escolher outro sem interação. Cores e
tokens podem ser editados depois em app/globals.css (bloco "CONFIGURE"); o layout da home
em components/home/home-recipe.ts.
unbox --help # lista os comandos
unbox <comando> --help # uso e exemplos de um comando| Comando | O que faz |
|---|---|
unbox create [pasta] |
gera a loja (o wizard descrito acima) |
unbox provision |
provisiona o repositório e a hospedagem da loja na Unbox e liga o projeto à branch deploy |
unbox env |
envia as variáveis do .env.local para a hospedagem da loja (--list mostra, --unset remove) |
unbox deploy |
commita as mudanças, envia a branch deploy para a Unbox e mostra a URL do preview |
unbox publish [commit] |
publica em produção um commit com preview pronto e acompanha até o fim |
Os demais comandos de publicação (rollback, status) entram nas
próximas versões. Eles falam com a Partners API da Unbox, e por isso todos seguem as mesmas regras
abaixo.
Flags globais, que valem antes ou depois do comando:
| Flag | Padrão | |
|---|---|---|
--help, -h |
ajuda geral, ou do comando quando vem com um | |
--json |
saída para agentes e scripts: um único objeto JSON em stdout ({"ok":true,"data":...} ou {"ok":false,"error":{"code","message"}}, este com data quando o comando já tinha um estado a mostrar, como no publish); o andamento vai para stderr |
|
--yes, -y |
não pede confirmação (no create, gera com os padrões, sem perguntas) |
|
--dir <caminho> |
pasta atual | a pasta do projeto da loja |
--env-file <arquivo> |
.env.local |
o arquivo das credenciais (e das variáveis do unbox env), relativo ao --dir |
Códigos de saída: 0 deu certo, 1 a operação falhou, 2 uso incorreto (comando ou flag que
não existe, valor faltando). O create usa 1 também para uso incorreto, como sempre fez.
Credenciais. Os comandos que falam com a Unbox leem as mesmas variáveis da loja, do
.env.local do projeto (ou do --env-file): UNBOX_PARTNER_API_KEY, UNBOX_USER, UNBOX_PASS
e, opcional, UNBOX_PARTNER_GRAPHQL_URL. O arquivo é lido pelo mesmo parser do Next, então uma
senha que funciona na loja funciona na CLI. Uma variável exportada no terminal vence a do arquivo,
como no Next; por isso a CLI diz de onde veio cada credencial, para uma variável esquecida de outra
loja não passar despercebida. Faltando alguma das três, o comando para e diz qual.
Roda na pasta do projeto: a que o unbox create gerou, ou um projeto seu, com ou sem git.
unbox provision # na pasta do projeto
unbox provision --json # para agentes: um objeto { status, repositorySshUrl, shopId, productionUrl, env }- Provisiona o repositório e a hospedagem da loja na Unbox e espera ficarem prontos. Leva alguns minutos; quando uma etapa falha, o servidor tenta de novo sozinho, e a CLI chama de novo uma vez quando faz sentido. Erros que repetir não resolve (endereço da loja já em uso, por exemplo) param na hora, com o que informar à Unbox. Depois de 30 min, a CLI para e avisa: o provisionamento continua no servidor, e rodar de novo é seguro.
- Liga o git à branch
deployda Unbox, que é onde ounbox deployvai enviar o código:- pasta sem git (ou sem commits): o repositório nasce na
deploy, com os seus arquivos intactos; - repositório com commits: a
deployé criada ao lado da sua branch atual, que não muda (mesmo nome, mesmo histórico). O trabalho de publicação segue nadeploy.
- pasta sem git (ou sem commits): o repositório nasce na
- Envia as variáveis do
.env.localpara a hospedagem, como ounbox env(veja abaixo). Se isso falhar, oprovisiontermina mesmo assim, com um aviso: a loja e o vínculo estão prontos, eunbox envcompleta (no--json,env.error). - Mostra o endereço de produção da loja (
https://<slug>.myunbox.com.br), que exibe "Em breve" até o primeirounbox publish.
Rodar de novo é seguro: mesma chave, nada duplicado. O que convém saber:
- A chave de deploy fica em
~/.config/unbox/keys/<loja>_ed25519, só nesta máquina. É a única credencial do push. Em outra máquina, oprovisionpara e explica: a loja já está ligada à chave da primeira, e a troca é pedida à Unbox. Não copie a chave privada entre máquinas. - O push só confia nas chaves do servidor git da Unbox que vêm na CLI (gravadas em
~/.config/unbox/known_hosts). Se o servidor apresentar outra, o comando para: atualize a CLI e, se continuar, fale com a Unbox. - A CLI não grava
core.sshCommandno repositório: ele valeria para todos os remotes e quebraria umoriginpor SSH (GitHub, por exemplo). Cada comando da CLI passa a chave só nas chamadas que falam com a Unbox. Por isso umgit push unboxfeito à mão não funciona: useunbox deploy. .github/,.gitea/e.forgejo/não vão para a Unbox (o servidor recusa; o GitHub Actions não roda lá). Se o projeto tiver alguma delas, oprovisionpede confirmação (--yesconfirma; com--json, sem--yes, ele para e lista os arquivos). Elas ficam fora dadeploy(o.forgejo/passa a ser o da Unbox) e continuam na sua branch. Oprovisiontambém as põe no.git/info/exclude, para nunca entrarem num commit dadeploy; efeito colateral: arquivos novos nessas pastas deixam de aparecer nogit statusda sua branch também.- Nome e e-mail do git são necessários quando o vínculo cria um commit (projeto com commits).
No terminal, a CLI pergunta e grava só neste repositório; com
--jsonou--yes, ela para e mostra ogit config --globala rodar. - Antes de chamar a Unbox, a CLI confere a pasta e para, sem mudar nada, se: houver mudanças
não commitadas (num projeto com commits), um merge ou rebase em andamento, o HEAD fora de uma
branch, uma branch
deploysua que não é a da Unbox, ou a pasta for parte de outro repositório.
O .env.local não vai no push (está no .gitignore), e sem as variáveis o build da loja falha no
login da Partners API. O unbox env grava as variáveis do arquivo no projeto de hospedagem da loja,
para os builds de preview e de produção. O unbox provision já faz isso no fim; rode de novo
sempre que mudar o .env.local.
unbox env # envia as variáveis do .env.local
unbox env --list # o que está na hospedagem e o que ainda não foi enviado
unbox env --unset CHAVE [CHAVE...] # remove da hospedagem
unbox env --json # { sent, skipped, fromTerminal, keys }- Vão as chaves do arquivo, com o valor que o
next devvê: uma variável exportada no terminal com o mesmo nome vence a do arquivo, e o comando avisa quais. Variáveis que existem só no terminal não vão (se for uma das credenciais, o comando avisa que o build vai falhar). - Não vão, sem atrapalhar as outras: as vazias (numa linha só, porque opcional em branco é
escolha), e, com um aviso por chave, nomes fora do formato (letras
maiúsculas, dígitos e
_, começando por letra), valores acima de 16384 caracteres, e os nomes reservados:TZe os que começam comVERCEL_,NEXT_PUBLIC_VERCEL_,NOW_,AWS_eLAMBDA_. NEXT_PUBLIC_SITE_URLé gerenciada pela Unbox: ela grava o endereço da loja na hospedagem (produção e, quando a loja tem, o endereço fixo de preview), e por isso o lojista não define nem remove. Lojas provisionadas antes de a Unbox passar a gravá-la só ganham a variável numa migração futura. Se a Unbox reservar um nome novo que esta versão da CLI não conhece, o comando acha qual é, pula com aviso e grava o resto.- Só builds novos usam as variáveis. Depois de mudar, rode
unbox deploypara um preview com elas, e publique esse commit. Publicar de novo o que já está no ar não refaz o build. - Repetir é seguro: a gravação substitui o valor. O
unbox envnunca remove o que sumiu do arquivo; para isso existe o--unset. Uma chave removida que continue no arquivo volta no próximounbox env. --listcompara só os nomes. A hospedagem nunca devolve valores, então um valor alterado no arquivo não aparece como pendente: rodeunbox envpara enviar de novo.- Os valores nunca são impressos, nem com
--json. A saída cita só os nomes.
Substitui o antigo ubx save. Roda na branch deploy do projeto, depois do unbox provision.
unbox deploy # commita tudo com a mensagem "unbox: deploy"
unbox deploy -m "nova vitrine" # com outra mensagem
unbox deploy --build # roda npm run build antes, para pegar erro sem gastar um deploy
unbox deploy --json # para agentes: um objeto { commitSha, state, url, previewUrl }- Confere, sem mudar nada: que o projeto está ligado à Unbox (
unbox.shopId,unbox.keyPathcom a chave presente e o remoteunbox; senão, "rode unbox provision"), que você está nadeploy, as credenciais, o nome e e-mail do git, o login e os arquivos protegidos. - Commita tudo o que mudou (
git add -A). Os hooks do projeto (husky, commitlint) não rodam nesse commit nem no push, como no do vínculo. - Envia a
deploylocal para adeployda Unbox, nunca com force. Se a da Unbox estiver à frente, a CLI traz o que ela tem (rebase dos seus commits; merge no primeiro deploy de um projeto com histórico próprio, para não achatar esse histórico) e envia de novo. Conflito: a operação é desfeita, nada é enviado, e a CLI diz como resolver. - Acompanha o build do commit enviado (2 s, 5 s e depois a cada 10 s, até ~15 min) e mostra a
URL do preview desse commit e, quando a loja tiver, o endereço fixo de preview
(
https://preview.<slug>.myunbox.com.br). O endereço fixo mostra sempre o deploy mais recente que terminou com sucesso: pode ser um mais novo que o deste comando, e um build com falha mantém o anterior no ar. Loja sem o endereço Unbox (ou provisionada antes dele): a linha não aparece e o--jsontrazpreviewUrl: null.
O que convém saber:
- Fora da
deploy(namain, por exemplo), o comando para sem commit, sem push e sem rebase, e diz o que rodar:git checkout deploye, para levar as mudanças,git merge <sua-branch>. O push de uma branch que não descende dadeployda Unbox seria recusado. - Nome e e-mail do git: no terminal, a CLI pergunta e grava só neste repositório; com
--jsonou--yes(ou sem terminal), ela para comGIT_IDENTITY_MISSINGantes de commitar e mostra ogit config --globala rodar. A CLI nunca usa uma identidade inventada: o commit é seu. .github/,.gitea/e.forgejo/: mudanças nessas pastas (na árvore ou em commits ainda não enviados) param o comando antes do commit e do push, com a lista e como desfazer. Arquivo novo e não rastreado nelas não conta: oprovisionas pôs no.git/info/exclude.- A chave vai só nas chamadas à Unbox, por
GIT_SSH_COMMANDmontado a partir dounbox.keyPath, com as host keys da CLI. Umoriginpor SSH continua funcionando. FAILURE: o motivo não vem da API. Corrija e rode de novo;--buildmostra o erro aqui. Build que passa aqui e falha na Unbox costuma ser variável de ambiente faltando na hospedagem.- Teto em
PENDING: a CLI para depois de ~15 min e mostra o commit para informar à Unbox. - Nada a enviar (sem mudanças e sem commits novos): avisa e sai com
0; o--jsontrazstate: null.
Substitui o antigo ubx publish. Põe em produção um commit cujo preview está pronto; a Unbox refaz
o build com a configuração de produção e troca o endereço quando termina.
unbox publish # o último commit enviado pelo unbox deploy
unbox publish 3f9c2a1 # um commit enviado antes, pelo hash curto ou completo
unbox publish --yes --json # para agentes: sem pergunta, um objeto com a produção final- Acha o commit na branch
deployda Unbox (depois de um fetch): sem argumento, o topo; com argumento, o hash curto (4 caracteres ou mais) ou completo. Só os commits dadeployda Unbox contam: um commit não enviado, ou reescrito por rebase no envio, para o comando comCOMMIT_NAO_ENVIADO(veja os enviados comgit log --oneline unbox/deploy). Não importa a branch atual: o publish só lê o git. - Confere o preview do commit: com falha, para (
PREVIEW_FALHOU); ainda sendo gerado, espera só se for o último enviado (até ~15 min). Para um commit mais antigo, um preview pendente para o comando (PREVIEW_PENDENTE): só o último commit de cada envio gera preview. - Pede confirmação, mostrando o que está no ar, o commit e o preview.
--yespula; com--jsonou sem terminal, sem--yes, o comando para comCONFIRMACAO_NECESSARIA. - Acompanha a publicação a cada 10 s, até ~25 min. O build de produção costuma levar 1 a 2 min,
e o endereço passa a mostrar o novo conteúdo em até 1 min. Ctrl+C não cancela: a publicação segue
na Unbox, e
unbox publish <commit>volta a acompanhar.
O que convém saber:
- Preview ok não garante produção ok. Produção é um build novo, com a configuração de produção
(variáveis,
VERCEL_ENV,NEXT_PUBLIC_SITE_URL). Se ele falhar (CUSTOM_STOREFRONT_PRODUCTION_BUILD_ERROR), produção continua com o que estava no ar. - Publicar o commit que já está no ar não refaz o build: o comando avisa e sai com
0(alreadyLive: trueno--json). Variáveis mudadas comunbox envpedem um commit novo (git commit --allow-empty),unbox deployeunbox publish. - Uma operação por vez: com outra publicação ou rollback em andamento, o comando para com
CUSTOM_STOREFRONT_PRODUCTION_BUSY_ERRORe diz qual;unbox publish <commit dela>a acompanha. - Previews ficam 90 dias. Para publicar um commit mais antigo, crie um commit novo (ainda que
vazio), rode
unbox deploye publique esse. - Permissão própria: publicar exige uma permissão separada da de deploy; sem ela, o comando diz para pedir a liberação à Unbox.
- De outra máquina ou de um CI, sem o projeto ligado, o hash completo basta (com as credenciais).
--json:{ state, commitSha, url, publishedAt, rollbackCommitSha, canRollback, operation, alreadyLive }. Numa falha depois de ler a produção, o erro traz a mesma produção emdata.
- Sempre com
--package=@unbox-plus/cli.npx unboxsem ele baixa outro pacote do NPM, que também se chamaunboxe não tem nada a ver com este. npx @unbox-plus/cli(sem--package=) deixou de funcionar. O pacote agora tem dois comandos,unboxecreate-unbox-store, e onpxnão sabe qual rodar. Usenpx --package=@unbox-plus/cli unbox ...ou instale global (npm install -g @unbox-plus/cli).
Quem escolhe "Padrão da Unbox" no wizard não precisa fazer nada: o CLI monta a URL certa. Quem
preencher UNBOX_HOSTED_CHECKOUT_URL à mão depois precisa das duas:
- Caminho completo, não o domínio.
https://sualoja.com.br/carrinho/finalizar-pedido. A raiz é a home da loja e ignora os parâmetros em silêncio. - Loja e checkout no mesmo domínio. Com a loja em um host e o checkout em outro, o cliente cai
no
/login. Com os dois sob o mesmo domínio, funciona.
A URL carrega ?id=&token=&freq=&step=1. O token faz parte do contrato: sem ele, o checkout não
encontra o carrinho.
Preencha NEXT_PUBLIC_GTM_ID. O container da marca convive com o container central da Unbox: são
dois independentes lendo o mesmo dataLayer. Três coisas que não são óbvias:
- Com o container preenchido, o Pixel do código é desligado automaticamente. Pixel no
container e no código conta
PageViewduas vezes, e a inflação é silenciosa. - Quem configura o container precisa saber: numa SPA, o gatilho "All Pages" só pega o
carregamento inicial. Para contar troca de rota, a tag de pageview escuta o evento
personalizado
dataLayerReady, que a loja emite em toda rota principal (compageTypee os produtos em vista). O gatilho nativo "History Change" também funciona. - Ligar o Pixel derruba o Best Practices do Lighthouse de 100 para ~77
(
third-party-cookies). Não tem conserto no front, é como o Pixel funciona. A mitigação é a API de Conversões server-side, que já vem pronta emapp/api/capi/route.tse no webhook de pagamento.
- Node.js ≥ 20 (recomendado: 22 LTS — veja
.nvmrcno projeto gerado) - Credenciais da loja Unbox (
UNBOX_PARTNER_API_KEY,UNBOX_USER,UNBOX_PASS) — opcional pra rodar em modo mockup, obrigatório antes de ir pra produção (npm run unbox:testconfirma a conexão)
Next.js 15 (App Router) + Tailwind v4 + shadcn/ui sobre Base UI, com catálogo, carrinho,
checkout, área do cliente (OTP login, pedidos, assinaturas, endereços), páginas legais, PWA e
SEO básico já implementados — ver DEPLOY.md e QA.md dentro do projeto gerado para o checklist
de deploy na Vercel.
A foundation inclui alguns placeholders que funcionam, mas precisam de uma decisão consciente antes de a loja ir ao ar. Nenhum deles quebra o projeto — o CLI não resolve isso automaticamente de propósito, para não tomar essa decisão no lugar de quem está publicando.
- Prova social: a foundation não traz nenhuma. Sem avaliação real em
lib/enrichment/products.json, a loja não mostra nota, estrelas, contagem nem depoimento (o bloco some, não cai em placeholder). Antes de publicar, decida: popular com dados reais ou publicar sem prova social. O agente 15 (Branding) pede esse material no briefing. Ounbox:honestidadelista qualquer número ou promessa que entrar sem lastro. - Módulos de CRO — só 1 de 10 na foundation. Dos 10 módulos do "Unbox AI CRO Package"
(prova social, urgência de estoque, countdown, frete grátis, upsell, recently viewed, sticky
CTA, trust strip, kits, brindes), só a barra de frete grátis vem pronta. Os outros nove
são construídos pelo agente
13-cro.md, que o briefing oferece ao terminar — o wizard não pergunta mais sobre isso (perguntava, gravava num arquivo que ninguém lia, e o agente 13 perguntava de novo). - SEO avançado — o básico está, os 7 módulos não. A foundation traz JSON-LD de produto,
Organization + WebSite/SearchAction na home, imagem Open Graph gerada e canonical por
página. Breadcrumbs, FAQ schema, OG por produto e templates de título/description por
página são do agente
14-seo.md. - Kits/combos vêm vazios (
lib/enrichment/combos.ts) — a seção só aparece na loja depois de alguém popularCOMBOScom os kits reais.
Todo projeto gerado já vem com agents/MANAGER.md — descreve exatamente o que cada agente
resolve e a ordem recomendada dos passos manuais: 15 (Branding) primeiro, depois os opcionais
13 (CRO) e 14 (SEO), e por último 12 (Deploy).
A loja gerada nasce editável pelo editor da Unbox (chat e painel visual sobre um documento de conteúdo). O que o template traz, e que não pode ser removido sem desligar o editor em silêncio:
lib/editable/(a foundation do editor, cópia byte a byte; correção entra por versão, nunca à mão), com o slug da loja carimbado emconfig.tsno scaffold.next.config.tscomframe-ancestorsparaNEXT_PUBLIC_EDITOR_ORIGIN(variável de BUILD: precisa existir antes donext build).app/api/revalidateaceitando o token do editor e devolvendo o recibo comconteudo.middleware.tsdeixando passar o token de prévia e as rotas/api/unbox/*.app/api/unbox/paginas,catalogoevitrine, elib/rotas-editaveis.tscom as tabelasSO_CHROMEeCONTAINERS_POR_ROTA: rota nova entra na tabela ou o gate reprova.app/layout.tsxcom oEditableProvidere a linha única<Rastreio />(GTM, GA4, Meta Pixel, TikTok, Pinterest e WhatsApp decididos pela foundation).- Home, cabeçalho, rodapé, catálogo e página de produto com primitivos; ids de seção são chaves de arquivo e não têm renomear.
Gate: npm run unbox:editavel mede toda página que a loja declara. Saída 0 = aprovado; 1 = reprovado dizendo qual página; 2 = não rodou (rota dinâmica sem exemplo, por exemplo sem catálogo), nunca aprovação.
Variáveis: EDITOR_URL, NEXT_PUBLIC_EDITOR_ORIGIN, UNBOX_EDITOR_SHOP (opcional: sobrepõe o slug carimbado). META_CAPI_TOKEN é segredo de servidor e nunca entra no documento do editor.
A loja diz quem é e onde vive (0.20.4): /api/unbox/paginas responde loja: { slug, nome, url }. É por isso que o editor acha a loja sem registro nenhum (https://<slug>.myunbox.com.br) e, quando NEXT_PUBLIC_SITE_URL é o domínio próprio (https), confirma lá e abre a loja por ele: prévia, publicação e revalidação vão para o domínio de verdade. Em produção, NEXT_PUBLIC_SITE_URL certo é o único cuidado; http://localhost (dev) não é declarado. No build do endereço fixo de preview, a variável é esse endereço, e é ele que a rota declara ali; o editor consulta a loja pelo endereço de produção, e lá a rota declara o endereço de produção.
O lojista cria páginas, artigos e coleções (0.21.0). A loja nasce com quatro rotas que servem o que o lojista escreve no editor: /paginas/<endereco> (página avulsa), /<colecao>/<endereco> (artigo), /<colecao> (listagem) e /<colecao>/pagina/N (as seguintes), mais /previa-do-editor, por onde o editor abre uma página antes de ela existir na loja. A coleção que nasce com a loja é o blog, declarada em lib/paginas-do-lojista.ts; trocar o rótulo e o endereço dela é uma linha. O corpo da página é montado com as mesmas seções da home, mais uma seção de Texto com parágrafo, negrito, link, lista, subtítulo e citação. SEO: título, descrição, endereço canônico, Open Graph, dados estruturados (artigo, página, listagem e migalhas) e sitemap com a data de alteração verdadeira, tudo derivado do documento.
A prévia dessas páginas depende do editor: a loja só abre a prévia com uma assinatura que confere. Editor mal configurado do lado dele, toda prévia de página do lojista responde 404, e o log da loja diz isso em uma linha. A loja publicada não é afetada.
A seção "Editor: o que não pode quebrar" do CLAUDE.md do template lista cada ponto com o que acontece se for tocado.