# Recupera carritos abandonados por email o WhatsApp

> Crea una campaña de Disparo por API con Retraso y activa el reingreso con 1 día de espera. Tu tienda llama a /api/campaigns/trigger en cada cambio del carrito y a /api/campaigns/cancel cuando se cierra el pedido. Cada llamada reinicia la cuenta, y el recordatorio cancelado no sale ni cuenta como envío.

Fonte: https://wiki.bip.marketing/es-es/carrito-abandonado · Atualizado: 2026-10-08

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

Quien deja el carrito recibe un recordatorio con su nombre y el producto que quedó pendiente, a la hora que elijas. Quien compra antes no recibe nada.

<Checklist items="Una cuenta en la BIP (el plan gratuito envía por email)|Acceso al servidor de tu tienda, donde ocurren el carrito y el pedido|El nombre y el email del cliente en cuanto se identifica en el carrito (el teléfono, para WhatsApp)|Una clave de API con Disparo de Campañas y Escritura de leads|Para WhatsApp: plan de pago, número conectado y una plantilla aprobada" />

## Lo que vas a lograr

- Un recordatorio para quien dejó el carrito, con su nombre de pila y el producto que quedó pendiente.
- Ningún mensaje para quien todavía está comprando: cada cambio en el carrito reinicia la cuenta.
- Ningún recordatorio para quien ya compró: el pedido cancela el envío, y el envío cancelado no cuenta en tu saldo.
- Como máximo un recordatorio cada 24 horas por persona, por cada carrito que abandone.
- Contactos nuevos creados en la misma llamada, sin duplicar a nadie que ya esté en la BIP.

## Cómo funciona

<Steps items="Tu tienda llama a la BIP cada vez que cambia el carrito|La BIP espera el retraso y reinicia la cuenta si la persona vuelve|Si compró, la tienda cancela; si no compró, sale el recordatorio" />

La campaña usa el **Disparo por API** en modo **Retraso**. En la práctica:

- Tu tienda llama a `/api/campaigns/trigger` en cada cambio del carrito de un cliente identificado. La BIP programa el recordatorio para dentro de una hora (o el tiempo que definas).
- Una nueva llamada para la misma persona reinicia la cuenta. Cada persona tiene como máximo un recordatorio en espera en esta campaña.
- Cuando se cierra el pedido o se vacía el carrito, la tienda llama a `/api/campaigns/cancel`. El recordatorio pendiente se descarta: no sale y no cuenta como envío.
- Si llega la hora sin compra, la BIP revisa la **Ventana de Reingreso del Lead** y arma el email con los datos más recientes del contacto. Si la persona cambió de producto, el recordatorio muestra el carrito actualizado.

## Paso a paso

### 1. Crea los campos del carrito

El recordatorio convence más cuando menciona el producto. Para eso, la tienda guarda el producto en un campo del contacto en cada llamada.

1. En **Ajustes** → **General**, ve a **Campos** y haz clic en **Añadir campo**.
2. En **Tipo de campo**, elige **Cadena**. En **Nombre del campo**, escribe _Produto do carrinho_ (“producto del carrito”) y haz clic en **Guardar**.
3. Para la versión por WhatsApp, crea también el campo _Código do carrinho_ (“código del carrito”), de tipo **Cadena**. Lleva a la persona directo a su carrito.

<Shot src="/img/carrinho-abandonado/1-es-es.png" alt="Campos personalizados Produto do carrinho y Código do carrinho en Ajustes, pestaña General" url="dash.bip.marketing/…/settings" />

### 2. Crea la clave de API

1. En **Ajustes**, abre la pestaña **Claves de API** y haz clic en **Añadir nueva clave de API**.
2. En **Nombre**, escribe _Loja Horizonte — carrito_.
3. En **Alcances**, activa **Disparo de Campañas** y **Escritura de leads**. El segundo permite que la tienda envíe el contacto como objeto: la BIP crea o actualiza el contacto y programa el recordatorio en la misma llamada.
4. Haz clic en **Guardar** y copia la **Clave de API**. Guarda la clave en el servidor de la tienda, en una variable de entorno, y nunca en el código del sitio.

<Shot src="/img/carrinho-abandonado/2-es-es.png" alt="Nueva clave de API con los alcances Disparo de Campañas y Escritura de leads activados" url="dash.bip.marketing/…/settings?tab=api-keys" />

### 3. Arma el email del recordatorio

1. En **Plantillas de email**, haz clic en **Nueva plantilla**.
2. Haz clic en **Ajustes** y completa **Nombre**, **Idioma** (**Español**), **Asunto** y **Vista previa**. Los textos están en [Listo para copiar](#listo-para-copiar).
3. Arma los bloques: logo, encabezado, texto, botón al carrito y redes sociales.
4. En el texto, escribe `@Produto` y elige _"Produto do carrinho" field value_. Haz clic en la variable y completa el **Valor de respaldo** con `algunos productos`.
5. En el bloque de botón, completa **URL del enlace** con la página del carrito de tu tienda.
6. Haz clic en **Guardar**.

<Shot src="/img/carrinho-abandonado/3-es-es.png" alt="Editor de email con el recordatorio del carrito y la variable del producto en el texto" url="dash.bip.marketing/…/emails-templates/…" />

### 4. Crea la campaña con retraso

1. En **Campañas**, haz clic en **Nueva campaña**.
2. En **Nombre de la campaña**, escribe _Carrito abandonado — email_ y elige el emoji 🛒.
3. En **Tipo de Programación**, elige **Disparo por API**.
4. En **Modo de Disparo**, elige **Retraso**. En **Retraso (Segundos)**, escribe `3600` (una hora).
5. En **Canal**, elige **Email** y, en **Plantilla de email**, vincula la plantilla del paso 3.

Las campañas por API no tienen sección de segmentos: cada llamada de la tienda indica quién recibe el mensaje.

<Shot src="/img/carrinho-abandonado/4-es-es.png" alt="Campaña con Disparo por API, modo Retraso y 3600 segundos" url="dash.bip.marketing/…/campaigns/…" />

### 5. Activa el reingreso

Quien abandona un carrito hoy puede abandonar otro el mes que viene. Con la **Ventana de Reingreso del Lead** desactivada (el valor predeterminado), cada contacto recibe la campaña una sola vez, para siempre: el segundo carrito de Marina no tendría recordatorio.

1. En **Ventana de Reingreso del Lead**, activa **Permitir Reingreso del Lead**.
2. En **Período de Espera (Días)**, escribe `1`.

Con 1 día, cada persona recibe como máximo un recordatorio cada 24 horas, aunque abandone varios carritos el mismo día. La BIP revisa la ventana cuando termina el retraso. Un recordatorio frenado por la ventana aparece con el estado **Rechazada** en las estadísticas y no cuenta como envío. No lo dejes en `0`: sin período de espera, la misma persona puede recibir varios recordatorios el mismo día.

<Shot src="/img/carrinho-abandonado/5-es-es.png" alt="Ventana de Reingreso del Lead con Permitir Reingreso del Lead activado y 1 día de espera" url="dash.bip.marketing/…/campaigns/…" />

### 6. Prueba y activa

1. Haz clic en **Guardar** → **Guardar borrador**.
2. Haz clic en **Probar campaña**, escribe tu email y haz clic en **Enviar prueba**. Si todavía no eres contacto, créate antes en **Leads** → **Crear lead**.
3. Revisa el email. La prueba sale al instante, sin esperar el retraso, y no consume envíos. Si tu contacto no tiene el campo _Produto do carrinho_, aparece el respaldo `algunos productos`.
4. Haz clic en **Guardar** → **Guardar y Activar** y confirma en **Activar Disparo por API**. La campaña pasa al estado **Activo** y empieza a aceptar llamadas.

<Shot src="/img/carrinho-abandonado/6-es-es.png" alt="Ventana de confirmación Activar Disparo por API" url="dash.bip.marketing/…/campaigns/…" />

### 7. Conecta la tienda a la BIP

1. En la campaña, abre **Integración vía API**. Los comandos ya traen el ID de la campaña, que también está al final de la dirección de la página.
2. Cada vez que cambie el carrito de un cliente identificado (producto agregado, producto eliminado, cantidad modificada), llama a `/api/campaigns/trigger` con el `lead` como objeto: `name`, `email` y los campos del carrito. La respuesta trae `"mode": "delay"`.
3. Cuando se complete el pedido, o se vacíe el carrito, llama a `/api/campaigns/cancel` con el mismo email. La respuesta trae `"cancelled": true` cuando había un recordatorio en espera.
4. Un contacto nuevo necesita un `name` con al menos 2 caracteres y un email o un teléfono. El teléfono, siempre con `+` y código de país: `+5541998765432`.

Los comandos listos están en [Listo para copiar](#listo-para-copiar).

<Shot src="/img/carrinho-abandonado/7-es-es.png" alt="Panel Integración vía API con los comandos de disparo y de cancelación" url="dash.bip.marketing/…/campaigns/…" />

## Listo para copiar

### Campaña

| Opción | Valor |
| --- | --- |
| **Nombre de la campaña** | 🛒 Carrito abandonado — email |
| **Tipo de Programación** | **Disparo por API** |
| **Modo de Disparo** | **Retraso** |
| **Retraso (Segundos)** | `3600` |
| **Ventana de Reingreso del Lead** | **Permitir Reingreso del Lead** activado, **Período de Espera (Días)** `1` |
| **Canal** | **Email** |
| **Plantilla de email** | Carrito abandonado · Loja Horizonte |

Retrasos comunes en **Retraso (Segundos)**:

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

### Campos

| **Nombre del campo** | **Tipo de campo** | Valor de ejemplo | Dónde aparece |
| --- | --- | --- | --- |
| Produto do carrinho | **Cadena** | Camisa de Linho Areia | Texto del email y de WhatsApp |
| Código do carrinho | **Cadena** | LH8F3K2 | Botón de WhatsApp |

Con más de un producto, envía un resumen: _Camisa de Linho Areia y 2 artículos más_.

### Email

Donde aparece `[@primer nombre]`, escribe `@first` y elige `lead.firstName()`. Donde aparece `[@Produto do carrinho]`, escribe `@Produto` y elige el campo. Completa cada **Valor de respaldo** según la tabla al final de esta sección.

<Copy label="Asunto">
[@primer nombre], tu carrito te está esperando
</Copy>

<Copy label="Vista previa">
Guardamos todo en Loja Horizonte. Finaliza tu compra cuando quieras.
</Copy>

| Orden | Bloque | Ajuste sugerido |
| --- | --- | --- |
| 1 | **Añadir imagen** | Logo de Loja Horizonte, **Ancho máximo (px)** 160, **URL del enlace** de la tienda |
| 2 | **Añadir encabezado** | Saludo con el nombre de pila |
| 3 | **Añadir texto** | El producto que quedó en el carrito |
| 4 | **Añadir botón** | Una sola acción, con **Ancho** de 50 |
| 5 | **Añadir divisor** | **Ancho máximo (px)** 120, color claro |
| 6 | **Añadir texto** | Ayuda con tallas, envíos y cambios |
| 7 | **Agregar Redes Sociales** | Solo las redes que usa la tienda |

<Copy label="Encabezado">
[@primer nombre], olvidaste algo aquí
</Copy>

<Copy label="Texto">
Dejaste [@Produto do carrinho] en tu carrito de Loja Horizonte. Guardamos todo para ti: solo tienes que volver y finalizar la compra.

Los productos del carrito no quedan reservados. Si te gustó, asegura el tuyo antes de que se agote.
</Copy>

<Copy label="Botón — Nombre">
Volver al carrito
</Copy>

<Copy label="Botón — URL del enlace" code>
https://lojahorizonte.com.br/carrinho?origem=bip-carrinho
</Copy>

<Copy label="Texto final">
¿Tienes dudas sobre tallas, envíos o cambios? Encuentra las respuestas en lojahorizonte.com.br/ajuda.
</Copy>

| Variable | Dónde | **Valor de respaldo** |
| --- | --- | --- |
| `lead.firstName()` | **Asunto** | Hola |
| `lead.firstName()` | Encabezado | Oye |
| `"Produto do carrinho" field value` | Texto | algunos productos |

La tienda siempre envía el nombre al crear un contacto, así que el respaldo del nombre casi nunca aparece.

### WhatsApp

Para la versión por WhatsApp, crea la plantilla en la pestaña **Plantillas** de la pantalla **WhatsApp**, con **Categoría** **Marketing** e **Idioma** **Spanish (LATAM)**.

<WaTemplate name="horizonte_carrinho_lembrete" category="MARKETING" header="Tu carrito te está esperando" footer="Loja Horizonte · lojahorizonte.com.br" buttons="Ver mi carrito|Tengo una duda">
¡Hola, {{1}}! Dejaste {{2}} en tu carrito de Loja Horizonte. Guardamos todo para que finalices la compra cuando quieras. Toca el botón para volver directo a tu carrito.
</WaTemplate>

- Botón 1, **URL**: `https://lojahorizonte.com.br/carrinho/{{1}}`, con el ejemplo `LH8F3K2`.
- Botón 2, **Respuesta rápida**: quien lo toca entra en la **Tasa de respuesta**, y la conversación sigue en la app WhatsApp Business.
- **Muestras de variables** del cuerpo: `{{1}}` Marina, `{{2}}` Camisa de Linho Areia.

| Variable en la campaña | Campo del lead | Valor de ejemplo |
| --- | --- | --- |
| **Cuerpo · {{1}}** | **first name** | Marina |
| **Cuerpo · {{2}}** | **"Produto do carrinho" field value** | Camisa de Linho Areia |
| **Botón 1 · {{1}}** | **"Código do carrinho" field value** | LH8F3K2 |

Para crear la plantilla con **Importar desde JSON**:

<Copy label="horizonte_carrinho_lembrete.json" code>
[
  {
    "name": "horizonte_carrinho_lembrete",
    "category": "MARKETING",
    "language": "es",
    "components": [
      { "type": "HEADER", "format": "TEXT", "text": "Tu carrito te está esperando" },
      { "type": "BODY", "text": "¡Hola, {{1}}! Dejaste {{2}} en tu carrito de Loja Horizonte. Guardamos todo para que finalices la compra cuando quieras. Toca el botón para volver directo a tu carrito.", "example": { "body_text": [["Marina", "Camisa de Linho Areia"]] } },
      { "type": "FOOTER", "text": "Loja Horizonte · lojahorizonte.com.br" },
      { "type": "BUTTONS", "buttons": [
        { "type": "URL", "text": "Ver mi carrito", "url": "https://lojahorizonte.com.br/carrinho/{{1}}", "example": ["https://lojahorizonte.com.br/carrinho/LH8F3K2"] },
        { "type": "QUICK_REPLY", "text": "Tengo una duda" }
      ] }
    ]
  }
]
</Copy>

### API

Reemplaza `TU_CLAVE_DE_API` por tu clave e `ID_DE_LA_CAMPAÑA` por el ID del panel **Integración vía API**.

<Copy label="El carrito cambió: programa o reinicia el recordatorio" code>
curl -X POST https://api.bip.marketing/api/campaigns/trigger \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: TU_CLAVE_DE_API" \
  -d '{
    "campaignId": "ID_DE_LA_CAMPAÑA",
    "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 completado: cancela el recordatorio" code>
curl -X POST https://api.bip.marketing/api/campaigns/cancel \
  -H "Content-Type: application/json" \
  -H "x-bip-api-key: TU_CLAVE_DE_API" \
  -d '{"campaignId": "ID_DE_LA_CAMPAÑA", "lead": "marina.alves@exemplo.com"}'
</Copy>

<Copy label="Respuesta del disparo" code>
{"campaignId": "ID_DE_LA_CAMPAÑA", "leadId": "ID_DEL_CONTACTO", "mode": "delay"}
</Copy>

<Copy label="Respuesta de la cancelación" code>
{"campaignId": "ID_DE_LA_CAMPAÑA", "cancelled": true, "leadId": "ID_DEL_CONTACTO"}
</Copy>

`"cancelled": false` significa que no había ningún recordatorio en espera: el retraso ya había terminado o no se disparó nada. No es un error.

<Copy label="TypeScript" code>
// En el servidor de Loja Horizonte
const API_KEY = process.env.BIP_API_KEY ?? 'TU_CLAVE_DE_API';
const CAMPANHA_CARRINHO = 'ID_DE_LA_CAMPAÑA';

type Carrinho = {
  codigo: string;
  cliente: { nome: string; email: string; telefone?: string }; // teléfono con + y código de 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);
  // Cancelación de alguien que nunca entró en la BIP: no había nada que 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;

// Producto agregado, eliminado o cantidad modificada: programa o reinicia el recordatorio
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 completado o carrito vaciado: cancela el recordatorio pendiente
export const carrinhoFechado = (email: string) =>
  bip('/api/campaigns/cancel', { campaignId: CAMPANHA_CARRINHO, lead: email }); // { cancelled: true | false }
</Copy>

## Cómo medir

En **Campañas**, abre **Estadísticas de la campaña** (con el ícono de gráfico en la lista o en la parte superior de la campaña).

- **Procesado (_N_ ejecuciones)**: recordatorios que la BIP procesó después del retraso. Los disparos cancelados no aparecen: nunca llegaron a procesarse.
- **Entregado**, **Tasa de apertura** y **Tasa de clics**: cuántos recordatorios llegaron, se abrieron y generaron un clic.
- **Enlaces más clicados**: el enlace del botón, con el parámetro `origem=bip-carrinho`, muestra cuántos clics volvieron al carrito.
- **Interacciones del destinatario**: filtra por **Clicado** para ver quién volvió al carrito. Filtra por **Rechazada** para ver a quién frenó la ventana, con el motivo **El lead está dentro de la ventana de reingreso**.
- En la versión por WhatsApp: **Entregado**, **Tasa de lectura** y **Tasa de respuesta** (incluye los toques en _Tengo una duda_).

En tu sistema, dos lecturas completan el panorama:

- La respuesta de la cancelación en cada pedido. `"cancelled": true` significa que la persona compró antes de la hora del recordatorio, y no salió nada. En un carrito que la tienda disparó, `"cancelled": false` significa que el retraso ya había terminado: la compra llegó después de la hora del recordatorio. Crúzalo con **Interacciones del destinatario** para ver si lo recibió e hizo clic.
- El parámetro `origem=bip-carrinho` en la dirección de las visitas, para vincular los pedidos al recordatorio en los informes de la tienda.

En BIP Lite, la tarjeta **Uso** muestra cuánto del saldo del mes ya usaron los recordatorios.

## Variaciones

### Email o WhatsApp

- **Solo WhatsApp** (planes de pago): sigue los mismos pasos, pero en el paso 4 elige **WhatsApp** en **Canal**, la plantilla `horizonte_carrinho_lembrete` y la asignación de variables de [Listo para copiar](#listo-para-copiar). La tienda debe enviar el `phone` del cliente, con `+` y código de país.
- **Los dos canales**: cada campaña usa un solo canal. Crea una campaña de email y otra de WhatsApp, con retrasos distintos, como `3600` en el email y `86400` en WhatsApp. La tienda llama a trigger y cancel en las dos, con los dos IDs. Cada recordatorio que sale cuenta como un envío.

### Contacto que ya está en la BIP

Si el cliente ya es contacto y no usas los campos del carrito, envía `lead` como texto, con el email o el teléfono. En ese caso, la clave solo necesita **Disparo de Campañas**.

## Preguntas frecuentes

### ¿Quien compra antes de la hora recibe el recordatorio?

No. Cuando se cierra el pedido, la tienda llama a `/api/campaigns/cancel` y el recordatorio pendiente se descarta. No sale y no cuenta como envío.

### ¿Y si la persona vuelve y cambia el carrito?

Cada nueva llamada para la misma persona reinicia la cuenta. Con `3600` segundos, el recordatorio sale una hora después del último cambio, una sola vez. Y muestra el producto más reciente, porque la BIP arma el mensaje en el momento del envío.

### ¿Necesito crear un segmento?

No. Las campañas de **Disparo por API** no usan segmentos: cada llamada de la tienda indica quién recibe el mensaje. Si la persona todavía no es contacto, la misma llamada crea el contacto.

### ¿Cuánto consume esto de mi plan?

En BIP Lite, cada recordatorio procesado usa un envío del mes. Los recordatorios cancelados y los frenados por la **Ventana de Reingreso del Lead** no cuentan. El plan gratuito incluye 1.000 envíos por mes, por email.

## Ver también

- [Bienvenida en una llamada: del registro al primer email](/es-es/bienvenida-en-una-llamada)
- [API de la BIP: claves, contactos, eventos y disparos](/es-es/api)
- [Campañas: únicas, recurrentes y por API](/es-es/campanas)
- [Editor de email: bloques, variables y vista previa](/es-es/editor-de-email)
- [Plantillas de WhatsApp: crear, sincronizar y usar](/es-es/plantillas-whatsapp)
- [Planes y límites: envíos, capacidad y precios](/es-es/planes-y-limites)
- [Recuperación de carritos abandonados en el sitio de la BIP](https://bip.marketing/es-es/use-cases/abandoned-cart)
- [La BIP para e-commerce](https://bip.marketing/es-es/solutions/ecommerce)
