# Recupere carrinhos abandonados por e-mail ou WhatsApp

> Crie uma campanha de Disparo por API com Atraso e ligue a reentrada com 1 dia de espera. Sua loja chama /api/campaigns/trigger a cada mudança no carrinho e /api/campaigns/cancel quando o pedido fecha. Cada chamada reinicia a contagem, e o lembrete cancelado não sai nem conta como envio.

Fonte: https://wiki.bip.marketing/pt-br/carrinho-abandonado · Atualizado: 2026-10-08

<UseCaseMeta effort="api" channel="email,whatsapp" plan="free" />

Quem deixou o carrinho recebe um lembrete com o próprio nome e o produto que ficou para trás, na hora que você escolher. Quem comprou antes não recebe nada.

<Checklist items="Uma conta na BIP (o plano gratuito envia por e-mail)|Acesso ao servidor da sua loja, onde o carrinho e o pedido acontecem|O nome e o e-mail do cliente assim que ele se identifica no carrinho (o telefone, para WhatsApp)|Uma chave de API com Disparo de Campanhas e Escrita de Contatos|Para WhatsApp: plano pago, número conectado e um template aprovado" />

## O que você vai conseguir

- Um lembrete para quem deixou o carrinho, com o primeiro nome e o produto que ficou para trás.
- Nenhuma mensagem para quem ainda está comprando: cada mudança no carrinho reinicia a contagem.
- Nenhum lembrete para quem já comprou: o pedido cancela o envio, e o envio cancelado não conta no seu saldo.
- No máximo um lembrete a cada 24 horas por pessoa, a cada carrinho que ela abandonar.
- Contatos novos criados na mesma chamada, sem duplicar quem já está na BIP.

## Como funciona

<Steps items="Sua loja chama a BIP sempre que o carrinho muda|A BIP espera o atraso e reinicia a contagem se a pessoa voltar|Comprou, a loja cancela; não comprou, o lembrete sai" />

A campanha usa o **Disparo por API** no modo **Atraso**. Na prática:

- Sua loja chama `/api/campaigns/trigger` a cada mudança no carrinho de um cliente identificado. A BIP agenda o lembrete para daqui a uma hora (ou o tempo que você definir).
- Uma nova chamada para a mesma pessoa reinicia a contagem. Cada pessoa tem no máximo um lembrete esperando nesta campanha.
- Quando o pedido fecha ou o carrinho é esvaziado, a loja chama `/api/campaigns/cancel`. O lembrete pendente é descartado, não sai e não conta como envio.
- Se a hora chega sem compra, a BIP confere a **Janela de Reentrada do Lead** e monta o e-mail com os dados mais recentes do contato. Se a pessoa trocou de produto, o lembrete mostra o carrinho atualizado.

## Passo a passo

### 1. Crie os campos do carrinho

O lembrete fica mais forte quando cita o produto. Para isso, a loja grava o produto num campo do contato a cada chamada.

1. Em **Configurações** → **Geral**, vá até **Campos** e clique em **Adicionar Campo**.
2. Em **Tipo de Campo**, escolha **String**. Em **Nome do Campo**, digite _Produto do carrinho_ e clique em **Salvar**.
3. Para a versão por WhatsApp, crie também o campo _Código do carrinho_, do tipo **String**. Ele leva a pessoa direto ao carrinho dela.

<Shot src="/img/carrinho-abandonado/1-pt-br.png" alt="Campos personalizados Produto do carrinho e Código do carrinho em Configurações, aba Geral" url="dash.bip.marketing/…/settings" />

### 2. Crie a chave de API

1. Em **Configurações**, abra a aba **Chaves de API** e clique em **Adicionar Nova Chave de API**.
2. Em **Nome**, digite _Loja Horizonte — carrinho_.
3. Em **Escopos**, ligue **Disparo de Campanhas** e **Escrita de Contatos**. O segundo deixa a loja mandar o contato como objeto: a BIP cria ou atualiza o contato e agenda o lembrete na mesma chamada.
4. Clique em **Salvar** e copie a **Chave de API**. Guarde a chave no servidor da loja, numa variável de ambiente, e nunca no código do site.

<Shot src="/img/carrinho-abandonado/2-pt-br.png" alt="Nova chave de API com os escopos Disparo de Campanhas e Escrita de Contatos ligados" url="dash.bip.marketing/…/settings?tab=api-keys" />

### 3. Monte o e-mail do lembrete

1. Em **Modelos de Email**, clique em **Novo Modelo**.
2. Clique em **Configurações** e preencha **Nome**, **Idioma** (**Português**), **Assunto** e **Pré-visualização**. Os textos estão em [Pronto para copiar](#pronto-para-copiar).
3. Monte os blocos: logo, cabeçalho, texto, botão para o carrinho e redes sociais.
4. No texto, digite `@Produto` e escolha _"Produto do carrinho" field value_. Clique na etiqueta e preencha o **Valor de Fallback** com `alguns produtos`.
5. No bloco de botão, preencha **URL do Link** com a página do carrinho da sua loja.
6. Clique em **Salvar**.

<Shot src="/img/carrinho-abandonado/3-pt-br.png" alt="Editor de e-mail com o lembrete de carrinho e a variável do produto no texto" url="dash.bip.marketing/…/emails-templates/…" />

### 4. Crie a campanha com atraso

1. Em **Campanhas**, clique em **Nova Campanha**.
2. Em **Nome da Campanha**, digite _Carrinho abandonado — e-mail_ e escolha o emoji 🛒.
3. Em **Tipo de Agendamento**, escolha **Disparo por API**.
4. Em **Modo de Disparo**, escolha **Atraso**. Em **Atraso (Segundos)**, digite `3600` (uma hora).
5. Em **Canal**, escolha **Email** e, em **Modelo de E-mail**, ligue o modelo do passo 3.

Campanhas por API não têm seção de segmentos: cada chamada da loja diz quem recebe.

<Shot src="/img/carrinho-abandonado/4-pt-br.png" alt="Campanha com Disparo por API, modo Atraso e 3600 segundos" url="dash.bip.marketing/…/campaigns/…" />

### 5. Ligue a reentrada

Quem abandona um carrinho hoje pode abandonar outro no mês que vem. Com a **Janela de Reentrada do Lead** desligada (o padrão), cada contato recebe a campanha uma vez só, para sempre: o segundo carrinho da Marina não ganharia lembrete.

1. Em **Janela de Reentrada do Lead**, ligue **Permitir Reentrada do Lead**.
2. Em **Período de Espera (Dias)**, digite `1`.

Com 1 dia, cada pessoa recebe no máximo um lembrete a cada 24 horas, mesmo que abandone vários carrinhos no mesmo dia. A BIP confere a janela quando o atraso termina. Um lembrete barrado pela janela aparece como **Rejeitado** nas estatísticas e não conta como envio. Não deixe em `0`: sem período de espera, a mesma pessoa pode receber vários lembretes no mesmo dia.

<Shot src="/img/carrinho-abandonado/5-pt-br.png" alt="Janela de Reentrada do Lead com Permitir Reentrada do Lead ligado e 1 dia de espera" url="dash.bip.marketing/…/campaigns/…" />

### 6. Teste e ative

1. Clique em **Salvar** → **Salvar Rascunho**.
2. Clique em **Testar Campanha**, digite o seu e-mail e clique em **Enviar Teste**. Se você ainda não é contato, crie-se antes em **Contatos** → **Criar Contato**.
3. Confira o e-mail. O teste sai na hora, sem esperar o atraso, e não consome envios. Se o seu contato não tem o campo _Produto do carrinho_, aparece o fallback `alguns produtos`.
4. Clique em **Salvar** → **Salvar e Ativar** e confirme em **Ativar Disparo por API**. A campanha passa ao status **Ativo** e começa a aceitar chamadas.

<Shot src="/img/carrinho-abandonado/6-pt-br.png" alt="Janela de confirmação Ativar Disparo por API" url="dash.bip.marketing/…/campaigns/…" />

### 7. Ligue a loja à BIP

1. Na campanha, abra **Integração via API**. Os comandos já vêm com o ID da campanha, que também está no fim do endereço da página.
2. Sempre que o carrinho de um cliente identificado mudar (produto adicionado, removido, quantidade alterada), chame `/api/campaigns/trigger` com o `lead` como objeto: `name`, `email` e os campos do carrinho. A resposta traz `"mode": "delay"`.
3. Quando o pedido for concluído, ou o carrinho esvaziado, chame `/api/campaigns/cancel` com o mesmo e-mail. A resposta traz `"cancelled": true` quando havia um lembrete esperando.
4. Contato novo precisa de `name` com pelo menos 2 caracteres e de e-mail ou telefone. Telefone sempre com `+` e código do país: `+5541998765432`.

Os comandos prontos estão em [Pronto para copiar](#pronto-para-copiar).

<Shot src="/img/carrinho-abandonado/7-pt-br.png" alt="Painel Integração via API com os comandos de disparo e de cancelamento" url="dash.bip.marketing/…/campaigns/…" />

## Pronto para copiar

### Campanha

| Opção                           | Valor                                                                   |
| ------------------------------- | ----------------------------------------------------------------------- |
| **Nome da Campanha**            | 🛒 Carrinho abandonado — e-mail                                         |
| **Tipo de Agendamento**         | **Disparo por API**                                                     |
| **Modo de Disparo**             | **Atraso**                                                              |
| **Atraso (Segundos)**           | `3600`                                                                  |
| **Janela de Reentrada do Lead** | **Permitir Reentrada do Lead** ligado, **Período de Espera (Dias)** `1` |
| **Canal**                       | **Email**                                                               |
| **Modelo de E-mail**            | Carrinho abandonado · Loja Horizonte                                    |

Atrasos comuns em **Atraso (Segundos)**:

| Espera     | Segundos |
| ---------- | -------- |
| 30 minutos | `1800`   |
| 1 hora     | `3600`   |
| 2 horas    | `7200`   |
| 4 horas    | `14400`  |
| 24 horas   | `86400`  |

### Campos

| **Nome do Campo**   | **Tipo de Campo** | Exemplo de valor      | Onde aparece                  |
| ------------------- | ----------------- | --------------------- | ----------------------------- |
| Produto do carrinho | **String**        | Camisa de Linho Areia | Texto do e-mail e do WhatsApp |
| Código do carrinho  | **String**        | LH8F3K2               | Botão do WhatsApp             |

Com mais de um produto, mande um resumo: _Camisa de Linho Areia e mais 2 itens_.

### E-mail

Onde aparece `[@primeiro nome]`, digite `@first` e escolha `lead.firstName()`. Onde aparece `[@Produto do carrinho]`, digite `@Produto` e escolha o campo. Preencha cada **Valor de Fallback** conforme a tabela do fim desta seção.

<Copy label="Assunto">
[@primeiro nome], seu carrinho está esperando
</Copy>

<Copy label="Pré-visualização">
Guardamos tudo na Loja Horizonte. Finalize quando quiser.
</Copy>

| Ordem | Bloco                       | Ajuste sugerido                                                              |
| ----- | --------------------------- | ---------------------------------------------------------------------------- |
| 1     | **Adicionar Imagem**        | Logo da Loja Horizonte, **Largura Máxima (px)** 160, **URL do Link** da loja |
| 2     | **Adicionar Cabeçalho**     | Saudação com o primeiro nome                                                 |
| 3     | **Adicionar Texto**         | O produto que ficou no carrinho                                              |
| 4     | **Adicionar Botão**         | Uma ação só, com **Largura** de 50                                           |
| 5     | **Adicionar Divisor**       | **Largura Máxima (px)** 120, cor clara                                       |
| 6     | **Adicionar Texto**         | Ajuda com tamanho, frete e troca                                             |
| 7     | **Adicionar Redes Sociais** | Só as redes que a loja usa                                                   |

<Copy label="Cabeçalho">
[@primeiro nome], você esqueceu algo aqui
</Copy>

<Copy label="Texto">
Você deixou [@Produto do carrinho] no carrinho da Loja Horizonte. Guardamos tudo para você: é só voltar e finalizar a compra.

Os produtos do carrinho não ficam reservados. Se gostou, garanta o seu antes que o estoque acabe.
</Copy>

<Copy label="Botão — Nome">
Voltar ao carrinho
</Copy>

<Copy label="Botão — URL do Link" code>
https://lojahorizonte.com.br/carrinho?origem=bip-carrinho
</Copy>

<Copy label="Texto final">
Ficou com dúvida sobre tamanho, frete ou troca? Veja as respostas em lojahorizonte.com.br/ajuda.
</Copy>

| Variável                            | Onde        | **Valor de Fallback** |
| ----------------------------------- | ----------- | --------------------- |
| `lead.firstName()`                  | **Assunto** | Oi                    |
| `lead.firstName()`                  | Cabeçalho   | Ei                    |
| `"Produto do carrinho" field value` | Texto       | alguns produtos       |

A loja sempre manda o nome de quem cria um contato, então o fallback do nome raramente aparece.

### WhatsApp

Para a versão por WhatsApp, crie o template na aba **Templates** da tela **WhatsApp**, com **Categoria** **Marketing** e **Idioma** **Portuguese (BR)**.

<WaTemplate name="horizonte_carrinho_lembrete" category="MARKETING" header="Seu carrinho está esperando" footer="Loja Horizonte · lojahorizonte.com.br" buttons="Ver meu carrinho|Tenho uma dúvida">
Oi, {{1}}! Você deixou {{2}} no carrinho da Loja Horizonte. Guardamos tudo para você finalizar quando quiser. Toque no botão para voltar direto ao seu carrinho.
</WaTemplate>

- Botão 1, **URL**: `https://lojahorizonte.com.br/carrinho/{{1}}`, com o exemplo `LH8F3K2`.
- Botão 2, **Resposta rápida**: quem toca entra em **Taxa de resposta**, e a conversa continua no app WhatsApp Business.
- **Amostras de variáveis** do corpo: `{{1}}` Marina, `{{2}}` Camisa de Linho Areia.

| Variável na campanha | Campo do contato                      | Valor de exemplo      |
| -------------------- | ------------------------------------- | --------------------- |
| **Corpo · {{1}}**    | **first name**                        | Marina                |
| **Corpo · {{2}}**    | **"Produto do carrinho" field value** | Camisa de Linho Areia |
| **Botão 1 · {{1}}**  | **"Código do carrinho" field value**  | LH8F3K2               |

Para criar o template por **Importar do JSON**:

<Copy label="horizonte_carrinho_lembrete.json" code>
[
  {
    "name": "horizonte_carrinho_lembrete",
    "category": "MARKETING",
    "language": "pt_BR",
    "components": [
      { "type": "HEADER", "format": "TEXT", "text": "Seu carrinho está esperando" },
      { "type": "BODY", "text": "Oi, {{1}}! Você deixou {{2}} no carrinho da Loja Horizonte. Guardamos tudo para você finalizar quando quiser. Toque no botão para voltar direto ao seu carrinho.", "example": { "body_text": [["Marina", "Camisa de Linho Areia"]] } },
      { "type": "FOOTER", "text": "Loja Horizonte · lojahorizonte.com.br" },
      { "type": "BUTTONS", "buttons": [
        { "type": "URL", "text": "Ver meu carrinho", "url": "https://lojahorizonte.com.br/carrinho/{{1}}", "example": ["https://lojahorizonte.com.br/carrinho/LH8F3K2"] },
        { "type": "QUICK_REPLY", "text": "Tenho uma dúvida" }
      ] }
    ]
  }
]
</Copy>

### API

Troque `SUA_CHAVE_DE_API` pela sua chave e `ID_DA_CAMPANHA` pelo ID do painel **Integração via API**.

<Copy label="Carrinho mudou: agenda ou reinicia o lembrete" code>
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: SUA_CHAVE_DE_API" \
  -d '{
    "campaignId": "ID_DA_CAMPANHA",
    "lead": {
      "name": "Marina Alves",
      "email": "marina.alves@exemplo.com",
      "phone": "+5541998765432",
      "fields": [
        { "key": "Produto do carrinho", "value": "Camisa de Linho Areia" },
        { "key": "Código do carrinho", "value": "LH8F3K2" }
      ]
    }
  }'
</Copy>

<Copy label="Pedido concluído: cancela o lembrete" code>
curl -X POST https://api.bip.marketing/api/campaigns/cancel \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: SUA_CHAVE_DE_API" \
  -d '{"campaignId": "ID_DA_CAMPANHA", "lead": "marina.alves@exemplo.com"}'
</Copy>

<Copy label="Resposta do disparo" code>
{"campaignId": "ID_DA_CAMPANHA", "leadId": "ID_DO_CONTATO", "mode": "delay"}
</Copy>

<Copy label="Resposta do cancelamento" code>
{"campaignId": "ID_DA_CAMPANHA", "cancelled": true, "leadId": "ID_DO_CONTATO"}
</Copy>

`"cancelled": false` quer dizer que não havia lembrete esperando: o atraso já tinha terminado ou nada foi disparado. Não é erro.

<Copy label="TypeScript" code>
// No servidor da Loja Horizonte
const API_KEY = process.env.BIP_API_KEY ?? 'SUA_CHAVE_DE_API';
const CAMPANHA_CARRINHO = 'ID_DA_CAMPANHA';

type Carrinho = {
  codigo: string;
  cliente: { nome: string; email: string; telefone?: string }; // telefone com + e código do país
  itens: { nome: string }[];
};

async function bip(path: string, body: unknown) {
  const res = await fetch(`https://api.bip.marketing${path}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', 'x-bip-api-key': API_KEY },
    body: JSON.stringify(body)
  });
  const texto = await res.text();
  if (res.ok) return JSON.parse(texto);
  // Cancelamento de quem nunca entrou na BIP: não havia nada para cancelar
  if (path.endsWith('/cancel') && res.status === 404 && texto.includes('Lead not found')) {
    return { cancelled: false };
  }
  throw new Error(`BIP ${res.status}: ${texto}`);
}

const resumo = (itens: { nome: string }[]) =>
  itens.length > 1
    ? `${itens[0].nome} e mais ${itens.length - 1} ${itens.length === 2 ? 'item' : 'itens'}`
    : itens[0].nome;

// Produto adicionado, removido ou quantidade alterada: agenda ou reinicia o lembrete
export const carrinhoMudou = (c: Carrinho) =>
  bip('/api/campaigns/trigger', {
    campaignId: CAMPANHA_CARRINHO,
    lead: {
      name: c.cliente.nome,
      email: c.cliente.email,
      ...(c.cliente.telefone ? { phone: c.cliente.telefone } : {}),
      fields: [
        { key: 'Produto do carrinho', value: resumo(c.itens) },
        { key: 'Código do carrinho', value: c.codigo }
      ]
    }
  }); // { campaignId, leadId, mode: 'delay' }

// Pedido concluído ou carrinho esvaziado: cancela o lembrete pendente
export const carrinhoFechado = (email: string) =>
  bip('/api/campaigns/cancel', { campaignId: CAMPANHA_CARRINHO, lead: email }); // { cancelled: true | false }
</Copy>

## Como medir

Em **Campanhas**, abra **Estatísticas da Campanha** (pelo ícone de gráfico na lista ou no topo da campanha).

- **Processado (_N_ execuções)**: lembretes que a BIP processou depois do atraso. Os disparos cancelados não aparecem: eles nunca chegaram a ser processados.
- **Entregue**, **Taxa de Abertura** e **Taxa de Cliques**: quantos lembretes chegaram, foram abertos e levaram a um clique.
- **Links mais clicados**: o link do botão, com o parâmetro `origem=bip-carrinho`, mostra quantos cliques voltaram ao carrinho.
- **Interações do Destinatário**: filtre por **Clicado** para ver quem voltou ao carrinho. Filtre por **Rejeitado** para ver quem a janela segurou, com o motivo **O lead está dentro da janela de reentrada**.
- Na versão por WhatsApp: **Entregue**, **Taxa de leitura** e **Taxa de resposta** (inclui os toques em _Tenho uma dúvida_).

No seu sistema, duas leituras completam o quadro:

- A resposta do cancelamento em cada pedido. `"cancelled": true` quer dizer que a pessoa comprou antes da hora do lembrete, e nada saiu. Num carrinho que a loja disparou, `"cancelled": false` quer dizer que o atraso já tinha terminado: a compra veio depois da hora do lembrete. Cruze com **Interações do Destinatário** para ver se ela recebeu e clicou.
- O parâmetro `origem=bip-carrinho` no endereço das visitas, para ligar os pedidos ao lembrete nos relatórios da loja.

No BIP Lite, o card **Uso** mostra quanto do saldo do mês os lembretes já usaram.

## Variações

### E-mail ou WhatsApp

- **Só WhatsApp** (planos pagos): siga os mesmos passos, mas no passo 4 escolha **WhatsApp** em **Canal**, o template `horizonte_carrinho_lembrete` e o mapeamento de variáveis de [Pronto para copiar](#pronto-para-copiar). A loja precisa mandar o `phone` do cliente, com `+` e código do país.
- **Os dois canais**: cada campanha usa um canal só. Crie uma campanha de e-mail e outra de WhatsApp, com atrasos diferentes, como `3600` no e-mail e `86400` no WhatsApp. A loja chama trigger e cancel nas duas, com os dois IDs. Cada lembrete que sai conta como um envio.

### Contato que já está na BIP

Se o cliente já é contato e você não usa os campos do carrinho, mande `lead` como texto, com o e-mail ou o telefone. Nesse caso, a chave precisa só de **Disparo de Campanhas**.

## Perguntas frequentes

### Quem compra antes da hora recebe o lembrete?

Não. Quando o pedido fecha, a loja chama `/api/campaigns/cancel` e o lembrete pendente é descartado. Ele não sai e não conta como envio.

### E se a pessoa voltar e mexer no carrinho?

Cada nova chamada para a mesma pessoa reinicia a contagem. Com `3600` segundos, o lembrete sai uma hora depois da última mudança, uma vez só. E ele mostra o produto mais recente, porque a BIP monta a mensagem na hora do envio.

### Preciso montar um segmento?

Não. Campanhas de **Disparo por API** não usam segmentos: cada chamada da loja diz quem recebe. Se a pessoa ainda não é contato, a mesma chamada cria o contato.

### Quanto isso consome do meu plano?

No BIP Lite, cada lembrete processado usa um envio do mês. Lembretes cancelados e lembretes barrados pela **Janela de Reentrada do Lead** não contam. O plano gratuito tem 1.000 envios por mês, por e-mail.

## Veja também

- [Boas-vindas em uma chamada: do cadastro ao primeiro e-mail](/pt-br/boas-vindas-em-uma-chamada)
- [API da BIP: chaves, contatos, eventos e disparos](/pt-br/api)
- [Campanhas: única, recorrente e por API](/pt-br/campanhas)
- [Editor de e-mail: blocos, variáveis e preview](/pt-br/editor-de-email)
- [Templates de WhatsApp: criar, sincronizar e usar](/pt-br/templates-whatsapp)
- [Planos e limites: envios, capacidade e preços](/pt-br/planos-e-limites)
- [Recuperação de carrinho abandonado no site da BIP](https://bip.marketing/pt-br/use-cases/abandoned-cart)
- [BIP para e-commerce](https://bip.marketing/pt-br/solutions/ecommerce)
