VenddorDocumentação API
API atualAPI legada
Guia rápidoReferência completa
Carregando índice…
API atual/Referência completa

Promoções e cupons

Como as promoções funcionam, como se combinam com cupons e como criá-las pela API do administrador.

Uma promoção é uma regra de desconto que a loja cadastra uma vez e a plataforma aplica sozinha no carrinho ou no preço da vitrine. Quando a promoção tem um código ela funciona como cupom: o cliente precisa digitar o código. Sem código ela é automática. Estas são as rotas do administrador da loja (/api/v1/admin/...); a vitrine e o checkout leem as mesmas promoções para calcular o que o cliente paga.

Pontos-chave
  • Exige o módulo promotions ligado. Desligado, todas as rotas respondem 403 com {"error":"module_disabled","module":"promotions"}.
  • Ler exige o privilégio view_promotions (ou manage_promotions); criar, alterar e excluir exigem manage_promotions.
  • Dinheiro é inteiro em centavos e percentual é em pontos-base: 1000 = 10%, 10000 = 100%.
  • O status é gravado e devolvido como letra: A ativa, D inativa, E expirada. Na entrada você pode enviar active, inactive, disabled ou expired.
  • Todos os ids de promoção são UUID completos (36 caracteres). Um id cortado leva 400, não 404.
  • A exclusão é lógica: a promoção some da lista e o código dela volta a ficar livre.

Como funciona

Ciclo de vida

Criada→Ativa→Inativa ou Expirada→Excluída
statusSignificadoAplica no carrinho?
AAtiva. Vale entre valid_from e valid_until.Sim, dentro da vigência e do limite de uso
DInativa (também usada como rascunho).Não
EExpirada.Não

Uma promoção ativa só desconta quando a vigência está aberta (valid_from já passou e valid_until ainda não), o limite de usos (usage_limit, per_user_limit) não foi atingido, as condições batem com o carrinho e nenhum orçamento associado (veja Orçamentos e grupos) está esgotado.

Fluxo típico de integração

  1. Escolha a zona e o tipo
    Decida se o desconto aparece no preço do produto (catalog) ou só quando o cliente monta o carrinho (cart), e qual type usar.
  2. Crie a promoção
    POST /api/v1/admin/promotions com nome, tipo, desconto e, se for cupom, o code. Veja Criar promoção.
  3. Confira o cupom
    POST /api/v1/admin/coupons/validate diz se o código seria aceito e qual desconto daria. Veja Cupons.
  4. Acompanhe o resultado
    GET /api/v1/admin/promotions/stats mostra usos, clientes únicos e desconto concedido. Veja Estatísticas e projeção.
  5. Encerre
    Desative com PUT (status inactive) ou exclua. Para muitas de uma vez use Ações em lote.

Conceitos importantes

Tipos de promoção (type)

Os tipos do editor do painel são quatro. Os demais existem para o modelo de bônus e para promoções criadas por integração.

typeO que fazdiscount
percentagePercentual de desconto.Pontos-base, de 1 a 10000
fixedValor fixo de desconto.Centavos
free_shippingFrete grátis (opcionalmente só para uma forma de envio, em free_shipping_method_id).Pode ser 0
buy_x_get_yCompre X leve Y. Exige conditions.buy_x_get_y com buy_quantity e get_quantity maiores que zero.Pode ser 0
to_percentage, to_fixedO preço final passa a ser o valor indicado, em vez de "tantos por cento a menos".Pontos-base ou centavos
order_discount, product_discount, category_discount, free_products, give_usergroup, give_coupon, free_product, assign_usergroupTipos herdados do modelo de bônus. Em integrações novas prefira percentage, fixed e a lista bonuses.Conforme o tipo

Um valor fora da lista leva 400 e a mensagem traz todos os tipos aceitos. Um desconto negativo, ou um percentage acima de 10000, também é recusado.

Zona: catálogo ou carrinho

  • catalog: o desconto entra no preço do produto na vitrine, na busca e na mini-loja. Só enxerga condições do produto (produto, categoria, seller, preço, quantidade, usuário). Condições de carrinho (subtotal, frete, forma de pagamento, cupom) são recusadas com 400.
  • cart: o desconto é calculado quando o cliente monta o carrinho e no checkout. Aceita todas as condições.

Se você não enviar zone, a plataforma escolhe cart para buy_x_get_y, para tipos que o catálogo não calcula e para qualquer promoção com código; as demais ficam em catalog. Uma zona escrita à mão que não calcula o tipo (por exemplo buy_x_get_y em catalog) é recusada com 400.

Condições

conditions é um objeto simples, todas as chaves opcionais:

ChaveTipoSignificado
min_cart_totalinteiro, centavosSubtotal mínimo do carrinho.
product_idslista de UUIDPelo menos um item do carrinho precisa ser um destes produtos.
category_idslista de UUIDPelo menos um item precisa ser de uma destas categorias.
exclude_product_idslista de UUIDNenhum item pode ser destes produtos.
user_group_idslista de UUIDSó vale para clientes destes grupos de usuários.
vendor_idslista de UUIDSó vale para itens destes sellers.
buy_x_get_yobjetoMecânica do brinde: buy_product_ids, buy_quantity, get_product_ids, get_quantity, discount_percent (1 a 100; 100 = de graça).

Para regras com E/OU use condition_groups: um objeto {"set":"all"|"any","set_value":true,"conditions":[...]} cujas folhas são {"type":"subtotal","operator":"gte","value":20000} e que podem ter grupos dentro de grupos. Operadores: eq, neq, lt, gt, lte, gte, in, nin, cont, ncont. Tipos de folha válidos em qualquer zona: price, product_quantity, categories, products, vendor, users, feature. Só na zona cart: subtotal, products_number, total_weight, country, state, zip_postal_code, customer_state, customer_city, customer_cep_range, shipping_zone, customer_region, payment_method, shipping_method, coupon_code, multiple_coupon_codes, once_per_customer, number_of_usages, purchased_products, usergroup, product_qty, product_min_qty, category_qty, category_min_qty, first_order, first_order_only, once_per_cnpj, days_since_last_order, no_orders_in_days, categories_purchased_in_period, categories_prev_month, avg_ticket_p6m, loyalty_tier. Um tipo desconhecido é recusado, nunca ignorado.

Cupom: um código por promoção

O campo code guarda um código por promoção. A plataforma o grava em maiúsculas, sem caracteres invisíveis (por exemplo o espaço de largura zero que o WhatsApp cola junto) e a busca na hora de usar ignora maiúsculas e minúsculas. Dois códigos iguais não podem existir em promoções não excluídas: o segundo leva 409 coupon_code_in_use. Para ter muitos códigos descartáveis a partir de uma promoção-modelo use generate-auto-coupons (veja Cupons).

Quem é o dono: loja toda ou seller

vendor_id vazio significa promoção da loja/marketplace: entra no cálculo automático. Com vendor_id preenchido a promoção é de um seller, o desconto incide só sobre os itens dele e ela só funciona por código de cupom, nunca de forma automática.

Proteções que a API aplica por você

  • Loja toda por engano. Uma promoção de catálogo sem nenhum produto nem categoria vale para a loja inteira. Para gravá-la você precisa confirmar com ?confirm_store_wide=true; sem isso a resposta é 400 store_wide_unconfirmed. A mesma pergunta aparece quando uma edição muda o alcance e o resultado é a loja toda.
  • Piso de margem. Se a loja usa o Protetor de Margem, uma oferta que leva algum produto abaixo da margem mínima é recusada com 422 e o detalhamento da conta. Um token de exceção aprovado vai no cabeçalho X-Margin-Override.
  • Campo desconhecido não passa calado. Chaves do corpo que a rota não conhece são devolvidas em ignored_fields e warning (e no cabeçalho X-Campos-Ignorados). Um PUT que não muda nada leva 400 em vez de 200.

Endpoints

Método e caminhoPara que serveAuthPágina
GET /api/v1/admin/promotionsLista as promoções com filtrosadminListar e detalhar
GET /api/v1/admin/promotions/{id}Detalha uma promoçãoadminListar e detalhar
POST /api/v1/admin/promotionsCria uma promoçãoadminCriar promoção
PUT /api/v1/admin/promotions/{id}Altera uma promoçãoadminAlterar e excluir
DELETE /api/v1/admin/promotions/{id}Exclui (lógica) uma promoçãoadminAlterar e excluir
POST /api/v1/admin/promotions/bulkAtiva, desativa ou exclui váriasadminAções em lote
GET /api/v1/admin/promotions/{id}/couponsMostra o cupom da promoçãoadminCupons
POST /api/v1/admin/promotions/{id}/couponsDefine o código da promoçãoadminCupons
POST /api/v1/admin/promotions/generate-auto-couponsGera códigos descartáveisadminCupons
POST /api/v1/admin/coupons/validateSimula a validade de um códigoadminCupons
GET /api/v1/admin/promotions/statsEstatísticas de usoadminEstatísticas e projeção
GET /api/v1/admin/promotions/upliftProjeção de retorno de um descontoadminEstatísticas e projeção
GET /api/v1/admin/promotions/free-shipping-regionalLista as regras de frete grátis por regiãoadminFrete grátis regional
PUT /api/v1/admin/promotions/free-shipping-regionalSubstitui as regras de frete grátis por regiãoadminFrete grátis regional
GET /api/v1/admin/promotions/free-shipping-regional/suggestionsSugere o valor mínimo por regiãoadminFrete grátis regional

Erros comuns

  • Mandar discount: 10 achando que é 10%. O percentual é em pontos-base: 10% é 1000. 10 seria 0,1%.
  • Datas sem hora. valid_from e valid_until são RFC 3339 completos (2026-12-31T23:59:59-03:00). 2026-12-31 leva 400 com o formato aceito na mensagem.
  • Usar nomes de outro sistema. title, start_at, end_at, from_date e expiry_date não existem na entrada. A resposta devolve from_date/expiry_date, mas quem lê a resposta e devolve esses nomes não define a vigência: use valid_from e valid_until. Sem valid_until a promoção vale para sempre.
  • Promoção de catálogo sem alvo. Sem produtos nem categorias ela desconta a loja inteira. A API pede confirm_store_wide=true justamente para isso.
  • Condição de carrinho na zona catalog. subtotal, coupon_code e semelhantes só existem em cart.
  • Tentar um segundo cupom na mesma promoção. POST /promotions/{id}/coupons responde 409 se já existe código; troque com PUT ou gere códigos descartáveis.
  • Esperar que null limpe um campo. No PUT, null ou vazio significa "não mexe". A única exceção é "code": null, que remove o código.

Próximos passos

Criar promoção
Corpo completo, exemplos e as recusas que você vai encontrar.
Cupons
Código da promoção, códigos descartáveis e validação.
Orçamentos e grupos
Tetos de gasto que pausam promoções.
Anterior
Regras de imposto
Próxima
Listar e detalhar promoções
Nesta página
  • Como funciona
  • Ciclo de vida
  • Fluxo típico de integração
  • Conceitos importantes
  • Tipos de promoção (type)
  • Zona: catálogo ou carrinho
  • Condições
  • Cupom: um código por promoção
  • Quem é o dono: loja toda ou seller
  • Proteções que a API aplica por você
  • Endpoints
  • Erros comuns
  • Próximos passos