Pasar al contenido principal
osky
Importa tu base B2B a SendPulse CRM y dispárala desde tu bot de WhatsApp
Tema SendPulse CRM + WhatsApp Bot

Importa tu base B2B a SendPulse CRM y dispárala desde tu bot de WhatsApp

SendPulse acaba de liberar la importación masiva de empresas directamente en la sección Contactos → Empresas de su CRM. Para quien maneja bases B2B de cientos o miles de clientes potenciales, esto cambia el flujo por completo: ya no tienes que capturar empresa por empresa a mano ni depender de integraciones complejas solo para meter datos. Lo importas, lo limpias y lo conectas a tu bot de WhatsApp en una sola tarde. Este tutorial te lleva de la mano por todo ese proceso, con código real y sin rodeos.

Flujo de datos desde CSV hasta bot de WhatsApp


Requisitos previos

Antes de tocar cualquier botón, confirma que tienes esto:

  • Cuenta SendPulse activa con acceso al módulo CRM (plan Standard o superior).
  • Bot de WhatsApp configurado en SendPulse o conectado vía API (número verificado en Meta Business).
  • Tu base de datos B2B exportada en CSV o XLSX desde tu plataforma anterior (HubSpot, Zoho, Salesforce, lo que sea).
  • Acceso a la API de SendPulse — necesitas client_id y client_secret desde tu panel en Configuración → API.
  • Node.js 20+ o Python 3.11+ si vas a automatizar el disparo de mensajes post-importación.

Paso 1: Prepara tu CSV para la importación

SendPulse espera columnas específicas. Un CSV mal formado te va a tirar errores silenciosos donde importa 0 registros y no te dice por qué. Usa este esquema mínimo:

company_name,phone,email,website,industry,city,country,notes
Empresa Ejemplo SA,+525512345678,contacto@!zilch!ejemplo.com,ejemplo.com,Telecomunicaciones,CDMX,Mexico,Cliente potencial Q3
Distribuidora Norte,+528112345678,ventas@!zilch!distnorte.mx,distnorte.mx,Distribución,Monterrey,Mexico,Contactado por feria

Reglas que sí importan en producción:

  • El campo phone debe incluir código de país con +. Sin él, el bot no puede matchear el contacto.
  • company_name es obligatorio. Sin nombre, el registro se descarta sin aviso.
  • Encoding: UTF-8 sin BOM. Si exportas desde Excel en Windows, guarda explícitamente como "CSV UTF-8" o vas a ver caracteres rotos en nombres con acentos.
  • Máximo recomendado por lote: 5,000 registros. Lotes más grandes funcionan, pero si falla a mitad no sabes dónde quedó el cursor.

Paso 2: Ejecuta la importación en el panel

  1. Entra a Contactos → Empresas en tu dashboard de SendPulse.
  2. Haz clic en el botón Importar (esquina superior derecha).
  3. Sube tu archivo CSV o XLSX.
  4. En el paso de mapeo de columnas, asegúrate de que phone mapee a "Teléfono" y no a un campo personalizado — eso es lo que usará el bot para identificar al contacto.
  5. Selecciona si quieres actualizar registros existentes o solo agregar nuevos. Para una migración inicial, activa "actualizar si ya existe" para evitar duplicados.
  6. Confirma y espera. Para 1,000 registros el proceso tarda menos de 2 minutos.

Paso 3: Obtén el token de API y valida tu acceso

curl -X POST https://api.sendpulse.com/oauth/access_token \
  -H "Content-Type: application/json" \
  -d '{
    "grant_type": "client_credentials",
    "client_id": "TU_CLIENT_ID",
    "client_secret": "TU_CLIENT_SECRET"
  }'

Guarda el access_token que regresa. Expira en 3,600 segundos — en producción implementa refresh automático, no lo hardcodees.


Paso 4: Consulta las empresas importadas vía API

Antes de disparar mensajes, verifica que la importación quedó limpia:

// Node.js 20+
const fetch = (await import('node-fetch')).default;

const TOKEN = process.env.SENDPULSE_TOKEN;

async function getCompanies(page = 1, limit = 100) {
  const res = await fetch(
    `https://api.sendpulse.com/crm/v1/companies?page=${page}&limit=${limit}`,
    {
      headers: {
        Authorization: `Bearer ${TOKEN}`,
        'Content-Type': 'application/json',
      },
    }
  );
  const data = await res.json();
  return data;
}

const companies = await getCompanies();
console.log(`Total empresas: ${companies.total}`);
console.log('Primera empresa:', companies.data[0]);

Si total coincide con tu CSV, vas bien. Si hay diferencia, revisa el log de importación en el panel — SendPulse guarda un reporte de filas rechazadas.


Paso 5: Conecta empresas con tu bot de WhatsApp

Aquí está el chiste del asunto. Cada empresa tiene un campo phone. Cuando ese número te escribe por WhatsApp, SendPulse lo puede matchear automáticamente si tienes activado "Vincular contacto de bot con CRM" en la configuración del bot. Pero si quieres disparar tú el primer mensaje (outbound), necesitas usar el endpoint de envío masivo:

# Python 3.11+
import os, requests

TOKEN = os.getenv("SENDPULSE_TOKEN")
BOT_ID = os.getenv("SENDPULSE_BOT_ID")  # Lo encuentras en Bots → Tu bot → Configuración

def send_whatsapp_template(phone: str, template_id: str, variables: dict):
    payload = {
        "bot_id": BOT_ID,
        "phone": phone,
        "template_id": template_id,
        "variables": variables
    }
    r = requests.post(
        "https://api.sendpulse.com/whatsapp/contacts/sendByPhone",
        headers={"Authorization": f"Bearer {TOKEN}"},
        json=payload
    )
    return r.json()

# Ejemplo: disparar a todas las empresas importadas
companies = get_companies_python()  # Tu función de consulta
for company in companies["data"]:
    phone = company.get("phone")
    if phone:
        result = send_whatsapp_template(
            phone=phone,
            template_id="TU_TEMPLATE_ID",  # Template aprobado en Meta
            variables={"1": company["name"], "2": "mayo 2026"}
        )
        print(f"{phone}: {result.get('result')}")

Advertencia crítica: solo puedes enviar mensajes outbound usando templates aprobados por Meta. Si mandas texto libre a un número que no te ha escrito en las últimas 24 horas, el mensaje no llega y acumulas penalizaciones en tu número. Nada de atajos aquí.


Paso 6: Automatiza con un flujo de bot post-importación

Dentro del editor de flujos de SendPulse, crea un flujo que se dispare cuando una empresa reciba una etiqueta específica (por ejemplo, importado_mayo_2026). Así el seguimiento es automático:

  1. Trigger: Etiqueta asignada = importado_mayo_2026
  2. Acción 1: Enviar template de bienvenida B2B
  3. Espera: 2 días
  4. Condición: ¿Respondió? → Sí: mover a pipeline "Prospecto activo" / No: enviar segundo template de seguimiento
  5. Acción final: Asignar a ejecutivo de cuenta vía CRM

Para asignar la etiqueta masivamente via API después de la importación:

curl -X POST https://api.sendpulse.com/crm/v1/companies/bulk-tag \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tag": "importado_mayo_2026", "company_ids": [101, 102, 103]}'

Advertencias de producción que nadie te cuenta

  • Rate limits: la API de SendPulse permite ~10 requests/segundo. Si tienes 5,000 empresas y mandas una por una sin delay, vas a recibir 429s a partir del registro 300 aproximadamente. Implementa un sleep de 150ms entre llamadas.
  • Números inválidos: cualquier teléfono sin código de país o con formato local (ej. 5512345678 sin el +52) va a fallar silenciosamente en el envío. Valida con una librería como libphonenumber antes de importar.
  • Duplicados por teléfono: SendPulse no deduplica por teléfono en empresas, solo por email. Puedes terminar con dos empresas distintas con el mismo número. Filtra tu CSV antes.
  • Templates en revisión: Meta puede tardar hasta 24 horas en aprobar un template nuevo. No dejes esto para el día del lanzamiento.

Resultado esperado

Al terminar este flujo tienes: tu base B2B completa en el CRM de SendPulse, cada empresa vinculable a conversaciones de WhatsApp, y un bot que hace el primer contacto y el seguimiento sin que tu equipo toque un teclado. Eso es automatización B2B real, no el cuento de hadas que venden en los webinars.