Tema
v0.1.6
Data de lançamento: 3 de maio de 2026
Novas Funcionalidades
Reduções de Preço em Conformidade com a UE
- Os produtos têm uma nova opção "Mostrar preço anterior" no formulário do produto para optar pela exibição de uma redução de preço
- O preço riscado na loja agora utiliza o menor preço dos últimos 30 dias, conforme a Diretiva Omnibus da UE — e não o preço anterior inserido manualmente
- O formulário do produto avisa quando nenhuma badge de promoção será exibida (porque o preço atual não é menor que o mínimo de 30 dias), para que os admins saibam que a redução não aparecerá
- As alterações de preço são registradas automaticamente e um cron semanal remove o histórico com mais de 90 dias
Preço Unitário
- Os produtos agora podem declarar uma quantidade e uma unidade (kg, g, L, ml, m, cm, m²), e a loja exibe uma linha "por kg" / "por L" / etc. abaixo do preço nos cards, na página do produto, na coleção e na busca
- Produtos vendidos por unidade ("por item") estão isentos do preço unitário, conforme exigido pela diretiva
- O preço unitário é exportado para o feed do Google Merchant como
unit_pricing_measureeunit_pricing_base_measure
Preços com Imposto Incluído na Loja
- Todos os preços exibidos na loja (cards, página de produto, carrinho, checkout, e-mails de pedido) agora sempre incluem o imposto, conforme exigido para vendas B2C na UE
- A página do produto exibe um aviso quando uma regra de imposto possui sobreposições por país, sinalizando que o valor final pode ser recalculado no checkout assim que o país de cobrança do cliente for conhecido
- O formulário de produto do admin tem uma nova prévia de imposto que mostra o que cada país será cobrado quando uma regra de imposto possui sobreposições por país
Endereço de Cobrança no Checkout
- O fluxo de checkout tem uma nova etapa de endereço de cobrança: manter o endereço de entrega (padrão), escolher um endereço salvo ou inserir um novo
- Os clientes podem opcionalmente salvar um endereço de cobrança personalizado em sua agenda para pedidos futuros
- Alterar o país de cobrança limpa o método de pagamento selecionado e qualquer Stripe PaymentIntent em andamento, para que os impostos sejam recalculados para o novo país
- Os e-mails de confirmação de pedido e a página de histórico de pedidos do cliente exibem os endereços de entrega e cobrança separadamente quando são diferentes
- A visualização administrativa do pedido mostra entrega e cobrança lado a lado
Melhorias
Dashboard de Analytics
- As tabelas nas páginas de Tráfego, Produtos e Carrinhos Abandonados agora usam paginação no servidor, mantendo lojas grandes responsivas
- A interface do gráfico de funil foi refinada para uma visualização mais clara dos pontos de abandono
- As sessões de admins autenticados são excluídas do analytics para que os números reflitam a atividade real dos clientes
- Os caminhos de página são normalizados para que a mesma página lógica não se fragmente em várias linhas
Pedidos
- Novo filtro de origem do pedido na lista de pedidos separa os pedidos de checkout dos pedidos criados manualmente
- A criação de pedidos manuais bloqueia e-mails de placeholder quando um e-mail real do cliente está disponível, garantindo que as notificações cheguem à caixa certa
Onboarding
- A etapa de Idiomas agora pré-seleciona Inglês, Espanhol, Holandês e Português (antes apenas Inglês); os admins ainda podem ajustar a lista
Estabilidade do Checkout
- Locks consultivos e atualizações de snapshot serializáveis protegem ações concorrentes de checkout contra condições de corrida
- As datas no seletor de data do checkout e nos e-mails de pedido agora respeitam o locale do cliente
Envio e Locale
- Os limites mínimos de pedido para envio agora são comparados com o subtotal + imposto menos qualquer desconto de mercadoria, alinhado ao que o cliente vê no resumo do pedido (cupons exclusivos de envio são excluídos do desconto)
- As páginas da loja renderizadas no servidor e os e-mails de pedido resolvem o idioma pela preferência salva do cliente, depois pelo cookie
locale, depois pelo primeiro idioma habilitado pela loja, com fallback para Inglês — assim, um cookie desatualizado não renderiza mais um idioma que a loja tenha desativado
Operações
- Uma nova variável de ambiente opcional
ENABLE_AUTH_RATE_LIMITpermite que operadores desativem o rate limit do Better Auth em ambientes de CI e teste; o comportamento em produção permanece inalterado a menos que a variável seja explicitamente definida
Correções de Bugs
- A mesclagem de carrinhos agora valida o estoque para ambos os lados e notifica os clientes quando as quantidades são ajustadas
- Um toast de aviso é exibido dois minutos antes da expiração da reserva do carrinho
- Os handlers de webhook do Stripe (sucesso e falha) agora são idempotentes e usam guards atômicos para evitar processamento duplicado
- Aplicar e remover cupons é serializado pelo lock do checkout; cupons de uso único por cliente não contam mais pedidos cancelados ou com falha de pagamento
- A revalidação de cupons de envio é ignorada quando o cliente troca de país antes de escolher um método de envio
- O cohort do visitante é persistido no snapshot do pedido para que os eventos de compra do servidor permaneçam no cohort correto
- O botão Cancelar no formulário de edição de usuário agora redefine os campos sem deixá-los marcados como modificados
Correções de Segurança
- O canal do iframe do page builder agora está restrito a postMessage de mesma origem
- As operações PATCH e DELETE de endereço agora são vinculadas à propriedade no nível SQL
- Rate limit por IP é aplicado no endpoint de webhook do Stripe
- As queries agregadas de analytics agora usam chamadas parametrizadas de
make_interval()em vez de interpolação de string - A tolerância de timestamp do
constructEventdo Stripe está fixada em 300 segundos Order.stripePaymentIntentIdagora tem um índice único e o webhook usafindUniquepor segurança