Combora

Combora — Manual do utilizador

O guia completo da app de pacotes e descontos para a Shopify: os 8 tipos de oferta, todas as opções de configuração, o que o seu cliente vê na loja online, e um anexo técnico para programadores. Todas as capturas de ecrã vêm da loja de demonstração pública da Combora — a mesma que pode experimentar — captadas em agosto de 2026, e as capturas da app mostram a interface no idioma deste manual.

1O que é a Combora

A Combora cria pacotes e ofertas automáticas na sua loja Shopify: agrupa produtos, aplica o desconto correto no carrinho e no checkout, e mostra a oferta no seu tema através de blocos já prontos. Você configura a oferta no admin, e o desconto é calculado por uma Shopify Function dentro do próprio checkout — o preço cobrado é o que a própria plataforma calcula, não um script no navegador.

Existem 8 tipos de pacote. Esta tabela ajuda a escolher:

TipoO que fazQuando usar
Pacote fixoUm conjunto fechado de produtos com um preço de pacote ou um desconto. Cria um produto comprável com um clique no seu catálogo.Kits e conjuntos selecionados: "o duo", "o kit inicial".
Combine e poupeO cliente escolhe N artigos de um grupo e obtém um desconto."Escolha 3 t-shirts e poupe 20%".
Desconto por volumeNíveis: quanto mais compra, mais poupa (2+ → 10%, 4+ → 20%…).Aumentar as unidades por encomenda de um produto ou grupo.
Compre X, leve Y (BOGO)Compre X unidades e as próximas Y vêm com uma recompensa (grátis, % de desconto ou um preço fixo)."Buy 2, get 1 free".
Presente por compra (GWP)Adiciona um presente grátis automaticamente quando o carrinho cumpre uma condição."Presente surpresa em encomendas acima de $50".
Monte a sua caixaO cliente enche uma caixa de tamanho fixo; é cobrada com um desconto ou a um preço de caixa.Caixas de 4, 6, 12… snacks, velas, cervejas.
Complementos (FBT)"Frequentemente comprados juntos": um produto principal sugere extras com desconto.Cross-sell na página do produto.
ComboEmpilha duas ou mais das ofertas acima num único pacote; dentro de um combo elas somam-se.Campanhas: "volume + presente a partir de $1,000".
A regra de ouro entre pacotes diferentes: cada artigo do carrinho recebe apenas a melhor oferta — os pacotes nunca se somam entre si. A única exceção é o combo, cujas sub-ofertas se somam entre elas. Detalhe completo na secção 14.
1 · Você configura a sua oferta no editor da Combora e depois clica em Publicar 2 · Uma única configuração publicada a mesma fonte para tudo o que se segue 🎨 O seu tema — MOSTRA os widgets pintam a oferta: preço do pacote, níveis, barra de progresso do presente… (apenas informativo — nunca cobra) 🔒 Checkout da Shopify — COBRA uma Shopify Function calcula o desconto dentro do próprio checkout, sem scripts no navegador = o preço anunciado e o preço cobrado coincidem SEMPRE
Os dois caminhos da sua oferta vêm da mesma configuração publicada: o tema mostra-a e o checkout cobra-a. Por conceção, nunca podem contar coisas diferentes — a reclamação número um sobre esta categoria de apps ("o desconto não coincidiu no checkout") não pode simplesmente acontecer aqui.

Se estiver indeciso entre tipos, a própria app tem um guia: em Criar pacote, a ligação "Não sabe qual escolher?" abre um assistente, e cada tipo tem um painel "Ver como funciona" com exemplos.

Modal Qual devo usar? com recomendações por objetivo
Não sabe qual escolher? O assistente da galeria recomenda um tipo com base no seu objetivo.
Painel lateral Ver como funciona para o pacote fixo
Cada tipo tem o seu próprio painel "Ver como funciona" com um exemplo concreto.

2Primeiros passos

2.1 O que a app cria ao instalar

Instalar a Combora não altera nada visível na sua loja. Em segundo plano, a app prepara as estruturas de dados onde vai publicar os seus pacotes (metaobjects e metafields com o prefixo combora — o detalhe técnico está no anexo para programadores) mais um único desconto automático chamado "Combora" em Descontos, que é o que aplica todos os preços. Não o elimine nem o edite manualmente: a app mantém-o sozinha.

2.2 Ative o motor de presentes (app embed)

Se vai usar Presente por compra (ou combos com presente), ative o app embed Combora Gift: Loja online → Personalizar → Definições do tema → App embeds → Combora Gift. É o componente que adiciona e remove o presente do carrinho automaticamente. Sem ele, o desconto do presente continuaria correto, mas o produto-presente não se adicionaria sozinho.

2.3 Adicione os blocos ao seu tema

Cada tipo de pacote é mostrado na loja online através de um bloco de tema. Adiciona-os uma vez em Loja online → Personalizar, no template correspondente:

BlocoTipos que mostraOnde adicionar
Combora bundlePacote fixo e Combo ("Available bundles")Template de produto
Combora mix & matchCombine e poupe · Monte a sua caixaTemplate de produto
Combora volume tableVolume · Compre X, leve YTemplate de produto
Combora complementsComplementosTemplate de produto (e carrinho)
Combora gift offerPresente por compra (a oferta em si)Template de produto
Combora gift progressBarra de progresso do presenteTemplate do carrinho
Combora Gift (app embed)O motor que adiciona/remove o presenteApp embeds (loja inteira)

Não precisa de memorizar isto: cada editor de pacote tem um cartão "Onde isto aparece" que indica o bloco correto, mais uma ligação "Pré-visualizar no seu tema em direto" que abre o editor de temas com esse bloco já pronto para inserir no template correto.

Estilo: a aparência dos widgets é desenhada a partir da app, no estúdio de design (secção 13): predefinições, ordem dos elementos e estilo por elemento, com pré-visualização ao vivo. As definições próprias do bloco no editor de temas (cor de destaque e raio dos cantos) continuam a funcionar e são as que prevalecem com a predefinição "Editor de temas". O que só se configura no bloco é onde aparece e o número máximo de ofertas a mostrar nos blocos de produto (1–8, por defeito 3).

3Visita guiada à app

A app está em Apps → Combora. O menu tem seis entradas — Início, Pacotes, Estatísticas, Planos, Ajuda e Definições — mais o chat de suporte, presente em todos os ecrãs:

Início

O ecrã de boas-vindas e o pulso da sua instalação. Enquanto ainda está a configurar, mostra uma lista de três passos — criar o seu primeiro pacote, publicá-lo e (se a sua oferta for um presente por compra) ativar o motor de presentes no seu tema. A lista não é decorativa: cada passo só se assinala quando aconteceu mesmo na sua loja, o botão de ação só existe no passo pendente, e se mais tarde despublicar tudo, a lista volta a refletir a realidade. Uma vez completa, o Início celebra com uma ligação direta para ver a sua loja (pode dispensar o aviso quando quiser).

Abaixo da lista: os seus pacotes mais recentes com o respetivo estado, uma faixa de atenção se um pacote precisar de revisão (por exemplo, porque arquivou um produto que o compunha — a app deteta isso sozinha e assinala-o sem despublicar nada), e uma faixa com o seu plano atual.

Ecrã Início com a lista de configuração
O separador Início com a configuração a meio: o passo 1 (criar) e o passo 3 (ativar o motor de presentes) já estão feitos, e o passo 2 (publicar) mostra o seu botão de ação. Abaixo, os pacotes recentes com o seu estado real.

Pacotes

A lista de todos os seus pacotes: pesquisa por nome, filtro por estado (Publicado / Rascunho), ações por linha (duplicar, publicar/mover para rascunho, eliminar) e seleção múltipla com ações em massa. Tudo é criado a partir daqui com Criar pacote.

Lista de pacotes com estados e ações
O separador Pacotes: cada linha mostra tipo, estado e última atualização (a data tem uma dica), mais as ações da linha. Um pacote publicado em modo de teste acrescenta a insígnia Modo de teste junto ao seu estado.

Estatísticas

Métricas de desempenho dos seus pacotes sobre encomendas reais: receita atribuída, % de encomendas com um pacote, poupança entregue, valor médio de encomenda e um gráfico ao longo do tempo. Detalhe na secção 17.

Planos

O seu plano atual e as opções de upgrade. O plano Gratuito permite 3 pacotes publicados em simultâneo; os planos pagos não têm limite (secção 18).

Página de planos
O separador Planos: o seu plano atual no topo, a promessa de preço fixo e a comparação Gratuito ($0) · Pro ($14.99) · Plus ($39.99) com o que cada um inclui.

Ajuda

Perguntas frequentes e explicações dos conceitos (arbitragem entre pacotes, presentes, blocos).

Página de ajuda
O separador Ajuda.

Diagnóstico (um separador dentro de Ajuda)

O painel de saúde e suporte está como um separador dentro de Ajuda (seletor "Guias | Diagnóstico" no topo): verificações ao vivo de toda a instalação, o registo de eventos e o relatório de suporte que copia quando algo corre mal (secção 19).

Chat de suporte (balão flutuante)

No canto inferior direito de todos os ecrãs há um balão de chat 💬 para falar diretamente com o suporte: conversas por tema, histórico e um aviso sobre se o suporte está disponível ou ausente. Apenas o que você escreve é partilhado — nunca os dados dos seus clientes.

Definições

Idioma da app (7 idiomas), Design do widget (o modelo de estilo aplicado a toda a loja — secção 13), sincronização manual de descontos e acesso de programador.

Página de definições
O separador Definições: idioma da app, Design do widget e sincronização de descontos. No topo, o aviso informativo de que existe outro desconto automático na loja.

4Anatomia do editor

Todos os tipos partilham o mesmo editor; só muda a secção de produtos e preço. Um pacote totalmente novo tem este aspeto:

Galeria de tipos ao criar um pacote
Criar pacote: a galeria dos 8 tipos, com os pontos de entrada da criação em massa no topo.
Editor vazio com a lista Antes de publicar
O editor acabado de abrir: a barra lateral direita mostra o estado e a lista "Antes de publicar ou guardar este pacote" com o que falta; até estar completa, Publicar e Guardar ficam desativados.

4.1 Básico

Nome do pacote
Interno. Só você o vê; serve para o encontrar na sua lista.
Título na loja online
O que o cliente vê como nome da oferta no carrinho e no checkout. É traduzível. É também o texto da linha de desconto (limitado a 100 carateres).
Texto da insígnia
Uma insígnia curta opcional ("Melhor valor") que o seu tema pode mostrar em destaque.

4.2 Agendamento

Datas de início e fim opcionais. Vazio = a oferta entra em vigor ao publicar e nunca expira. Um pacote publicado fora da sua janela deixa de aplicar o desconto automaticamente e volta a aplicá-lo assim que regressa à janela, sem que tenha de mexer em nada.

4.3 Produtos

Consoante o tipo escolhido, seleciona produtos específicos (e, dentro de cada produto, pode marcar apenas algumas das suas variantes) ou uma coleção. O âmbito "qualquer produto da loja" só existe em presente por compra, como condição. O seletor é o padrão da Shopify:

Seletor de produtos da Shopify
O seletor padrão de produtos/variantes da Shopify dentro do editor.
Coleções: um pacote com uma coleção como alvo atualiza-se sozinho, a duas velocidades que vale a pena conhecer: o preço está sempre ao vivo — um produto que entra na coleção hoje já recebe o desconto no checkout, sem esperar — e a lista visível no widget (as opções que o cliente vê para escolher, e quais páginas de produto mostram o bloco) atualiza-se automaticamente todas as noites, ou de imediato se voltar a publicar o pacote com o botão "Atualizar pacote". Nunca se anuncia um preço diferente do que é cobrado. Máximo de 100 coleções por seletor.

4.4 Preço

Cada tipo tem a sua própria secção (percentagem, valor, preço fixo, níveis, recompensa…). Está documentado no capítulo de cada tipo. Em todos os casos, o preço cobrado é calculado pela Shopify no checkout a partir da configuração publicada: o que os blocos mostram é informativo.

4.5 Subscrições

Por defeito, um cliente não pode comprar um artigo de pacote como subscrição (isto protege o checkout de misturar o preço de subscrição com os descontos de pacote). Nos tipos onde faz sentido (combine e poupe, monte a sua caixa e presente por compra) há uma opção avançada, "Permitir subscrições neste pacote (avançado)"; ao ativá-la, o editor mostra um aviso a lembrar o que isso implica.

4.6 A barra lateral direita (e duas secções do corpo)

Além de Guardar (e Guardar como rascunho num pacote ainda não publicado), com a barra Alterações não guardadas / Guardar / Descartar no topo, o editor organiza o resto assim:

Estado + ação (barra lateral)
Publicar (ou Atualizar pacote se já estiver publicado) e Mover para rascunho. Publicar coloca a oferta ao vivo; mover para rascunho retira-a mantendo toda a configuração.
Modo de teste (corpo)
Marque "Publicar em modo de teste" para experimentar o pacote sem o expor aos seus clientes. Os widgets aparecem só no editor de temas — abra aí o modelo de produto e o pacote aparece exatamente onde vai ficar. Na sua loja nunca aparecem, nem sequer pela ligação de pré-visualização de um tema rascunho. Enquanto o pacote está em modo de teste, o desconto só é calculado para clientes com a etiqueta combora-test; para todos os outros, é como se o pacote não existisse. Para percorrer o checkout completo, adicione essa etiqueta ao seu próprio cliente de teste (Admin → Clientes) e inicie sessão como esse cliente na loja online. Desmarque a caixa e clique em Atualizar pacote e ele entra ao vivo, aplicando-se a quem cumprir as condições. Na lista, um pacote em modo de teste tem a insígnia Modo de teste.
Visibilidade no catálogo (corpo)
Apenas pacotes fixos: se o produto principal do pacote aparece ou não no seu catálogo (secção 5).
Antes de publicar (barra lateral)
A lista que bloqueia a publicação até que o essencial esteja pronto (título, produtos, preço…).
O que o seu cliente vê (barra lateral)
Enquanto a oferta ainda tiver algo em falta, este cartão explica o que falta e pré-visualiza o conteúdo. Assim que a oferta estiver completa, o cartão dá lugar à pré-visualização real do widget em Ver pré-visualização. O aspeto final depende do seu tema.
Estilo de pré-visualização (barra lateral, só em pacotes já criados)
Indica o design de widget ativo deste pacote e oferece Ver pré-visualização (o widget em tamanho real numa modal) e Personalizar design (o estúdio de design deste pacote: predefinições, ordem dos elementos e estilo por elemento — secção 13). Num pacote totalmente novo, aparece depois da primeira gravação.
Onde isto aparece (barra lateral)
O bloco de tema que renderiza este tipo e a ligação direta para o editor de temas.

Um pacote com agendamento mostra também a sua insígnia de janela (Agendado / Ativo / Terminado) e o botão Remover agendamento para voltar a "ativo ao publicar".

4.7 Avisos que o editor pode mostrar

  • Sobreposição: se os produtos do pacote já estiverem noutros pacotes publicados, uma faixa avisa: "No checkout só se aplica a melhor oferta por linha: os pacotes não se somam". Não é um erro — é informação (ver secção 14).
  • Sem poupança / preço 0: num pacote fixo com preço de pacote, se o preço escolhido não poupar nada (ou for 0), o editor assinala-o antes de publicar.
  • Grupo vazio: uma coleção sem produtos elegíveis mostra uma nota na pré-visualização e, se tentar publicar, um erro com a explicação.

4.8 Editar um pacote publicado

Ao editar um pacote publicado, as suas alterações são guardadas sem chegarem à sua loja. O editor mostra a sua edição, os seus clientes continuam a ver a versão publicada ao preço publicado, e o pacote fica marcado como Alterações não publicadas na sua lista. Clique em “Atualizar pacote” para as publicar, ou descarte-as no aviso do editor. Assim pode preparar as alterações com calma. "Mover para rascunho" retira a oferta da loja online de imediato; publicar de novo repõe-a exatamente como estava.

5Pacote fixo

Um conjunto fechado de produtos vendido como uma única unidade. É o único tipo que também cria um produto comprável com um clique no seu catálogo: um produto "principal" (um pacote nativo da Shopify) cujos componentes se expandem automaticamente no checkout.

5.1 Configuração

  1. Produtos: adicione os componentes (variantes específicas) e a quantidade de cada um. Máximo de 30 componentes por pacote.
  2. Preço — dois modos mutuamente exclusivos:
    • Preço fixo do pacote: insere o preço total (por exemplo, $1,299.00). A poupança é calculada face à soma dos componentes.
    • Aplicar um desconto: uma percentagem ou um valor sobre a soma dos componentes.
  3. Visibilidade no catálogo: os pacotes fixos são produtos reais da Shopify, por isso decide se o pacote também aparece no seu catálogo ou só é acessível a partir do widget:
    • Oculto — apenas a partir do widget (por defeito): o pacote não aparece em coleções, na pesquisa da loja online, nem em recomendações. A sua página de produto continua ativa para que o botão do widget funcione.
    • Visível — um produto normal do catálogo: aparece em coleções e na pesquisa como qualquer outro produto.
  4. Publicar. Ao publicar, a Combora cria (ou atualiza) o produto principal no seu catálogo — e, se o pacote ainda não tiver imagem, copia-lhe a do primeiro componente, em AMBOS os modos de visibilidade (um pacote oculto continua a aparecer no carrinho, no checkout e nos emails da encomenda). Nunca substitui uma imagem que já tenha definido; pode alterá-la a qualquer momento em Admin → Produtos.
Vende no POS? Escolha Visível: um pacote oculto também não aparece no ponto de venda.
Modo de teste e Visibilidade no catálogo no editor do pacote fixo
Visibilidade no catálogo (apenas pacotes fixos), logo abaixo do Modo de teste. À direita, a barra lateral com Ver pré-visualização e Personalizar design.
Editor do pacote fixo: componentes e preço do pacote
Os componentes com a sua quantidade e a secção Preço no modo "Definir um preço de pacote" ($1,299.00 por duas pranchas que somam $1,600.00). O outro modo na lista pendente é "Aplicar um desconto", com uma percentagem ou um valor.
Pacote fixo publicado
Depois de publicar: estado Publicado e o botão passa a "Atualizar pacote".

5.2 O que o seu cliente vê

Cartão Available bundles na página do produto
Na página de qualquer componente, o bloco Combora bundle mostra o cartão do pacote: o conteúdo com a sua quantidade em chips, o preço do pacote ($1,299.00) com o total riscado ($1,600.00), a poupança como insígnia (Poupe $301.00) e o botão para o produto principal.
Página do produto principal do pacote
O produto principal: a própria página comprável do pacote. Repare no preço que o tema pinta — é a soma dos componentes ($1,600.00); o preço do pacote é aplicado pela Function ao chegar ao carrinho. Pode editar a sua imagem e descrição como qualquer outro produto.
Pacote fixo no carrinho
No carrinho, o pacote é uma única linha: $1,600.00 → $1,299.00, com a insígnia do pacote. É aí que o preço do pacote aparece.
Checkout com o pacote expandido nos componentes
No checkout, o pacote expande-se nos seus componentes, com a poupança aplicada e identificada com o título do pacote.
Página de encomenda concluída
Uma compra genuinamente concluída na loja de demonstração enquanto este manual era escrito: $1,299.00 pagos através da gateway de teste.

5.3 Detalhes e limites deste tipo

  • Os componentes devem ser variantes com stock; o produto principal herda a disponibilidade.
  • O produto principal gere-se sozinho: mover o pacote para rascunho ou eliminá-lo retira-o da loja online (verificado ao escrever este manual). Não o elimine manualmente.
  • Por defeito, o principal fica oculto do catálogo. Antes de essa opção existir, aparecia em /collections/all como um cartão sem imagem; os pacotes que já tinha publicados foram mudados automaticamente para "Oculto". Se preferir o comportamento antigo, mude para Visível.
  • Máximo de 30 componentes. O preço fixo é repartido pelos componentes com arredondamento exato (a soma das partes é sempre igual ao total).
  • O pacote fixo também se aplica se o cliente adicionar os componentes separadamente nas quantidades exatas — o checkout agrupa-os e desconta-os da mesma forma.

6Combine e poupe

O cliente escolhe pelo menos N artigos de um grupo e todo o grupo sai com desconto.

6.1 Configuração

  1. Produtos: o grupo elegível pode ser produtos específicos — marcando, se quiser, apenas algumas variantes de cada um dentro do seletor — ou uma coleção (que se atualiza sozinha).
  2. Quantidade: o número mínimo de artigos para se qualificar e, opcionalmente, um máximo (acima do máximo, os artigos extra pagam o preço integral).
  3. Desconto: uma percentagem ou um valor, aplicado a todos os artigos elegíveis no carrinho assim que o mínimo é atingido.
Editor de combine e poupe
Editor de Combine e poupe: grupo elegível e número mínimo de artigos.
Secção de preço do mix
A secção Desconto do mix: percentagem ou valor.
O seletor visual aparece em qualquer âmbito. Com variantes específicas, renderiza exatamente essas caixas de verificação; com produtos ou uma coleção, o bloco Combora mix & match resolve a lista de opções no momento da publicação (e atualiza-a todas as noites, ou de imediato se voltar a publicar — as duas velocidades explicadas na secção 4.3). O cliente também pode compor o pacote adicionando produtos ao carrinho como habitualmente: o desconto ativa-se ao atingir o mínimo, quer tenha usado o seletor ou não.

6.2 O que o seu cliente vê

Seletor do mix com a lista de opções e o botão desativado
O seletor na página do produto: a lista de opções com o seu próprio scroll e o botão desativado até o mínimo ser atingido.
Seletor do mix com 3 selecionados e o botão ativo
Ao atingir o mínimo, as opções escolhidas são marcadas com um anel de destaque e o CTA fica ativo.
O pacote nesta captura tem um design próprio (secção 13): o botão foi movido para o topo e o contador de progresso está oculto. Com o design padrão, o contador fica acima da lista e o botão abaixo dela.
Carrinho com o desconto do mix aplicado em cada linha elegível
No carrinho, cada linha elegível mostra o preço reduzido com a insígnia do pacote ($400.00 → $320.00 e assim por diante, 20% de desconto em cada). Medido na loja de demonstração: três pranchas, $1,050.00 → $840.00. Outro pacote pode aplicar-se ao mesmo tempo no mesmo carrinho, nas suas linhas — ver secção 14.

6.3 Detalhes deste tipo

  • Um carrinho abaixo do mínimo não é bloqueado: o cliente paga o preço integral até se qualificar.
  • Com um máximo definido, o seletor deixa de aceitar marcações ao atingir o limite e, no carrinho, só as primeiras unidades até ao máximo são descontadas.
  • As quantidades contam por unidades: 3 unidades do mesmo produto elegível também se qualificam para um mínimo de 3.

7Desconto por volume

Níveis de preço por quantidade: "compre pelo menos 2 → 10%, pelo menos 4 → 20%". O nível é decidido por produto: a quantidade de cada produto elegível no carrinho determina o seu próprio nível, e o nível atingido aplica-se às unidades desse produto. Exemplo com "4+ → 20%": 4 unidades da mesma prancha → 20% de desconto nas 4; mas 2 unidades de uma prancha + 2 de outra → cada produto fica no nível de 2+ (10%), não no de 4+. As quantidades de produtos diferentes não se somam entre si.

7.1 Configuração

  1. Produtos: produtos específicos ou uma coleção (tal como no mix). Se só quiser algumas variantes de um produto, marque-as dentro do seletor ao escolhê-lo.
  2. Níveis: cada nível é "Compre pelo menos N" + um desconto (percentagem ou valor). Adicione quantos precisar com "Adicionar nível" (até 50).
Editor de volume com dois níveis
Dois níveis: 2+ → 10% e 4+ → 20%. O próprio editor explica-o: a quantidade de cada produto no carrinho decide o seu nível.

7.2 O que o seu cliente vê

Tabela de volume na página do produto
O bloco Combora volume table na página do produto: a escada de níveis, uma linha por nível com a poupança como insígnia de destaque e o nível mais alto realçado com um anel.
Carrinho com 4 unidades e 20% aplicado
Com 4 unidades no carrinho, aplica-se o nível de 20%: $4,000.00 → $3,200.00, com a insígnia do pacote na linha.

7.3 Detalhes deste tipo

  • Só se aplica o nível mais alto atingido (os níveis não se somam).
  • Os níveis podem misturar tipos de valor (alguns %, outros valor).
  • Um valor de desconto fixo é repartido pelas linhas de forma proporcional e exata.

8Compre X, leve Y (BOGO)

Compre X unidades e as próximas Y unidades vêm com uma recompensa. A recompensa pode ser grátis (100%), uma percentagem, um valor de desconto ou um preço fixo por unidade.

8.1 Configuração

Editor BOGO — básico
O editor BOGO: o produto sobre o qual corre a oferta e, à direita, a barra lateral com o estado e a pré-visualização. Se esses produtos também estivessem noutro pacote, apareceria no topo o aviso de sobreposição — informativo, não bloqueante.
Editor BOGO — quantidade a comprar, a levar e a recompensa
Quantidade a comprar = 2, quantidade a levar = 1 e uma recompensa de 100% ("buy 2, get 1 free"). O seletor de recompensa oferece percentagem, valor ou preço fixo.

8.2 O que o seu cliente vê

Carrinho com 3 unidades e 1 grátis
Com 3 unidades ($300.00 cada): $900.00 → $600.00 — uma unidade sai grátis, com a insígnia "Buy 2, get 1 free" na linha.

8.3 Detalhes deste tipo

  • A oferta repete-se em blocos inteiros: com "2+1", 6 unidades = 2 grátis; 5 unidades = 1 grátis.
  • O bloco de tema que a renderiza é o Combora volume table (apresenta o "compre X leve Y" como uma tabela de poupança).
  • A recompensa "preço fixo" cobra exatamente esse preço por cada unidade recompensada.

9Presente por compra (GWP)

Adiciona um produto-presente (a $0.00) automaticamente quando o carrinho cumpre a condição, e remove-o se deixar de a cumprir. É o tipo mais automatizado: o app embed Combora Gift gere o presente sem que o cliente faça nada.

🛒 O carrinho muda adicionar, remover, quantidades… Condição cumprida? gasto · unidades · ambos · combinação exata sim 🎁 Presente entra adiciona-se sozinho, a $0.00, assinalado como presente não ✋ Presente sai remove-se sozinho assim que a condição deixa de se cumprir Se o presente esgotar, a oferta deixa de ser anunciada (nunca prometa o que não tem)
O ciclo automático do presente: a cada alteração do carrinho, o motor reavalia a condição e adiciona ou remove o presente sem que você nem o cliente façam nada. E se o presente ficar sem stock, o cartão da oferta oculta-se sozinho.

9.1 Configuração

  1. O presente: uma variante específica que se adiciona quando o cliente se qualifica.
  2. Condição para desbloquear — quatro opções:
    • Por gasto mínimo: o carrinho atinge um valor (por exemplo, $1,000).
    • Por número de artigos: atinge N unidades.
    • Gasto e quantidade (ambos): são exigidos os dois.
    • Por ter uma combinação de produtos: uma lista específica de artigos (de 2 a 5; uma unidade de cada) que têm todos de estar no carrinho.
  3. O que conta para a condição: qualquer produto da loja, produtos específicos ou coleções.
Editor GWP com a condição de gasto mínimo e os produtos que contam
O editor: o presente escolhido (uma cera de esqui de $20.00), a condição "Por gasto mínimo" com o limite em $1,000 e "O que conta para a condição" restringido a uma prancha específica, de modo que só as unidades dela enchem a barra. Se escolher Qualquer produto, o editor acrescenta a caixa de verificação "Mostrar esta oferta de presente em todas as páginas de produto".

9.2 O que o seu cliente vê

Barra de progresso do presente abaixo do limite
A barra do bloco Combora gift progress é um cartão com um ícone de presente: diz quanto falta (mais $650.00 num carrinho com uma prancha de $350.00, portanto a barra fica nos 35%) e enche-se à medida que o carrinho cresce.
Presente adicionado automaticamente a $0.00
Ao atingir o limite, o presente adiciona-se sozinho a $0.00 com a insígnia do pacote, e a barra celebra-o com o anel de destaque. Medido na loja de demonstração: três dessas pranchas fazem $1,050.00, ultrapassam o limite de $1,000 e a cera de $20.00 entra grátis — $1,070.00 → $1,050.00. Se o carrinho descer abaixo do limite, o presente remove-se sozinho.

A barra tem quatro estados e, desde o carrinho vazio, dá o nome do presente e do que conta: antes de o cliente começar, enuncia a regra ("gaste $1,000 nessa prancha e leve a cera grátis"), a meio caminho diz o que falta, ao ultrapassar o limite anuncia o presente pelo nome, e se o cliente o retirar à mão di-lo em vez de ficar em "a aplicar". Quando contam mais de três produtos, a barra diz produtos elegíveis e acrescenta um painel "Que produtos contam?" que os lista.

Pode escrever o texto da barra você mesmo. O editor do presente tem uma secção Mensagem do carrinho com três campos opcionais: carrinho vazio, a meio caminho e presente desbloqueado. Se deixar um campo vazio, esse estado mantém o texto padrão; se o preencher, o seu substitui-o, com marcadores que pode inserir: {{ amount }} (o que falta), {{ qty }} (artigos em falta), {{ scope }} (os produtos que contam), {{ gift }} (o nome do presente) e {{ threshold }} (o limite completo). O editor pré-visualiza o resultado com os valores do seu próprio pacote e não deixa publicar um marcador desconhecido nem uma mensagem com mais de 160 caracteres.

9.3 Detalhes e proteções deste tipo

  • O próprio presente não conta para o gasto de qualificação.
  • O limite é medido sobre o preço de tabela do que conta, não sobre o que o cliente acaba por pagar: outra oferta que desconte essas mesmas linhas nunca o consome. A barra, o presente automático e o checkout leem o mesmo número.
  • Se o cliente remover o presente manualmente, a app respeita isso e não o volta a adicionar nessa sessão; a barra do carrinho diz exatamente isso ("Presente removido") em vez de ficar em "a aplicar".
  • Se retirar a oferta (mover para rascunho, fim da janela) enquanto há carrinhos abertos que já tinham o presente, o motor remove sozinho essa linha órfã assim que o carrinho voltar a mudar — nunca se transforma numa cobrança.
  • Se o presente ficar sem stock, a oferta simplesmente não o adiciona (não bloqueia a compra).
  • Proteção contra cobrança: uma validação no checkout impede pagar por um presente que está assinalado como presente mas chegou com um preço — o cliente nunca paga por engano por um artigo marcado como presente. A validação atua só no checkout, nunca durante a navegação.
  • Quando "o que conta" são coleções, a app resolve os produtos da coleção no momento da publicação (e atualiza-os todas as noites, ou de imediato se voltar a publicar — as duas velocidades da secção 4.3), pelo que a barra de progresso e o presente automático funcionam tal como com produtos específicos. A única exceção: uma coleção enorme (mais de ~150 produtos) não pode ser prevista a partir do navegador — a barra não é mostrada para essa oferta, mas o presente e o preço continuam corretos (o servidor decide-os).
  • Um presente cujo "o que conta" seja qualquer produto da loja pode ser anunciado com o bloco Combora gift offer em todas as páginas de produto: ao escolher esse âmbito, o editor mostra a caixa de verificação "Mostrar esta oferta de presente em todas as páginas de produto". Desativada (por defeito), a oferta só é vista no carrinho — a barra de progresso e o presente automático funcionam da mesma forma; ativada, também é anunciada com um cartão em todas as páginas de produto (a oferta não tem produtos específicos para marcar, por isso o bloco lê-a a partir do índice publicado da loja). A exceção deliberada continua a ser a página do próprio produto-presente: um prémio não é um isco.

10Monte a sua caixa

O cliente enche uma caixa de tamanho fixo (por exemplo, 3 artigos) com o que escolher de um grupo. Cada caixa completa é cobrada com um desconto ou a um preço de caixa fechado.

10.1 Configuração

Editor de Monte a sua caixa com um preço de caixa
Tamanho da caixa = 3 sobre as cinco variantes de uma prancha, com preço definido por "Definir um preço de caixa" = $1,749.00 (de $2,100.00, ou seja, $351.00 de desconto — $583.00 por artigo). O outro modo na lista pendente é uma percentagem ou valor simples. Um carrinho abaixo do tamanho não é bloqueado: paga-se o preço integral até a caixa estar completa.

10.2 O que o seu cliente vê

Usa o mesmo bloco Combora mix & match e o mesmo seletor com contador da secção 6: "selecione 3", um contador de progresso, um CTA com a quantidade. A diferença está na matemática: aqui as caixas são cobradas por caixa completa — com uma caixa de 3, seis artigos são duas caixas; sete artigos são duas caixas mais um artigo ao preço integral.

10.3 Detalhes deste tipo

  • Grupo elegível: produtos específicos (com as suas variantes, se marcar apenas algumas) ou uma coleção (o seletor visual aparece em qualquer âmbito, tal como no mix — com coleções, a lista é resolvida no momento da publicação e atualizada todas as noites).
  • O preço de caixa é repartido pelos artigos de forma exata; com moedas de 0 casas decimais (JPY) ou de 3 casas decimais (BHD), a repartição respeita a moeda.
  • Suporta a opção de subscrições (secção 4.5).

11Complementos (frequentemente comprados juntos)

Um produto principal sugere produtos complementares; se o cliente levar o conjunto, recebe um desconto. É o clássico "frequentemente comprados juntos" na página do produto.

11.1 Configuração

Editor de complementos com produto principal e sugestões
O editor: o produto principal (a âncora onde a oferta aparece), os produtos complementares e o desconto (25%). A barra lateral mostra a pré-visualização do widget com o seu CTA.

11.2 O que o seu cliente vê

Bloco de complementos na página do produto principal
Na página do produto principal, o bloco Combora complements: o próprio produto assinalado como "This item", os complementos com uma caixa de verificação e um preço, a poupança ("Save 25%") e o CTA que indica a seleção ("Add 3 to cart"). Os artigos são separados por divisores "+", e as linhas selecionadas são marcadas com um anel de destaque. Medido na loja de demonstração com os três no carrinho: $800.00 → $600.00 ($500.00 → $375.00, $180.00 → $135.00, $120.00 → $90.00).

11.3 Detalhes deste tipo

  • O desconto aplica-se assim que o produto principal e pelo menos um complemento estão no carrinho; cobre as linhas do conjunto.
  • O bloco também pode ser adicionado ao template do carrinho como um último incentivo de cross-sell.
  • Os complementos sem stock aparecem desativados com o respetivo aviso, e nunca vêm pré-marcados.

12Combo

O tipo avançado: empilha duas ou mais sub-ofertas (de qualquer um dos outros tipos) num único pacote. A diferença chave face a publicar pacotes separados: dentro de um combo as sub-ofertas somam-se — o cliente pode obter o desconto de volume e o presente ao mesmo tempo.

12.1 Configuração

Editor de combo com duas sub-ofertas prontas
O editor de combo: cada sub-oferta é uma linha em acordeão com o seu estado (Pronta). A pré-visualização resume as ofertas e o orçamento usado ("Usa 1 de 50 entradas de produto").

Cada linha expande no local com o chevron, e a sub-oferta é editada em linha: os seus próprios produtos, os seus próprios níveis ou recompensa. Cada sub-oferta só afeta os seus próprios produtos.

12.2 O que o seu cliente vê

Um combo não é anunciado como cartão no bloco Combora bundle: esse bloco lista pacotes fixos, que têm um preço e um botão, e um combo não tem nenhum dos dois. Cada sub-oferta é promovida pelo seu próprio bloco — a tabela de volume para uma sub-oferta de volume, a barra de presente para uma de presente — e o combo mostra o seu efeito completo no carrinho, onde cada parte atua com a sua própria insígnia: o desconto de volume nas suas linhas e o presente adicionado automaticamente a $0.00.

Medido na loja de demonstração num combo que soma "2 ou mais desta prancha → 15% de desconto" e "um gorro grátis assim que levar $900.00 dela": duas pranchas passam de $1,040.00 para $850.00 — os 15% e o gorro a $0.00 — e três passam de $1,540.00 para $1,275.00. Dois pacotes separados nunca fariam as duas coisas na mesma linha; dentro de um combo as sub-ofertas somam-se (secção 14).

12.3 Detalhes deste tipo

  • As sub-ofertas somam-se dentro do combo, mas o combo compete como um todo contra os outros pacotes segundo a regra da melhor oferta por linha.
  • O presente numa sub-oferta GWP usa o mesmo motor de adição automática do tipo presente.
  • Limite de tamanho: o conjunto achatado de produtos do combo não pode exceder 50 entradas (o editor mostra-o: "Usa X de 50").
  • O editor tem uma modal "Como funcionam os combos" com um exemplo guiado, e cada sub-oferta define "Produtos a que esta oferta se aplica" — uma sub-oferta sem produtos específicos mostra um aviso porque não vai conseguir precificar nada.
  • Uma sub-oferta BOGO dentro de um combo oferece uma recompensa de percentagem ou valor (o "preço fixo por unidade" é exclusivo do BOGO autónomo).

13Desenhar o widget

Os blocos da Combora vêm com um aspeto que se adapta a qualquer tema, mas pode desenhá-los a partir da app, sem tocar em CSS: escolha um estilo, reordene e oculte elementos, e ajuste cores, tamanhos e formas elemento a elemento. Tudo com uma pré-visualização que usa o mesmo motor de renderização da sua loja online, por isso o que vê é o que é publicado.

O design é apenas aparência: nunca altera o preço. Pode ajustá-lo sabendo que não toca em nenhuma regra da oferta.

13.1 Dois lugares onde se desenha

OndeÂmbitoQuando usar
Definições → Design do widget → Editar modelo do widget O modelo aplicado a toda a loja: todos os pacotes herdam-no. O caso normal. Define o seu estilo uma vez e todos os pacotes seguem-no.
Editor de pacote → Personalizar design Apenas esse pacote. O que definir aqui prevalece sobre o modelo, campo a campo. Um pacote que precisa de se destacar (uma campanha, uma cor diferente).

Um pacote que ainda não mexeu em nada mostra o aviso "Este pacote segue o modelo de widget da sua loja". Assim que escolher uma predefinição ali, esse pacote segue o seu próprio caminho.

Estúdio de design: o modelo de widget aplicado a toda a loja
Definições → Design do widget: os estilos à esquerda, o simulador de ambiente à direita e, abaixo, a pré-visualização do widget. O seletor Pré-visualizar widget no topo muda o tipo de widget que está a ver.
Guardar o modelo volta a sincronizar os seus pacotes publicados para que o novo estilo chegue à loja online: pode demorar um minuto a aparecer. O próprio painel diz-lhe quantos pacotes vão ser sincronizados.

13.2 Os estilos (predefinições)

Modelo da loja
Só no design de um pacote: segue o que definiu em Definições. É o valor inicial. Se ainda não houver modelo, aplicam-se as definições do bloco no editor de temas.
Editor de temas
Prevalecem as definições próprias do bloco no seu editor de temas (destaque, cantos, modo de estilo). Este é o comportamento clássico, o que tinha antes de o estúdio existir.
Combora
O aspeto trabalhado da Combora: um cartão com o seu próprio fundo, contornos e sombras. Consistente em qualquer tema.
Como o tema
Decoração mínima: a tipografia e as cores do seu tema dominam. Para temas com personalidade forte.
Sem estilo
Markup limpo, sem decoração, para o seu programador escrever o seu próprio CSS (editor de temas → CSS personalizado). Os pontos de ligação são a classe .combora-w e as variáveis --combora-*.
Personalizado
Abre os controlos abaixo: layout, estilo global e ajuste fino por elemento.

13.3 Layout: reordenar e ocultar

Com a predefinição Personalizado, aparece o Layout: uma lista dos elementos do widget que pode arrastar (ou mover com as setas) para mudar a sua ordem, mais um ícone de olho para ocultar os opcionais.

Os elementos dependem do tipo de pacote, porque cada tipo desenha um widget diferente:

Tipo de pacoteElementos que pode reordenar
Pacote fixo · ComboTítulo · Produtos incluídos · Preço · Poupança · Botão
Combine e poupe · Monte a sua caixaTítulo · Contador de progresso · Lista de opções · Nota · Botão
Desconto por volumeTítulo · Escada de níveis
Compre X, leve YTítulo · Regra da oferta
Presente por compraTítulo · Presente · Condição de desbloqueio
ComplementosTítulo · Lista de artigos · Poupança · Botão
O que o cliente precisa não pode ser ocultado. Os seletores, as listas de artigos, a escada de níveis, o presente e os botões não têm de propósito ícone de olho: sem eles o widget não diria nada. Reordená-los, sim pode.
Predefinição Personalizado: layout, estilo global e ajuste fino por elemento
Com a predefinição Personalizado: Layout (arraste as linhas, o olho oculta as opcionais), Estilo global e Ajuste fino por elemento. A pré-visualização à direita atualiza-se a cada alteração.

13.4 Estilo global e ajuste fino

O Estilo global é o que muda todo o widget de uma vez: cor de destaque, fundo do cartão, cor do texto, cantos (aguçados / suaves / arredondados), sombra (nenhuma / suave / média) e densidade.

O Ajuste fino por elemento abre cada elemento em separado — título, preço, poupança, insígnia, botão, cartão, miniaturas, etiquetas — com o que fizer sentido para cada um: tamanho, peso, cor, maiúsculas, espaçamento, forma, cor do contorno, cor do preço riscado… Todos os controlos têm um "Voltar ao tema" para desfazer só esse ajuste, e no fundo há um "Repor toda a personalização".

  • Se não definir a Poupança, esta segue o estilo da Insígnia.
  • A cor do texto do botão não pode ser escolhida: é derivada automaticamente por contraste face ao fundo que escolher, para que nunca fique ilegível.
  • Os valores têm limites sensatos: não pode inserir um tamanho que quebre o widget no telemóvel.

13.5 A pré-visualização (e o que ela NÃO é)

À direita há um painel identificado como "Apenas pré-visualização". A diferença importa:

  • Esquerda = o seu design. O que ajustar ali é guardado e vai para a loja online.
  • Direita = a lente. Fundo de pré-visualização (claro / escuro / uma cor personalizada), tamanho de texto base, largura do espaço (uma coluna de produto estreita vs. uma secção larga) e uma aproximação da sua tipografia. Existe para verificar se o seu design se aguenta em diferentes lugares. Não altera nada na sua loja nem no seu design.

E na barra lateral do editor de pacote, o cartão "Estilo de pré-visualização" diz qual o design ativo ("Design ativo: Combora") e oferece dois botões: Ver pré-visualização, que abre o widget em tamanho real numa modal ("É assim que vai ficar na sua loja"), e Personalizar design, que abre o estúdio deste pacote. A tipografia e o fundo reais vêm do seu tema, por isso, para a aprovação final, veja o widget no editor de temas.

A pré-visualização usa o mesmo código da loja online, mas o tema é seu: se o seu tema definir tipos de letra ou fundos muito distintivos, o resultado final pode parecer diferente da pré-visualização. Essa é a única margem.

14Combinar pacotes entre si

Pode publicar tantos pacotes quantos o seu plano permitir, mesmo sobre os mesmos produtos. As regras de coexistência são fixas e previsíveis:

  1. A melhor oferta por linha. Para cada artigo do carrinho, a Shopify aplica a oferta que mais desconta esse artigo. Dois pacotes nunca se somam na mesma linha.
  2. Pacotes diferentes podem coexistir no mesmo carrinho — cada um nas suas próprias linhas. Um desconto de mix nas pranchas e um presente por gasto podem aplicar-se ao mesmo tempo porque atuam em linhas diferentes.
  3. Em caso de empate, ganha o pacote mais antigo (o primeiro que criou).
  4. A exceção é o combo: as suas sub-ofertas somam-se entre elas (secção 12).

E os descontos que não são da Combora? A regra acima governa os packs da Combora entre si. Com descontos de terceiros manda a Shopify, e verificámo-lo numa loja real: dois descontos de produto (um pack da Combora e um desconto automático ou código de produto seu) nunca se somam sobre o mesmo artigo — a Shopify aplica apenas o maior dos dois, mesmo que ambos estejam marcados como combináveis; podem conviver em linhas diferentes da mesma encomenda. Um desconto de encomenda (por exemplo um código de −10% sobre toda a encomenda) subtrai-se depois, sobre os preços já descontados — o comportamento padrão da Shopify com qualquer app.

Carrinho com o desconto do mix em cada linha elegível
Cada linha que uma oferta cobre leva o seu desconto e a sua insígnia — aqui o mix de 20% em três pranchas, $1,050.00 → $840.00. Outro pacote cujos produtos também estejam neste carrinho aplica-se às suas linhas, no mesmo carrinho, sem que as duas ofertas alguma vez se cruzem na mesma linha.
O aviso de sobreposição no editor existe para isto: quando publica um pacote cujos produtos já estão noutros pacotes, lembra-lhe que no checkout só se aplicará a melhor oferta por linha. Publique sem receio — o cliente nunca verá um desconto duplicado nem um preço errado.

Um exemplo numérico real (verificado na loja)

CarrinhoOfertas candidatasResultado
3 × Cascade Freeride ($300.00)BOGO 2+1 grátis$900.00 → $600.00 (uma unidade grátis)
4 × Oxygen ($1,000.00)Volume 4+ → 20%$4,000.00 → $3,200.00
2 × OxygenVolume 2+ → 10% (o escalão 4+ não é atingido)$2,000.00 → $1,800.00
3 pranchas elegíveisMix & match, mínimo 3 → 20%$1,050.00 → $840.00 ($400.00 → $320.00, e assim por diante)
3 × a prancha a que um presente está ligado ($1,050.00)Presente acima de $1,000 dessa pranchaA cera de $20.00 entra a $0.00: $1,070.00 → $1,050.00
2 × a prancha do comboDentro de um combo: volume 15% e presenteAplicam-se os dois: $1,040.00 → $850.00

Na loja de demonstração há um produto que pertence de propósito a dois pacotes: a prancha que é componente do pacote fixo é também o sujeito do pacote de volume. Sozinha leva o escalão de volume que a sua quantidade lhe der; junto com o outro componente do pacote fixo, nas quantidades exatas, o pacote fixo entra também como candidato e a linha fica com a melhor das duas. Mesmo produto, dois pacotes, um preço por linha — nunca os dois.

15Criação em massa

Na galeria Criar pacote há dois fluxos para criar muitos pacotes de uma vez. Ambos criam rascunhos: nada chega à loja online até rever e publicar.

15.1 Gerar a partir de uma coleção

  1. Escolha a coleção.
  2. Escolha o modelo: "Um multipack por produto" (um pacote fixo de N unidades para cada produto) ou "Um único pacote para toda a coleção".
  3. Configure as unidades e o desconto, e depois clique em Criar rascunhos.
Gerador configurado com uma coleção e um modelo
O gerador: o modelo de multipack, 3 unidades por pacote e 15% de desconto. A coleção é escolhida com o próprio seletor da Shopify através de Selecionar coleção.

O que cada modelo cria realmente

Um multipack por produto percorre a coleção e cria um rascunho de pacote fixo por produto: N unidades da primeira variante desse produto (por ordem de posição), com o desconto que escolheu aplicado à soma. Cada rascunho é um pacote fixo normal — abra-o para mudar a variante, definir um preço de pacote fechado, adicionar uma insígnia… — e, ao publicá-lo, torna-se o seu próprio produto comprável com um clique, como qualquer pacote fixo (secção 5).

Um único pacote para toda a coleção cria exatamente um rascunho do tipo flexível que escolher (volume, combine e poupe, monte a sua caixa ou compre X leve Y) cujo grupo elegível é a própria coleção. A pertença segue o seu catálogo: o grupo é resolvido quando publica e atualizado todas as noites (ou de imediato ao republicar), pelo que os produtos que acrescentar à coleção mais tarde entram na oferta sem tocar no pacote.

Os produtos são ignorados — e a faixa de resultado avisa — quando não estão Ativos no seu catálogo, quando não têm nenhuma variante comprável — e quando são eles próprios produtos de pacote da Combora: um pacote gerado nunca aninha outro pacote.

Exemplos práticos

O mesmo ecrã, sete configurações e exatamente o que cada uma produz:

ConfiguraçãoO que é criado
Coleção de 12 produtos · multipack · 3 unidades · 15%12 rascunhos, um por produto, com o nome "Produto — embalagem de 3". Cada um contém 3× a primeira variante do produto e, depois de publicado, cobra (3 × preço) − 15% no checkout.
O mesmo, mas com desconto = valor fixo de 512 rascunhos em que cada pacote cobra (3 × preço) − 5 na moeda da sua loja. Se um produto for tão barato que o desconto engole o preço, reveja esse rascunho antes de publicar.
Coleção de 9 em que um produto é um pacote da Combora e outro não está Ativo7 rascunhos; a faixa reporta os ignorados e o motivo de cada um.
Voltar a executar exatamente a mesma configuração no mês seguinteSó os produtos novos na coleção recebem um rascunho; cada produto que já tem um pacote gerado idêntico é reportado como duplicado e ignorado. Voltar a executar é sempre seguro.
Coleção de 250 produtos · multipackOs primeiros 100 rascunhos (o limite por execução) mais um aviso; publique ou elimine alguns e volte a executar para os restantes.
Modelo de pacote único · volume · quantidade mínima 3 · 15%Um rascunho "Desconto por volume {coleção}": 3 ou mais unidades da mesma variante têm 15% de desconto — cada produto da coleção sobe a escada por si próprio (o volume conta por linha, secção 7). Para recompensar a mistura de produtos diferentes, use antes o combine e poupe: o seu mínimo conta em toda a seleção.
Modelo de pacote único · compre X leve Y · compre 2, leve 1 · recompensa 100%Um rascunho: por cada 2 unidades compradas da coleção, a unidade seguinte é grátis. Com uma recompensa de 50%, sairia a metade do preço.
Limite: até 100 rascunhos por geração. Os rascunhos são gratuitos em todos os planos — o limite de 3 pacotes publicados do plano Gratuito aplica-se quando publica, não quando gera.

15.2 Importar de um CSV

Para catálogos grandes ou para migrar de outra app. A página inclui a referência completa do formato, um modelo descarregável com um exemplo por tipo e um botão de exportação (descarrega todos os seus pacotes no mesmo formato, prontos a reimportar noutra loja).

Página de importação de CSV com a referência das colunas
A página de importação: colunas type, title, discount_kind, discount_value, components, collection, min_qty, min_items, slots, buy_qty, get_qty. Pode carregar um ficheiro ou colar o CSV diretamente.
  • Tipos importáveis: fixed, volume, mix_and_match, build_a_box, bogo (os tipos com presente, âncora ou sub-ofertas são criados no editor).
  • Referências por handle de produto ou coleção, ou por GID da Shopify.
  • Em components (só fixos): handle:quantity separados por |.
  • Até 200 linhas por importação; um ficheiro maior é recortado e a app avisa.
Importação com erros por linha
Com um CSV com falhas, nada é descartado silenciosamente: cada linha falhada é reportada com o seu motivo (sem componentes, desconto fora do intervalo, tipo desconhecido).
Lista filtrada por rascunhos depois dos fluxos em massa
Os rascunhos criados por ambos os fluxos, filtrando a lista pelo estado Rascunho. Publique-os um a um ou com as ações em massa.

16Gestão do dia a dia

16.1 A lista

Pesquisa por nome, filtro por estado e, em cada linha: Duplicar (cria uma cópia em rascunho), Publicar / Mover para rascunho e Eliminar. A data em cada linha é a última atualização (passe o rato para a dica).

16.2 Ações em massa

Barra de ações em massa com 10 selecionados
Selecionar linhas (ou Selecionar tudo) traz a barra de ações em massa: Publicar · Mover para rascunho · Eliminar.
Confirmação em linha para eliminação em massa
Eliminar pede confirmação explícita: Eliminar 10 pacotes? … Isto não pode ser desfeito. Durante a operação, vê o progresso (A processar 6 de 10…).

16.3 O ciclo de vida de um pacote

Rascunho
Invisível na loja online. Editável sem limites.
Publicado
A oferta está ativa (dentro da sua janela de agendamento). Editar não altera nada ao vivo até clicar em Atualizar pacote.
Mover para rascunho
Retira a oferta de imediato; a configuração fica intacta para poder republicar.
Eliminar
Elimina o pacote e retira o seu desconto (e o produto principal, se era um pacote fixo). Não pode ser desfeito. As estatísticas de encomendas passadas mantêm-se.

16.4 O que a Combora faz sozinha, enquanto você dorme

Quatro processos automáticos mantêm a sua loja atualizada sem que tenha de fazer nada. Não precisa de os configurar nem de os vigiar — estão documentados aqui para saber por que razão as coisas se resolvem sozinhas:

⏰ a cada 15 min janelas de agendamento 💳 03:00 atualização do plano 📦 04:00 grupos de coleções 🧹 04:30 limpeza e autorreparação
Os quatro processos automáticos (UTC). Nenhum deles precisa de configuração.
ProcessoQuandoO que faz por si
Janelas de agendamentoa cada 15 minAtiva e desativa os pacotes agendados na sua hora (no seu fuso horário) e mantém o catálogo público atualizado. Um pacote a decorrer do dia 1 ao dia 15 começa e termina sozinho.
Atualização do plano03:00Confirma o seu plano real junto da Shopify (upgrade, cancelamento, fim do período de teste) para que os limites e a insígnia reflitam sempre a verdade.
Grupos de coleções04:00Atualiza a lista visível dos pacotes com uma coleção como alvo, com os produtos que entraram ou saíram (o preço desses produtos já estava correto desde o primeiro momento — secção 4.3).
Limpeza e autorreparação04:30Elimina dados expirados (chats fechados há 90 dias, registos técnicos), remove sobras de pacotes eliminados e repara o contrato público: se alguém alterou por acidente os esquemas de dados que os programadores usam, ou a insígnia do plano, repõe-nos e regista o que aconteceu.

17Estatísticas

Estatísticas com encomendas reais
O separador Estatísticas com dados reais da loja de demonstração (intervalo de 7 / 30 / 90 dias): as sete métricas no topo — aqui uma única encomenda real de $1,299.00, portanto uma taxa de adesão de 100% e 1 de 1 encomendas com pacote — e os três gráficos abaixo.
MétricaO que mede exatamente
Receita atribuídaA receita das linhas de encomenda que tiveram um desconto da Combora (não o total da encomenda).
% de encomendas com um pacoteA percentagem de encomendas no intervalo que incluíram pelo menos um pacote.
Encomendas com um pacoteA fração literal: encomendas com pacote / total de encomendas.
Poupança entregueO desconto total que os seus pacotes deram aos clientes.
Valor médio de encomendaEm todas as encomendas do intervalo.
Valor de encomenda com pacoteA média apenas das encomendas que incluíram um pacote — compare-a com a anterior para ver o efeito das suas ofertas.
Encomendas com presenteEncomendas que incluíram um presente grátis (GWP ou combo).

Se vende em várias moedas, um seletor de moeda fica junto às métricas: os valores monetários são mostrados na moeda escolhida (os contadores de encomendas são globais).

Abaixo das métricas há três gráficos para o intervalo escolhido, todos com uma marca por dia e uma dica:

  • Encomendas com pacote ao longo do tempo — barras, com o valor impresso acima das barras que têm dados.
  • Receita atribuída por dia — uma linha, para ver a tendência.
  • Poupança entregue por dia — barras: quanto desconto os seus pacotes deram cada dia.
A atribuição fica registada no momento da encomenda: eliminar um pacote mais tarde não apaga o seu histórico nas Estatísticas.

18Definições e planos

18.1 Definições

  • Idioma da app: 7 idiomas (inglês, espanhol, francês, alemão, italiano, português, neerlandês). Afeta o admin; o que o seu cliente vê segue o idioma do seu tema/mercado.
  • Design do widget: Editar modelo do widget abre o estúdio de design aplicado a toda a loja — o estilo que todos os pacotes herdam (secção 13). Guardar aqui volta a sincronizar os pacotes publicados.
  • Sincronizar descontos: não precisa de clicar — tudo se sincroniza sozinho quando publica. Existe como rede de segurança: se algum pacote alguma vez deixar de descontar, isto regenera o desconto da Shopify a partir de todos os seus pacotes publicados. É seguro usar quantas vezes quiser, e se não houver nada a corrigir, diz-o: Já estava tudo atualizado.
  • Acesso de programador: os dados públicos que o seu tema pode ler (anexo 22). A documentação do contrato está aberta em todos os planos.

18.2 Planos

Preço fixo: nunca cobramos uma percentagem das suas vendas, e o preço não depende do seu plano Shopify — uma loja Basic e uma loja Plus pagam o mesmo.

  • Gratuito ($0/mês): até 3 pacotes publicados em simultâneo (os rascunhos não contam) com os 8 tipos incluídos. Ao tentar publicar o 4º, a app bloqueia com o aviso correspondente: mova outro para rascunho ou faça upgrade. No plano gratuito, os blocos mostram uma discreta insígnia Powered by Combora.
  • Pro ($14.99/mês): pacotes publicados ilimitados e sem insígnia.
  • Plus ($39.99/mês): tudo o que o Pro tem, mais suporte prioritário, importação/exportação CSV em massa (até 200 pacotes por ficheiro) e suporte de integração direta para o seu programador (lojas headless e temas personalizados).

A faturação passa pela Shopify (Managed Pricing) — é gerida e cancelada a partir da própria página de Planos. Os planos pagos incluem um período de teste gratuito de 7 dias, e se cancelar mantém o plano até ao fim do ciclo que já pagou. As lojas fundadoras (as primeiras 100 instalações) mantêm o produto completo grátis para sempre.

19Diagnóstico e suporte

O Diagnóstico (o segundo separador de Ajuda) é a sua primeira paragem quando algo não bate certo — e o que o suporte vai pedir se abrir um ticket. A Combora regista automaticamente, por loja, tudo o que falha por baixo (no servidor e na sua loja online) mesmo quando o cliente nunca o vê, e este painel coloca-o ao seu alcance. Não guarda quaisquer dados de clientes.

Separador de diagnóstico com verificações de saúde, registo e relatório
O separador Diagnóstico: verificações de saúde no topo, o registo de eventos com filtros ao meio e o relatório de suporte em baixo.

19.1 Verificações de saúde

O estado ao vivo do que o suporte pergunta primeiro, verificado junto da Shopify a cada carregamento:

VerificaçãoO que confirma
PacotesErros de sincronização e pacotes publicados com alterações por publicar (editou e não clicou em Atualizar pacote).
Desconto automático na ShopifyQue o desconto Combora existe e está ATIVO — é o que cobra os preços no checkout.
Índice publicado da lojaQue os dados públicos que os blocos do seu tema leem estão atualizados (pacotes ao vivo vs. esperados).
App embed Combora GiftQue o motor de presentes está ativado no seu tema.
Desconto aplicado em encomendas recentesEncomendas dos últimos 7 dias com um pacote: se TODAS chegaram sem desconto, algo está mal no checkout.
Canal de erros da loja onlineQue os seus blocos de loja online conseguem reportar falhas aqui (data do último evento recebido).
Tarefas de fundoTarefas noturnas falhadas.
Desconhecido não é um alarme: significa que essa verificação não pôde ser confirmada neste momento (por exemplo, o canal da loja online antes de receber o seu primeiro evento). Um problema real é assinalado a vermelho.

19.2 Registo de eventos

Cada entrada é algo que aconteceu e ficou registado: uma falha ao publicar, um presente que a Shopify recusou adicionar (com o motivo exato), um desconto que colidiu com outro, um webhook que falhou… Filtre por nível (Info = esperado mas relevante, como o limite do plano; Aviso; Erro) e por área (publicação, descontos, plano e faturação, loja online, sincronização…). Um registo vazio é bom sinal: só se enche quando algo corre mal. Os eventos são mantidos durante 30 dias.

Privacidade — o que fica registado e o que não. O registo guarda apenas códigos de erro técnicos: o estado HTTP, o pacote e a variante afetados, e o motivo devolvido pela Shopify. A informação dos seus clientes nunca é registada: nem endereços IP, nem nomes, nem emails, nem identificadores de navegação ou cookies — um cliente que compra sem problemas não gera nenhuma entrada no registo. Há também limites automáticos (um máximo diário por loja) e tudo se apaga sozinho ao fim de 30 dias. Se a sua loja receber um pedido de eliminação de dados (RGPD), este registo não tem nada para apagar, e desinstalar a app elimina-o por completo juntamente com o resto dos seus dados.

19.3 O relatório de suporte

Um único documento com tudo o que é preciso para diagnosticar a sua loja de uma só vez: as verificações de saúde, o seu plano e configuração (sem dados sensíveis), o estado de publicação de todos os pacotes e os últimos eventos. Ao contactar o suporte, clique em Copiar relatório (ou Descarregar como ficheiro) e anexe-o ao ticket — assim, quem o ajudar vê exatamente o que aconteceu sem pedir capturas de ecrã nem acesso.

  • O relatório não inclui quaisquer dados de clientes nem chaves: apenas saúde, configuração de pacotes e eventos técnicos.
  • Se o botão de copiar não funcionar no seu navegador, o texto fica selecionado — prima Ctrl+C (Cmd+C num Mac) — ou use a descarga.
Para programadores: os blocos da loja online reportam as suas falhas a /apps/combora/log (um App Proxy assinado pela Shopify). É um canal interno de suporte com um catálogo fechado de códigos e um limite diário — não faz parte do contrato público no anexo 22.

20Limites e regras importantes

A referência única para os limites, verificada face ao código da app:

Limite / regraValorO que acontece ao atingi-lo
Pacotes publicados (plano Gratuito)3Publicar o 4º é bloqueado com um aviso. Os rascunhos não contam.
Componentes num pacote fixo30O editor não deixa adicionar mais.
Produtos num combo (achatado)50 entradasO editor mostra o uso (Usa X de 50) e bloqueia o excesso.
Coleções por seletor100Validado ao guardar.
Combinação de presente (GWP)2–5 artigosValidado ao guardar.
Título como mensagem do desconto100 carateresO texto mostrado no checkout é cortado (o título completo é mantido).
Gerar a partir de uma coleção100 rascunhosCortado, e a app avisa.
Importação de CSV200 linhasCortado, e a app diz para dividir o ficheiro.
Ofertas visíveis por bloco1–8 (por defeito 3)Ajustável em cada bloco de tema; prioriza as ofertas que declaram preço/poupança.
Configuração total publicada≈19,8 KB (2 blocos de 9,9 KB)Com muitíssimos pacotes enormes ao mesmo tempo, os mais recentes acabariam publicados sem preço ativo até libertar espaço (um caso extremo; a app prioriza os pacotes mais antigos e reparte a configuração automaticamente em dois blocos).

Regras de dinheiro (sempre exatas)

  • As percentagens arredondam o desconto para baixo (nunca se arredonda a favor de cobrar mais).
  • Os valores e preços fixos são repartidos pelas linhas com um remanescente exato: a soma das partes é sempre igual ao total.
  • As casas decimais dependem da moeda da sua loja (JPY sem nenhuma, BHD com três…) — nunca se assumem duas casas decimais.
  • O preço cobrado é calculado pela Shopify no checkout a partir da configuração publicada. O que os blocos do tema mostram é informativo.

Multi-moeda (Shopify Markets)

Se vende em várias moedas, não há nada para configurar: define preços, limites e descontos na moeda da sua loja, e a Combora trata do resto. Um cliente a comprar noutra moeda vê os valores do widget convertidos para a sua (o limite do presente, o preço do pacote, a poupança de cada nível), e no checkout o desconto é convertido à taxa de câmbio da Shopify nesse momento — a mesma que converte os preços dos seus produtos. A regra de ouro mantém-se: o que o cliente vê anunciado é exatamente o que o checkout lhe cobra, na sua moeda.

Outras regras

  • As subscrições são bloqueadas nas linhas de pacote a não ser que ative explicitamente essa opção (secção 4.5).
  • Um presente GWP não é anunciado na própria página do produto-presente (um prémio não é um isco).
  • Os pacotes publicados fora da sua janela de agendamento não aplicam nenhum desconto (reativam-se sozinhos).

21Resolução de problemas

Não consigo ver a oferta na minha loja online
① O pacote está Publicado (não em rascunho) e dentro da sua janela de datas? ② Adicionou o bloco certo ao template (o cartão Onde isto aparece no editor)? ③ Se editou um pacote publicado, clicou em Atualizar pacote?
O presente não se adiciona sozinho
① O app embed Combora Gift está ativado? ② O carrinho cumpre a condição contando apenas o que se qualifica (o presente não conta)? ③ O cliente removeu-o manualmente nesta sessão? ④ O presente tem stock?
O desconto do carrinho não é o que eu esperava
Lembre-se da regra: só a melhor oferta por linha. Se dois pacotes competirem pelo mesmo artigo, ganha o que desconta mais (e em caso de empate, o mais antigo). A soma só acontece dentro de um combo.
A app diz: Tem outro desconto automático ativo
Isto é informação, não um erro. Significa que tem os seus próprios descontos automáticos de produto na Shopify. Onde um pacote da Combora e um desses descontos incidem sobre o mesmo produto, a Shopify aplica apenas o melhor dos dois — sobrepor dois descontos de produto no mesmo artigo exige Shopify Plus. Isso é uma regra da Shopify, não da Combora. Os seus pacotes combinam-se com os seus descontos de encomenda e de envio, e com descontos de produto que incidam sobre outros produtos. O aviso identifica o desconto específico em sobreposição para saber qual analisar.
Publiquei e diz limite do plano
O plano Gratuito permite 3 pacotes publicados em simultâneo. Mova outro para rascunho ou faça upgrade.
A barra de progresso do presente não aparece
Renderiza no template do carrinho (o bloco Combora gift progress) e só para ofertas cujo critério possa ser avaliado no navegador. Com coleções como o que conta, também funciona, porque a app resolve os produtos da coleção ao publicar; a única exceção é uma coleção muito grande (mais de ~150 produtos), onde a barra não é mostrada mesmo que o presente continue a funcionar.
O seletor de caixas de verificação não aparece no mix / caixa
O seletor aparece em qualquer âmbito: com variantes específicas mostra exatamente essas caixas de verificação, e com produtos ou uma coleção a lista é resolvida ao publicar (e atualizada todas as noites, ou de imediato se voltar a publicar). Se continuar vazio, o grupo elegível não tem produtos compráveis — verifique a nota de pré-visualização no editor. De qualquer forma, o cliente pode adicionar produtos como habitualmente e o desconto ativa-se ao qualificar-se.
Erros ao importar um CSV
Cada linha falhada é listada com o seu motivo. Corrija essas linhas e volte a executar só com elas — as linhas boas já foram criadas.
Suspeito que um desconto ficou órfão
Definições → Sincronizar descontos repara o estado. Nunca edite manualmente o desconto Combora na secção de Descontos da Shopify.

22Anexo para programadores: o contrato público

A Combora publica os dados dos seus pacotes na sua loja como metaobjects e metafields sob o namespace combora, publicamente legíveis a partir da loja online. Qualquer programador pode construir uma interface totalmente personalizada lendo estes dados a partir do Liquid ou da Storefront API — sem chamar nenhuma API da app. Este contrato é versionado e apenas aditivo (versão atual: public.v1): os campos existentes nunca são renomeados nem reetipados.

22.1 O que é criado na instalação

A instalação disponibiliza as definições (os esquemas) — visíveis em Definições → Metafields e metaobjects e em Conteúdo → Metaobjects:

  • Metaobjects: combora_bundle (o pacote), combora_component (cada linha de componente) e combora_tier (cada nível de volume/limiar). Todos os três com acesso PUBLIC_READ na loja online, publicáveis e traduzíveis.
  • Metafields da loja: combora.index e combora.manifest (JSON, leitura pública), e combora.all_pdp_gwps (list.metaobject_reference → combora_bundle): os presentes aplicados à loja inteira que optaram por ser anunciados em todas as páginas de produto.
  • Metafield de produto: combora.bundles (list.metaobject_reference → combora_bundle) — o índice inverso produto → os seus pacotes.
⚠️ Uma limitação do Liquid com referências ao nível da loja: um list.metaobject_reference de loja (como all_pdp_gwps) não se resolve em metaobjects no Liquid do tema (o de produto resolve-se; o JSON da loja também). Para renderizar esses presentes em Liquid, leia as entradas do index com "all_pdp": true e resolva cada pacote pelo handle: metaobjects['combora_bundle'][entry.handle]. Através da Storefront GraphQL API, a referência resolve-se normalmente.
Conteúdo → Metaobjects com as três definições da Combora
Conteúdo → Metaobjects: as três definições, Adicionadas pela Combora, com as suas entradas.
Definição do metafield de produto Combora bundles
O metafield de produto Combora bundles (tipo Metaobject), em uso nos produtos que fazem parte de pacotes.
Índice de definições de metafields da loja e manifest
Os metafields da loja Combora bundle index e Combora contract manifest (JSON); desde agosto de 2026 juntam-se-lhes o Combora store-wide gift offers (all_pdp_gwps).

22.2 O que acontece ao publicar / atualizar / retirar

EventoEfeito no contrato
Publicar um pacoteOs seus metaobjects são criados/atualizados (primeiro os filhos, depois o pai, com handles determinísticos), combora.index e combora.manifest são regenerados, o metafield combora.bundles de todos os produtos participantes é escrito, e as traduções dos campos traduzíveis são semeadas (os idiomas ativados na sua loja de entre os 7 que a app fornece; nunca substitui uma tradução que tenha personalizado no Translate & Adapt). O índice nunca anuncia um pacote cuja escrita tenha falhado.
Atualizar pacoteUma reprojeção completa e idempotente: reescreve a projeção do pacote a partir da configuração (por isso também funciona como reparação). A lista de referências do pai é reescrita no mesmo passo — a loja online nunca vê uma referência pendurada — e quaisquer metaobjects filhos deixados para trás são removidos pela limpeza noturna.
Mover para rascunhoO metaobject passa a estado de rascunho (deixa de se resolver na loja online), o pacote sai do índice e o seu preço desliga-se. A configuração é mantida.
EliminarOs seus metaobjects são eliminados, combora.bundles é limpo nos seus produtos e, se era um pacote fixo, o produto principal é retirado.
Desinstalar a appOs metaobjects e metafields combora pertencem à loja e permanecem (o seu tema não quebra; os dados ficam congelados no seu último estado). Os metafields privados $app:* são removidos automaticamente pela Shopify e o desconto Combora fica inerte. Ao reinstalar, a app reutiliza e reconcilia tudo — nada é duplicado.

22.3 combora_bundle campo a campo

CampoTipoTraduzívelConteúdo
titletextosimTítulo na loja online (obrigatório).
descriptiontexto formatadosim⚠️ A definição existe mas a app ainda não escreve este campo: hoje chega sempre vazio — renderize de forma tolerante a blank.
badge_labeltextosimA insígnia (Melhor valor).
testbooleanonãoModo de teste. "true" ⇒ os widgets renderizam este pacote só no editor de temas e em temas cujo papel não é o publicado. Ausente ou "false" ⇒ ao vivo.
stylejsonnãoEstilo do widget pré-compilado (estúdio de design): {"v":1,"source":"app","vars":"--combora-…","mode_class":"combora-w--styled","model":{…}}. Copie vars para o atributo style da sua raiz e mode_class como uma classe. Com "source":"block" (ou o campo ausente), prevalecem as definições do bloco no editor de temas.
cta_labeltextosimTexto do botão (opcional).
disclaimertexto formatadosim⚠️ Tal como description: definido mas ainda sem conteúdo — tolere blank.
bundle_typetexto (opções)nãoUm de: fixed · mix_and_match · volume · bogo · gwp · build_a_box · fbt · combo.
min_items / max_itemsinteironãoMix (mín/máx) e monte a sua caixa (tamanho em min_items).
thresholdinteironãoO limite do GWP em unidades mínimas (cêntimos), sempre na moeda da loja — ver a regra multi-moeda em 22.9.
discount_valuejsonnão {"kind":"percentage","bps":1500} (pontos base: 1500 = 15%) ou {"kind":"fixed_amount","amount":500} (unidades mínimas).
configjsonnãoEscalares por tipo: price (fixo em modo preço), buy_qty/get_qty (bogo), gift_variant/threshold/min_qty/combination/qualify (gwp — a condição completa vive aqui: gasto em unidades mínimas, unidades mínimas, ambos, ou uma combinação), slots/box_price (caixa), anchor_variant (fbt), eligible (o descritor do grupo), of (combo).
componentslista de referências—→ combora_component (variante, quantidade, papel: component/option/anchor/gift/suggestion, posição, etiqueta…).
tierslista de referências—→ combora_tier (min_qty, discount_value, posição, etiqueta do nível…).
productreferência de produtonãoProduto âncora (o principal de um pacote fixo, o produto principal de um FBT).
imagereferência de ficheironãoMedia opcional do pacote.
revision / contract_versioninteiro / textonãoRevisão publicada e versão do contrato (public.v1).
Entrada combora_bundle no admin
Uma entrada real de combora_bundle em Conteúdo → Metaobjects: título, estado Ativo, handle determinístico combora-bundle-{id}.
Campos discount_value, components, anchor, versão do contrato
A mesma entrada: discount_value como JSON em pontos base, as referências de componentes, o produto âncora e contract_version = public.v1.
Não edite estas entradas manualmente. São uma projeção da configuração da app. A sincronização noturna repara as definições (os esquemas) e reafirma a insígnia do plano; o conteúdo de uma entrada editada manualmente é reposto na próxima publicação/atualização desse pacote — até lá, o que escreveu à mão fica como está (e pode não coincidir com o que a app cobra).

22.4 O descritor eligible

O grupo elegível do pacote, com a mesma forma em todos os tipos:

{ "mode": "all" | "products" | "collections" | "variants",
  "variants":   ["gid://shopify/ProductVariant/…"],
  "products":   ["gid://shopify/Product/…"],
  "collections":["gid://shopify/Collection/…"],
  "resolved_count": 12, "total_count": 12, "truncated": false }

Só as listas não vazias são incluídas. As três chaves de resolução são informativas (em grupos de coleção dizem quantos membros foram materializados e se o snapshot foi cortado) — pode ignorá-las. Repare na convenção: o config do metaobject usa snake_case (gift_variant, min_qty), enquanto o objeto gwp no index usa camelCase (giftVariant, minQty) — os mesmos dados em duas superfícies diferentes.

Atenção: os filhos role:"option" de um grupo de coleção são um snapshot tirado no momento da publicação; a pertença ao vivo (e o preço) é sempre resolvida pela Function no checkout.

22.5 combora.index e combora.manifest

shop.metafields.combora.index — a tabela de encaminhamento dos pacotes publicados (existe para nunca ter de percorrer metaobjects.combora_bundle.values, que o Liquid corta silenciosamente aos 50):

{ "schema": 1, "revision_highwater": 128, "generated_at": "…",
  "bundles": [
    { "id": "f3062319-9d6e-…", "handle": "combora-bundle-f3062319-9d6e-…", "type": "fixed",
      "gid": "gid://shopify/Metaobject/…", "status": "active", "revision": 42 }
  ] }

O id é um identificador de texto, não um número. Só os pacotes que estão publicados e dentro da sua janela de agendamento são anunciados, pelo que o índice acompanha o preço do checkout. Algumas entradas trazem campos extra: gwp (a oferta de presente, só em pacotes de tipo presente), gwps (as ofertas de presente de um combo, pela ordem das sub-ofertas) e test (true se o pacote está em modo de teste: o JS da loja online ignora-o no tema publicado).

shop.metafields.combora.manifest — o descritor do contrato que uma ferramenta lê uma vez: contract_version, schema_version, o contador de pacotes e os GIDs das três definições. Pode trazer powered_by_badge: true, que é o que acende a insígnia Powered by Combora nos blocos (só em lojas do plano Gratuito; nas outras, o campo é omitido).

22.6 Ler a partir do Liquid

{%- comment -%} Numa página de produto: os pacotes DESTE produto {%- endcomment -%}
{%- for bundle in product.metafields.combora.bundles.value -%}
  <h3>{{ bundle.title.value | escape }}</h3>
  {%- if bundle.badge_label.value != blank -%}
    <span class="badge">{{ bundle.badge_label.value | escape }}</span>
  {%- endif -%}
  <ul>
    {%- for component in bundle.components.value -%}
      {%- comment -%} label é opcional: se estiver ausente, recorre ao título da variante e
          depois ao título do produto. CUIDADO: se o produto NÃO estiver publicado no canal
          Loja Online, a sua referência não se resolve em Liquid e TODOS os recursos
          alternativos devolvem blank — proteja o nome final ou vai renderizar um "1× " vazio. {%- endcomment -%}
      {%- assign name = component.label.value -%}
      {%- if name == blank -%}{%- assign name = component.variant.value.title -%}{%- endif -%}
      {%- if name == blank or name == 'Default Title' -%}{%- assign name = component.variant.value.product.title -%}{%- endif -%}
      {%- if name != blank -%}
        <li>{{ component.quantity.value }}× {{ name | escape }}</li>
      {%- endif -%}
    {%- endfor -%}
  </ul>
{%- endfor -%}

{%- comment -%} Ou por handle direto, em qualquer template {%- endcomment -%}
{%- assign bundle = metaobjects.combora_bundle['combora-bundle-{id}'] -%}

As duas vias são leituras limitadas (a lista do próprio produto, ou um handle direto) — nunca o .values global. Duas armadilhas do Liquid que lhe poupam uma tarde: (1) um for sobre uma lista de referências corta silenciosamente aos 50 — os pacotes da Combora nunca lá chegam (o maior limite é de 50 entradas no total), mas não itere coleções de outros assumindo que vê tudo; (2) os campos opcionais (label, badge_label, cta_label) chegam muitas vezes vazios — proteja com != blank como acima.

22.7 Ler a partir da Storefront API (localizado)

query BundleByHandle @inContext(language: FR) {
  metaobject(handle: { type: "combora_bundle", handle: "combora-bundle-{id}" }) {
    title:       field(key: "title")       { value }
    badge_label: field(key: "badge_label") { value }
    components:  field(key: "components") {
      references(first: 25) {
        nodes { ... on Metaobject {
          label:    field(key: "label")    { value }
          quantity: field(key: "quantity") { value }
        } }
      }
    }
  }
}

@inContext devolve as traduções semeadas pela app; o que não estiver traduzido recorre automaticamente ao idioma base.

22.8 O que pode construir com isto

  • Uma interface de pacotes totalmente personalizada no tema, sem os blocos da Combora, lendo título, insígnia, componentes e poupança a partir do metaobject.
  • Uma landing page de campanha: uma página que lista os pacotes ativos a partir de combora.index e renderiza cada um pelo seu handle.
  • Headless / Hydrogen: a mesma leitura através da Storefront API com localização por mercado.
  • Integrações (feeds, apps de recomendação): o manifest declara a versão do contrato e onde tudo está.

22.9 Regras para o programador

  • O preço pertence à Function. Os campos do metaobject são para exibição: não some o discount_value de um combo nem recalcule preços no tema — o checkout é a autoridade.
  • Apenas aditivo: podem surgir novos campos; os existentes não mudam. Escreva leituras tolerantes a campos desconhecidos.
  • Combos: agrupe os filhos pela position dividida por 1000 (cada sub-oferta ocupa uma faixa de 1000) ou por config.of[].index — nunca por role, que se pode repetir.
  • Estilo: se construir a sua própria interface, ignore style e escreva o seu CSS. Se, em vez disso, quiser respeitar o design que o comerciante escolheu na app, copie style.vars para o atributo style da sua raiz e style.mode_class como uma classe; a predefinição Sem estilo do estúdio existe exatamente para o caso oposto (markup limpo, o seu CSS, com .combora-w e as variáveis --combora-* como pontos de ligação).
  • Privado ≠ contrato: os metafields $app:runtime, $app:fnvars e $app:validation do desconto são internos às Functions, não têm acesso na loja online, e a sua forma pode mudar sem aviso. Não construa sobre eles.
  • Multi-moeda (Shopify Markets): todos os valores no contrato — config.price, threshold, fixed_amount.amount, box_price — estão sempre na moeda da loja, em unidades mínimas. Se a sua loja vende em várias moedas, converta ao apresentar (em Liquid, multiplique por cart.currency.rate; em JS, por Shopify.currency.rate) antes de formatar; renderizar o número em bruto com a moeda de apresentação do comprador mostra um preço errado. O desconto real do checkout é calculado pela app e está sempre correto — esta regra só se aplica ao que o SEU widget mostra.
  • Não escreva no namespace combora. A Shopify dá-lhe acesso de escrita a ele (é a sua loja), mas a app regenera-o em cada publicação e uma revisão noturna repõe os campos que governam o plano. O que for seu vai no seu próprio namespace.
  • Este anexo é a referência completa do contrato para programadores externos. Se faltar algo de que precise, escreva-nos através do chat da app ou para o suporte e nós documentamo-lo.

23Anexo para programadores: um widget por tipo, em Liquid

O anexo anterior descreve o que o contrato contém; este mostra como renderizar cada tipo de pacote com ele. Todo o código abaixo lê apenas o contrato público — nenhuma API da app, nenhum dos blocos da própria Combora — pelo que pode colá-lo num snippet ou num bloco Liquid personalizado no template de produto e adaptar o markup livremente. Três regras aplicam-se a tudo nesta página:

  • O preço pertence à Function. Tudo aqui é exibição; o valor realmente cobrado é calculado pela Shopify Function da Combora no checkout. Nunca recalcule um total para o apresentar como o preço.
  • Os valores são unidades mínimas na moeda da loja. Multiplique por cart.currency.rate antes de formatar, ou um comprador a navegar noutra moeda vê um número errado.
  • Os campos opcionais chegam muitas vezes vazios. Proteja com != blank — incluindo o nome do componente depois dos seus recursos alternativos (ver 22.6).

23.1 O esqueleto em que todos os exemplos encaixam

Um cartão por pacote do produto atual, com título, insígnia e a poupança seja qual for a forma como o pacote a expressa (discount_value em pontos base ou unidades mínimas). Cada tipo renderiza depois o seu próprio corpo dentro do case:

{%- liquid
  assign bundles = product.metafields.combora.bundles.value
  assign rate = cart.currency.rate | default: 1
-%}

{%- if bundles != blank -%}
  {%- for bundle in bundles -%}
    {%- liquid
      assign type = bundle.bundle_type.value
      assign dv = bundle.discount_value.value
      assign cfg = bundle.config.value
    -%}
    <article class="cx__card">
      <h3>{{ bundle.title.value | escape }}</h3>
      {%- if bundle.badge_label.value != blank -%}
        <span class="cx__badge">{{ bundle.badge_label.value | escape }}</span>
      {%- endif -%}

      {%- comment -%} A poupança, seja qual for a forma como este pacote a expressa {%- endcomment -%}
      {%- if dv.kind == 'percentage' -%}
        <p>Poupe {{ dv.bps | divided_by: 100 }}%</p>
      {%- elsif dv.kind == 'fixed_amount' -%}
        <p>Poupe {{ dv.amount | times: rate | money }}</p>
      {%- endif -%}

      {%- case type -%}
        {%- comment -%} um bloco por tipo — as secções 23.2 a 23.7 entram aqui {%- endcomment -%}
      {%- endcase -%}
    </article>
  {%- endfor -%}
{%- endif -%}

23.2 Pacote fixo

Liste os filhos com role == 'component' com a cadeia de recursos alternativos do nome, mostre o preço do pacote quando o pacote usa o modo de preço (config.price, unidades mínimas) e ligue ao produto-pai comprável:

{%- when 'fixed' -%}
  <ul>
    {%- for c in bundle.components.value -%}
      {%- if c.role.value == 'component' -%}
        {%- liquid
          assign name = c.label.value
          if name == blank
            assign name = c.variant.value.title
          endif
          if name == blank or name == 'Default Title'
            assign name = c.variant.value.product.title
          endif
        -%}
        {%- if name != blank -%}
          <li>{{ c.quantity.value }}× {{ name | escape }}</li>
        {%- endif -%}
      {%- endif -%}
    {%- endfor -%}
  </ul>
  {%- if cfg.price -%}
    <p class="cx__price">{{ cfg.price | times: rate | money }}</p>
  {%- endif -%}
  {%- if bundle.product.value != blank -%}
    <a href="{{ bundle.product.value.url }}">Comprar este pacote</a>
  {%- endif -%}

Um pacote fixo em modo de preço traz config.price e nenhum discount_value; em modo de desconto é ao contrário — a linha de poupança do esqueleto já cobre o segundo caso.

Num produto com uma única variante, o título da variante é o marcador da Shopify «Default Title»: a cadeia de recursos alternativos ignora-o e usa o título do produto (é para isso que serve a condição extra).

23.3 Desconto por volume

A escada vive em tiers (ordenados por position), cada escalão com o seu próprio min_qty e discount_value:

{%- when 'volume' -%}
  <table>
    {%- for t in bundle.tiers.value -%}
      {%- assign tv = t.discount_value.value -%}
      <tr>
        <td>Compre {{ t.min_qty.value }}+</td>
        <td>
          {%- if tv.kind == 'percentage' -%}
            {{ tv.bps | divided_by: 100 }}% de desconto
          {%- else -%}
            {{ tv.amount | times: rate | money }} de desconto
          {%- endif -%}
        </td>
      </tr>
    {%- endfor -%}
  </table>

23.4 Compre X, leve Y

A regra são dois escalares em config; uma percentagem de 100% (bps == 10000) significa que os artigos de recompensa são grátis:

{%- when 'bogo' -%}
  <p>Compre {{ cfg.buy_qty }}, leve {{ cfg.get_qty }}
    {%- if dv.kind == 'percentage' and dv.bps == 10000 %} grátis{% else %} com desconto{% endif -%}.</p>

23.5 Combine e poupe e monte a sua caixa

Ambas são ofertas de "atingir uma quantidade": o combine e poupe lê o min_items do metaobject, a caixa lê config.slots (e config.box_price quando a caixa cobra um preço fechado). O grupo elegível está em config.eligible (ver 22.4):

{%- when 'mix_and_match' -%}
  <p>Escolha {{ bundle.min_items.value }} ou mais da seleção.</p>
{%- when 'build_a_box' -%}
  <p>Encha uma caixa de {{ cfg.slots }}.
    {%- if cfg.box_price %} Preço da caixa {{ cfg.box_price | times: rate | money }}.{% endif -%}</p>

23.6 Complementos (FBT)

Os componentes trazem papéis: o anchor é o produto principal, os filhos suggestion são os complementos:

{%- when 'fbt' -%}
  <ul>
    {%- for c in bundle.components.value -%}
      {%- if c.role.value == 'suggestion' or c.role.value == 'anchor' -%}
        <li>
          {{ c.variant.value.product.title | default: c.label.value | escape }}
          {%- if c.role.value == 'anchor' %} <em>(este artigo)</em>{% endif -%}
        </li>
      {%- endif -%}
    {%- endfor -%}
  </ul>

23.7 Combo

Um combo aninha sub-ofertas. Agrupe os seus filhos pela position dividida por 1000 (cada sub-oferta ocupa uma faixa de 1000) ou percorra config.of[] — nunca agrupe por role, que se repete entre sub-ofertas:

{%- when 'combo' -%}
  <ol>
    {%- for sub in cfg.of -%}
      <li>{{ sub.type | replace: '_', ' ' }}</li>
    {%- endfor -%}
  </ol>

23.8 Ofertas de presente de toda a loja, em qualquer página

Os presentes anunciados em todas as páginas de produto vivem num metafield de loja, e o Liquid do tema não resolve uma lista de metaobjects ao nível da loja (22.1). Leia antes o index JSON e resolva cada pacote pelo seu handle:

{%- assign index = shop.metafields.combora.index.value -%}
{%- if index != blank -%}
  {%- for entry in index.bundles -%}
    {%- if entry.all_pdp and entry.status == 'active' -%}
      {%- assign gift = metaobjects['combora_bundle'][entry.handle] -%}
      {%- if gift != blank -%}
        <aside class="cx__gift">
          <strong>{{ gift.title.value | escape }}</strong>
          {%- assign gcfg = gift.config.value -%}
          {%- if gcfg.threshold -%}
            <span>Gaste {{ gcfg.threshold | times: rate | money }} para o desbloquear.</span>
          {%- endif -%}
        </aside>
      {%- endif -%}
    {%- endif -%}
  {%- endfor -%}
{%- endif -%}

23.9 O snippet completo

Tudo o que está acima reunido num único ficheiro funcional — o esqueleto, os seis corpos de tipo, os presentes de toda a loja e um CSS mínimo para que seja legível à primeira: descarregar combora-custom-bundle.liquid. Guarde-o como snippets/combora-custom-bundle.liquid no seu tema e renderize-o a partir do template de produto com {% render 'combora-custom-bundle', product: product %}. O GWP não está no case de propósito: um presente é anunciado (23.8 ou os blocos da própria app) e adicionado automaticamente pela app — não há nada que um widget de cartão de produto tenha de vender.

24Histórico desta edição

Todos os fluxos deste manual foram testados numa loja real. Aqui fica o registo de quando foi verificado e o que mudou depois, para saber quão atual é o que está a ler.

DataO que foi feito
15 de agosto de 2026Primeira edição completa, verificada de ponta a ponta na loja de desenvolvimento app-bundle-6pofnlbj, com compras de teste reais (gateway Bogus). Foram encontrados dois desvios (I-01: o grupo elegível para o presente excluía demasiado; I-02: os motivos de erro do CSV ficavam sem traduzir) e ambos foram corrigidos, com um teste de regressão.
21 de agosto de 2026Revisão face ao código e à app em produção. Foi acrescentada a secção 13 (Desenhar o widget); a visibilidade no catálogo do pacote fixo (5.1); os três gráficos de Estatísticas; o aviso tem outro desconto automático ativo em Resolução de problemas; o presente à loja inteira nas páginas de produto (9.3); e, no anexo, os campos test e style, mais o powered_by_badge e os campos extra do índice. O texto do modo de teste foi refinado e a numeração do anexo corrigida.
21 de agosto de 2026
(capturas)
Depois do shopify app deploy que levou o redesenho do widget à loja, as capturas da loja online foram refeitas na loja real: a escada de níveis do volume, os separadores + nos complementos, o seletor de combine e poupe, o cartão do combo com os seus chips de quantidade, a barra de presente (bloqueada e desbloqueada), os carrinhos de volume, mix e BOGO, e os três de pacote fixo (cartão, produto principal e carrinho). Refazer esta última corrigiu um erro substancial: a legenda do produto principal dizia que a sua página mostra o preço do pacote, quando o que o tema pinta é a soma dos componentes — o preço do pacote é aplicado pela Function ao chegar ao carrinho.
24 de agosto de 2026Todas as capturas de ecrã foram refeitas na loja de demonstração pública da Combora, construída para a ocasião com um pacote publicado por tipo e nomes apresentáveis, e o texto foi adaptado aos valores que essas capturas mostram. As capturas da interface da app existem agora nos 7 idiomas. Todos os preços citados a partir daqui foram medidos num carrinho real nessa loja, não calculados. A loja online corre o tema Horizon da Shopify.
10 de setembro de 2026Todo o catálogo da loja de demonstração foi reprecificado para números redondos e cada tipo passou para produtos próprios, para que cada exemplo meça uma só oferta e não a arbitragem entre várias. Depois disso, os valores deste manual foram medidos de novo, carrinho a carrinho; é por isso que diferem das entradas acima: o pacote fixo ($1,600.00 → $1,299.00), o volume a 2 e a 4 unidades ($2,000.00 → $1,800.00 e $4,000.00 → $3,200.00), o BOGO a 3 ($900.00 → $600.00), o mix a 3 ($1,050.00 → $840.00), a caixa de 3 ($2,100.00 → $1,749.00), os complementos ($800.00 → $600.00), o presente acima de $1,000 ($1,070.00 → $1,050.00) e o combo a 2 unidades ($1,040.00 → $850.00). Duas legendas descreviam comportamentos que já não existem e foram corrigidas: um combo não é mostrado como cartão na página de produto (cada sub-oferta é promovida pelo seu próprio bloco, e o combo vê-se no carrinho), e a barra do presente agora dá o nome do presente e do que conta em quatro estados, com uma mensagem própria opcional por estado (secção 9.2). O limite do presente é medido sobre preço de tabela.
23 de agosto de 2026O manual tornou-se multilingue: agora é gerado a partir de um shell partilhado mais uma fonte de conteúdo por idioma, com um seletor de idioma no painel esquerdo e alternativas hreflang. O inglês é a versão canónica. Durante a tradução, foi encontrada e corrigida uma contradição em Resolução de problemas: afirmava que o seletor de caixas de verificação só aparece com variantes específicas, quando a 6.1 documenta corretamente que aparece em qualquer âmbito.

As capturas de ecrã estão em app/combora/public/manual/img/ no repositório: as da interface da app em img/<idioma>/, um conjunto por idioma, e as da loja online e do admin da Shopify na raiz, porque essas seguem o seu tema e o seu admin, não o idioma da app. São refeitas a partir da loja de demonstração; ver docs/manual/CAPTURAS.md para o estado que cada uma precisa.