---
title: "Como funciona a validação de checkout do Shopify (e como os apps a usam para bloquear pedidos)"
description: "Como funcionam as Functions de Cart and Checkout Validation do Shopify: onde rodam e onde não rodam, quais dados uma Function enxerga, o que ela pode e não pode fazer, quais planos podem usá-la e como apps como o OrderRules a usam para bloquear pedidos."
contentType: "blog"
locale: "pt-br"
localized: true
source: "https://orderrules.com/pt-br/blog/shopify-checkout-validation-functions-block-orders"
slug: "shopify-checkout-validation-functions-block-orders"
date: "2026-05-03"
tags:
  - "shopify"
  - "checkout validation"
  - "shopify functions"
  - "server-side validation"
  - "block checkout outside business hours"
  - "order limits"
---
**A validação de checkout do Shopify é uma Shopify Function, da Cart and Checkout Validation API, que um app instala na sua loja.** O Shopify a executa nos próprios servidores sempre que um carrinho ou checkout muda. Se a Function retornar um erro, o checkout mostra a mensagem e o comprador não consegue concluir o pedido até corrigir o problema. Ela roda no checkout normal, em botões expressos como Shop Pay e Apple Pay, em checkouts headless e em pedidos preliminares, em qualquer plano do Shopify quando vem de um app público. Ela não roda no POS, em renovações de assinatura, em edições de pedido nem em pedidos criados pela API. Ela pode bloquear um pedido, mas não pode alterar o carrinho nem reservar estoque.

Última verificação: **8 de outubro de 2026**, na documentação para desenvolvedores e na central de ajuda do Shopify. As fontes estão no final.

*Aviso: o OrderRules é um app de validação de checkout. Este guia explica primeiro a plataforma Shopify e depois como nós a usamos.*

![Validação de checkout comparada com apps de script no carrinho no checkout padrão, Shop Pay, Apple Pay, Google Pay, links diretos de checkout e vitrines headless](/images/blog/shopify-checkout-validation-functions-block-orders.png)

## O que é uma Function de validação

O Shopify Functions permite que apps adicionem a própria lógica ao backend do Shopify. Cada API de Function cuida de uma tarefa: descontos, opções de entrega, formas de pagamento e assim por diante. A validação é a que decide se um carrinho pode passar pelo checkout.

Funciona assim:

1. **Um app entrega a Function.** Ela é compilada em WebAssembly e implantada com o app. Você instala o app; não mexe em código.
2. **Quem executa é o Shopify, não o seu tema.** A Function roda dentro da infraestrutura do Shopify, não no navegador do cliente. Desativar o JavaScript ou editar a página não a contorna.
3. **Ela lê uma entrada e retorna erros.** O Shopify passa o carrinho e os dados relacionados. A Function retorna uma lista de erros, cada um com uma mensagem e um alvo (o carrinho inteiro ou um campo específico).
4. **O checkout mostra a mensagem.** Lista vazia: o checkout continua. Qualquer erro: o Shopify mostra as mensagens e bloqueia a conclusão até o comprador mudar algo.

O Shopify executa a Function em vários pontos da jornada do comprador: interações com o carrinho, interações com o checkout e conclusão do checkout. Uma Function pode verificar em qual etapa está e decidir bloquear só no checkout, para que adicionar ao carrinho nunca falhe.

O Shopify mantém as Functions pequenas e rápidas. Cada execução tem limites rígidos de instruções e de tamanho da entrada, então a lógica precisa ser simples e os dados, compactos.

Aqui vai um exemplo simplificado em JavaScript do target atual, `cart.validations.generate.run`. É ilustrativo, não é o código do OrderRules:

```javascript
// Exemplo simplificado, não é código de produção.
// A entrada vem de uma consulta de entrada GraphQL (linhas do carrinho, identidade do comprador, metafields).
export function cartValidationsGenerateRun(input) {
  const limits = input.shop.limits?.jsonValue ?? {}; // gravado pelo app com antecedência
  const errors = [];

  for (const line of input.cart.lines) {
    const productId = line.merchandise.product?.id;
    const remaining = limits[productId];
    if (remaining !== undefined && line.quantity > remaining) {
      errors.push({
        message: `Only ${remaining} left for today. Lower the quantity to continue.`,
        target: "$.cart",
      });
    }
  }

  return { operations: [{ validationAdd: { errors } }] };
}
```

Repare no que falta: nenhuma consulta a banco de dados, nenhuma chamada de API, nenhum "contar os pedidos de hoje". A Function só enxerga o que está na entrada dela. Isso define tudo o que vem a seguir.

## Onde ela roda e onde não roda

O Shopify documenta quais superfícies executam Functions de validação. A tabela segue a referência da Cart and Checkout Validation API.

| Superfície | A validação roda? | Observações |
|---|---|---|
| Carrinho e checkout da loja virtual | **Sim** | Carrinho e checkout aparecem separados; ambos suportados |
| Shop Pay, Apple Pay, Google Pay, PayPal expresso, Comprar agora | **Sim** | Listados como Storefront Accelerated Checkout |
| Vitrines headless (Storefront API) | **Sim** | Hydrogen e front-ends personalizados incluídos |
| Checkout B2B | **Sim** | Compradores de empresas passam pela mesma validação |
| Pedidos preliminares (admin e checkout por fatura) | **Sim** | Listados como Draft Order (Admin and Checkout) e Shopify Admin |
| Shopify POS | **Não** | Vendas na loja física não são validadas |
| Pedidos de renovação de assinatura | **Não** | Só o primeiro checkout da assinatura é validado |
| Edições de pedido | **Não** | Editar um pedido depois da compra pula a validação |
| Create Order API | **Não** | Pedidos criados por outros apps ou integrações |
| Pré-venda e experimente antes de comprar | **Não** | Opções de compra com pagamento adiado não são suportadas |

Então "não pode ser contornada" não é exato. Um cliente não consegue pular a validação pela loja virtual ou por um botão expresso. Mas um pedido do POS, de uma renovação, de uma edição ou da API nunca passa por ela. Se você depende de um limite, verifique quais desses canais a sua loja usa.

## O que uma Function enxerga

Uma Function declara uma **consulta de entrada**, escrita em GraphQL, e o Shopify a preenche a cada execução. Campos úteis incluem:

- **Linhas do carrinho:** quantidade, variante, produto, peso, atributos da linha.
- **Identidade do comprador:** se o comprador está logado e, para clientes, campos como número de pedidos e valor gasto.
- **Metafields:** da loja, de produtos, variantes e clientes.
- **Atributos do carrinho:** por exemplo, uma data de entrega escolhida na página do carrinho.
- **A etapa da jornada do comprador:** interação com o carrinho, interação com o checkout ou conclusão do checkout.

O que ela não pode fazer num app público: acessar a rede. Ela não pode perguntar ao servidor do app "quantos pedidos hoje?" durante o checkout. Em vez disso, o app faz a contagem em outro lugar. Ele escuta as notificações de pedido do Shopify, atualiza os totais e os grava em metafields. A Function lê esses metafields na execução seguinte.

É por isso que as contagens numa Function são **retratos do momento**. São tão recentes quanto a última gravação no metafield, não ao vivo.

## O que ela pode e não pode fazer

**Ela pode bloquear com uma mensagem.** Essa é toda a saída dela. As mensagens podem ter como alvo o carrinho inteiro ou um campo específico do checkout, e um app pode deixar você escrever o seu próprio texto.

**Ela não pode mudar quantidades.** Uma Function de validação não pode reduzir uma quantidade, remover uma linha nem alterar um preço. Os antigos Shopify Scripts podiam editar o carrinho silenciosamente; a validação não pode. O comprador lê a mensagem e corrige o carrinho. Outras APIs de Function, como Cart Transform ou descontos, cuidam de mudanças no carrinho, e elas não bloqueiam o checkout.

**Ela não pode reservar estoque nem vagas.** A Function lê um retrato do momento e diz sim ou não. Ela não segura nada. Se dois compradores finalizarem a compra da última unidade, ou da última vaga numa janela de entrega, quase no mesmo instante, os dois podem ler "resta 1" e os dois podem passar. A validação torna os limites confiáveis com tráfego normal. Ela não garante que você nunca ultrapasse.

**Até 25 Functions de validação por loja.** O Shopify limita quantas Functions de validação podem estar ativas ao mesmo tempo. Vários apps podem adicionar uma cada, e todas rodam; se qualquer uma delas retornar um erro, o checkout é bloqueado.

## Planos

- **Apps públicos da App Store com Functions funcionam em todos os planos do Shopify.** Você não precisa do Plus para instalar um app de validação.
- **Apps personalizados com Functions exigem o Shopify Plus.** Isso vale para lojas que constroem a própria Function privada.
- **O Shopify Scripts acabou.** Os Scripts pararam de rodar em 30 de junho de 2026. Muitos limites de quantidade ficavam em line item scripts. Se os seus ficavam, veja [como substituir o Shopify Scripts por Functions em regras de quantidade e checkout](/blog/shopify-scripts-to-functions-order-limits).

## JavaScript do tema vs validação

Muitas ferramentas de limite rodam no tema: escondem um botão, limitam um campo de quantidade ou mostram um aviso na página do carrinho. Isso é útil para mostrar os limites cedo. Não é aplicação de regra.

| | JavaScript do tema ou da página do carrinho | Function de validação |
|---|---|---|
| Checkout normal da loja virtual | Só se o comprador passar pela página do carrinho com JavaScript ativado | **Sim** |
| Botões do Shop Pay, Apple Pay e Google Pay nas páginas de produto | Não, eles pulam a página do carrinho | **Sim** |
| Links diretos de checkout | Não | **Sim** |
| Vitrines headless | Não, não existe tema | **Sim** |
| Pedidos preliminares | Não | **Sim** |
| POS | Não | Não |
| Renovações de assinatura, edições de pedido, pedidos pela API | Não | Não |
| Pode mostrar limites antes do checkout | **Sim** | Não, só mensagens quando o carrinho é verificado |
| Pode ser contornado desativando o JavaScript | Sim | Não |

Nenhum dos dois cobre o POS ou as renovações. A melhor configuração usa os dois: mensagens na vitrine para os clientes verem os limites cedo e uma Function de validação como bloqueio definitivo no checkout.

O mesmo vale para datas de entrega. Um seletor de data deixa em cinza os dias lotados ou fechados no navegador, mas os botões expressos e os links diretos de checkout pulam a página em que o calendário está. Só uma Function de validação verifica de novo a data escolhida no checkout. Veja como os [apps de seletor de data de entrega para Shopify se comparam na validação de checkout](/blog/best-shopify-delivery-date-picker-apps).

## Como o OrderRules a usa

O OrderRules instala uma Function de validação. Você define as regras no app; o app mantém as contagens e as grava em metafields; a Function as lê no checkout e bloqueia pedidos que quebram uma regra. Ela verifica:

- **Horário de funcionamento e feriados:** fecha o checkout fora do seu horário.
- **Limites de pedidos:** limites diários para a loja toda, além de limites semanais e mensais nos planos pagos.
- **Limites de produto, variante e coleção:** totais compartilhados entre todos os clientes.
- **Quantidade mínima de pedido e incremento de quantidade:** por produto ou variante, por pedido.
- **Limites por cliente:** pedidos, unidades, gasto ou peso por período, para clientes logados.
- **Datas de entrega e janelas de retirada** no plano Advanced: horários de corte, datas bloqueadas e limites por janela.

A mensagem de cada tipo de regra é editável em Configurações. As regras são verificadas em todas as superfícies da tabela acima em que a validação roda. Pedidos do POS e renovações não são bloqueados, mas continuam contando para os seus limites. As contagens são retratos do momento, então dois checkouts quase simultâneos pela última vaga podem passar os dois.

A aplicação no checkout está incluída em todos os planos, inclusive no plano gratuito Starter. Todos os detalhes: [onde as regras do OrderRules são verificadas: compatibilidade e limitações](/docs/guides/compatibility-and-limitations).

## Leitura relacionada

- [Como definir limites de pedido no Shopify](/blog/how-to-set-order-limits-shopify)
- [Evite vender além do estoque: estratégias para lojas com capacidade limitada](/blog/prevent-overselling-shopify)
- [Limites de pedido por cliente: um guia](/blog/per-customer-order-limits-shopify-guide)
- [Mensagens dinâmicas na vitrine](/docs/guides/storefront-messaging)
- [Melhores apps de seletor de data de entrega para Shopify, comparados na validação de checkout](/blog/best-shopify-delivery-date-picker-apps)
- [Limites de pedido nativos do Shopify vs apps (2026)](/blog/shopify-native-order-limits-vs-orderrules)
- [Onde as regras do OrderRules são verificadas: compatibilidade e limitações](/docs/guides/compatibility-and-limitations)
- [Como substituir o Shopify Scripts por Functions em regras de quantidade e checkout](/blog/shopify-scripts-to-functions-order-limits)

## Fontes

- Shopify.dev: [Cart and Checkout Validation Function API](https://shopify.dev/docs/api/functions/latest/cart-and-checkout-validation) (targets, superfícies suportadas e não suportadas, limite por loja)
- Shopify.dev: [Criar uma Function de validação de carrinho e checkout](https://shopify.dev/docs/apps/build/checkout/cart-checkout-validation)
- Shopify.dev: [Shopify Functions](https://shopify.dev/docs/apps/build/functions) (disponibilidade por plano para apps públicos e personalizados)
- Changelog do Shopify.dev: [O Shopify Scripts será descontinuado em 30 de junho de 2026](https://shopify.dev/changelog/shopify-scripts-will-be-deprecated-on-june-30-2026)
- Central de Ajuda do Shopify: [Transição do Scripts para o Functions](https://help.shopify.com/en/manual/checkout-settings/script-editor/transitioning-to-functions)

## Experimente na sua loja

Instale o OrderRules pela [Shopify App Store](https://apps.shopify.com/orderrules-limit-sales?utm_source=blog&utm_medium=inline_cta&utm_campaign=shopify-checkout-validation-functions-block-orders). A validação de checkout está incluída em todos os planos, e os planos pagos têm um teste grátis de 14 dias.
