Conector de HubSpot
Conector de HubSpot
Conecta tu CRM de HubSpot con Brevo a través de Tajo para sincronizar contactos de forma bidireccional, hacer seguimiento de negocios, compartir datos de interacción y automatizar el marketing de forma unificada entre ambas plataformas.
Resumen
| Propiedad | Valor |
|---|---|
| Plataforma | HubSpot |
| Categoría | CRM |
| Complejidad de configuración | Media |
| Integración oficial | Sí |
| Datos sincronizados | Contactos, Empresas, Negocios, Tickets, Eventos |
| URL base de la API | https://api.hubapi.com |
Funcionalidades
- Sincronización bidireccional de contactos - Mantén los contactos sincronizados entre HubSpot y Brevo en tiempo real
- Seguimiento del pipeline de ventas - Sincroniza etapas de negocios y valores para segmentar por ingresos
- Sincronización de datos de empresas - Asocia contactos con registros de empresas y datos firmográficos
- Integración de tickets - Haz seguimiento de tickets de soporte para evaluar la salud del cliente
- Seguimiento de interacciones - Sincroniza aperturas de email, clics, reuniones, llamadas y notas
- Soporte de objetos personalizados - Asocia objetos personalizados de HubSpot con atributos de Brevo
- Activadores de workflows - Usa los cambios de etapa del ciclo de vida en HubSpot para disparar automatizaciones en Brevo
- Eventos de webhook - Notificaciones en tiempo real sobre cambios en los datos del CRM
Requisitos previos
Antes de empezar, asegúrate de tener:
- Una cuenta de HubSpot (Free, Starter, Professional o Enterprise)
- Una app privada o app OAuth de HubSpot con los scopes necesarios
- Una cuenta de Brevo con acceso a la API
- Una cuenta de Tajo
Autenticación
Token de acceso de app privada (recomendado)
Crea una app privada en HubSpot para acceso directo a la API con control granular de scopes.
- Ve a Configuración de HubSpot > Integraciones > Apps privadas
- Crea una nueva app privada
- Configura los scopes necesarios
- Copia el token de acceso
curl -X GET "https://api.hubapi.com/crm/v3/objects/contacts" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json"OAuth 2.0
Usa OAuth 2.0 para integraciones multicuenta que requieran autorización del usuario.
# Authorization URLhttps://app.hubspot.com/oauth/authorize?client_id={client_id}&scope=crm.objects.contacts.read&redirect_uri={redirect_uri}Scopes necesarios
crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.companies.readcrm.objects.deals.readcrm.objects.deals.writecrm.objects.custom.readcrm.schemas.custom.readConfiguración
Configuración básica
connectors: hubspot: enabled: true access_token: "${HUBSPOT_ACCESS_TOKEN}"
# Data sync options sync: contacts: true companies: true deals: true tickets: true engagements: true
# Sync direction direction: bidirectional # or 'hubspot_to_brevo' | 'brevo_to_hubspot'
# List assignment in Brevo lists: all_contacts: 10 qualified_leads: 11 customers: 12Asignación de campos
Asocia las propiedades de HubSpot con los atributos de contacto de Brevo:
Asignaciones por defecto
| Parameter | Type | Description |
|---|---|---|
email required | string | Correo electrónico del contacto (identificador principal) |
firstname optional | string | Se asigna al atributo FIRSTNAME en Brevo |
lastname optional | string | Se asigna al atributo LASTNAME en Brevo |
phone optional | string | Se asigna al atributo SMS para WhatsApp/SMS |
company optional | string | Nombre de la empresa asociada |
lifecyclestage optional | string | Etapa del ciclo de vida en HubSpot (subscriber, lead, MQL, SQL, customer) |
hs_lead_status optional | string | Estado de calificación del lead |
hubspot_owner_id optional | string | ID del responsable de ventas asignado |
Asignación de propiedades personalizadas
field_mapping: # Standard fields email: email firstname: FIRSTNAME lastname: LASTNAME phone: SMS
# CRM fields lifecyclestage: LIFECYCLE_STAGE hs_lead_status: LEAD_STATUS company: COMPANY_NAME
# Deal metrics hs_total_deal_value: DEAL_VALUE num_associated_deals: DEAL_COUNT
# Custom properties preferred_channel: PREFERRED_CHANNEL customer_segment: SEGMENTEndpoints de la API
Objetos del CRM
| Método | Endpoint | Descripción |
|---|---|---|
GET | /crm/v3/objects/contacts | Listar contactos |
POST | /crm/v3/objects/contacts | Crear un contacto |
PATCH | /crm/v3/objects/contacts/{id} | Actualizar un contacto |
GET | /crm/v3/objects/companies | Listar empresas |
GET | /crm/v3/objects/deals | Listar negocios |
POST | /crm/v3/objects/deals | Crear un negocio |
GET | /crm/v3/objects/tickets | Listar tickets |
Asociaciones
| Método | Endpoint | Descripción |
|---|---|---|
GET | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType} | Obtener asociaciones |
PUT | /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} | Crear asociación |
Interacciones
| Método | Endpoint | Descripción |
|---|---|---|
GET | /crm/v3/objects/calls | Listar llamadas registradas |
GET | /crm/v3/objects/emails | Listar emails registrados |
GET | /crm/v3/objects/meetings | Listar reuniones |
GET | /crm/v3/objects/notes | Listar notas |
GET | /crm/v3/objects/tasks | Listar tareas |
Eventos
Eventos de contactos
| Evento | Disparador | Caso de uso |
|---|---|---|
contact.creation | Nuevo contacto creado | Disparar flujo de bienvenida |
contact.propertyChange | Propiedad del contacto actualizada | Sincronización de atributos |
contact.merge | Contactos fusionados | Gestión de duplicados |
contact.deletion | Contacto eliminado | Limpieza en Brevo |
Eventos de negocios
| Evento | Disparador | Caso de uso |
|---|---|---|
deal.creation | Nuevo negocio creado | Notificación comercial |
deal.propertyChange | Cambio de etapa del negocio | Automatización del pipeline |
deal.deletion | Negocio eliminado | Reporte de ingresos |
Eventos de empresas
| Evento | Disparador | Caso de uso |
|---|---|---|
company.creation | Nueva empresa añadida | Marketing basado en cuentas |
company.propertyChange | Datos de la empresa actualizados | Sincronización firmográfica |
Ejemplos de código
Inicializar el conector
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect HubSpotawait tajo.connectors.connect('hubspot', { accessToken: process.env.HUBSPOT_ACCESS_TOKEN});Ejecutar la sincronización de contactos
// Full bidirectional syncawait tajo.connectors.sync('hubspot', { type: 'full', resources: ['contacts', 'companies', 'deals'], direction: 'bidirectional', since: '2023-01-01'});
// Check sync statusconst status = await tajo.connectors.status('hubspot');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// contactsSynced: 34200,// companiesSynced: 5100,// dealsSynced: 2340// }Gestionar eventos de webhook
// Handle HubSpot webhook notificationsapp.post('/webhooks/hubspot', async (req, res) => { const signature = req.get('X-HubSpot-Signature-v3');
// Verify webhook signature if (!verifyHubSpotSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
for (const event of req.body) { await tajo.connectors.handleWebhook('hubspot', { eventType: event.subscriptionType, objectId: event.objectId, propertyName: event.propertyName, propertyValue: event.propertyValue }); }
res.status(200).send('OK');});Límites de velocidad
HubSpot aplica límites de velocidad por app privada o app OAuth:
| Plan | Límite de velocidad | Límite de ráfaga |
|---|---|---|
| Free/Starter | 100 peticiones/10 segundos | 150 peticiones/10 segundos |
| Professional | 150 peticiones/10 segundos | 200 peticiones/10 segundos |
| Enterprise | 200 peticiones/10 segundos | 250 peticiones/10 segundos |
| Complemento de API | 200 peticiones/10 segundos | 250 peticiones/10 segundos |
Límites adicionales:
- API de búsqueda: 5 peticiones/segundo por app
- Operaciones en lote: 100 registros por petición
- Límite diario: 500.000 peticiones/día (apps OAuth)
Gestión de límites de velocidad
HubSpot devuelve una respuesta 429 Too Many Requests cuando se superan los límites. Usa backoff exponencial y monitoriza las cabeceras X-HubSpot-RateLimit-*.
Resolución de problemas
Problemas habituales
| Problema | Causa | Solución |
|---|---|---|
| 401 Unauthorized | Token expirado o no válido | Regenera el token de la app privada o refresca el token OAuth |
| Contacto no sincronizado | Falta la propiedad email | Los contactos de HubSpot necesitan email para sincronizarse con Brevo |
| Contactos duplicados | Sin regla de deduplicación | Configura reglas de fusión en HubSpot |
| Webhook no recibido | Suscripción inactiva | Vuelve a registrar las suscripciones de webhook |
| Propiedad sin asignar | Propiedad personalizada no creada | Crea primero la propiedad en HubSpot |
Modo depuración
Activa el registro detallado:
connectors: hubspot: debug: true log_level: verbose log_webhooks: trueProbar la conexión
tajo connectors test hubspot# ✓ API connection successful# ✓ Contacts readable# ✓ Companies readable# ✓ Deals readable# ✓ Webhooks registeredBuenas prácticas
- Usa apps privadas en lugar de claves de API - Las claves de API están obsoletas; usa apps privadas para mayor seguridad
- Implementa la sincronización bidireccional con cuidado - Evita bucles infinitos rastreando el origen de la sincronización
- Asocia las etapas del ciclo de vida - Usa las etapas del ciclo de vida de HubSpot para segmentar contactos en Brevo
- Agrupa las peticiones a la API - Usa los endpoints de lote para operaciones masivas y respetar los límites
- Supervisa la entrega de webhooks - Configura lógica de reintentos y gestión de dead letters
- Usa sincronización incremental - Sincroniza solo los registros modificados usando la propiedad
lastmodifieddate
Seguridad
- Tokens de apps privadas - Tokens de acceso con permisos granulares
- OAuth 2.0 - Autorización estándar del sector con rotación de refresh tokens
- Firmas de webhooks - Verificación de firma basada en HMAC (v3)
- Cifrado TLS - Toda la comunicación con la API está cifrada en tránsito
- Permisos con scope - Acceso con los scopes mínimos necesarios por integración