Entidades a conectar
La integración permite sincronizar las siguientes entidades entre Clientify y SuiteCRM:
- Contactos (Contacts) ↔ Contactos Clientify
- Leads (Leads) ↔ Contactos Clientify (como leads)
- Empresas (Accounts) ↔ Empresas Clientify
- Productos (AOS_Products) ↔ Productos Clientify
- Oportunidades (Opportunities) ↔ Deals Clientify
- Presupuestos (AOS_Quotes) → Presupuestos Clientify (solo de SuiteCRM a Clientify)
- Llamadas (Calls) → Llamadas Clientify (solo de SuiteCRM a Clientify)
- Reuniones (Meetings) → Check-ins Clientify (solo de SuiteCRM a Clientify)
- Notas (Notes) → Notas Clientify (solo de SuiteCRM a Clientify)
Sincronización bidireccional
- Contactos: SuiteCRM ↔ Clientify
- Leads: SuiteCRM → Clientify (se sincronizan como contactos con estado de lead)
- Empresas: SuiteCRM ↔ Clientify
- Productos: SuiteCRM ↔ Clientify
- Oportunidades: SuiteCRM → Clientify
Sincronización unidireccional
- Presupuestos: SuiteCRM → Clientify
- Llamadas: SuiteCRM → Clientify
- Reuniones: SuiteCRM → Clientify
- Notas: SuiteCRM → Clientify
Webhooks
- Contactos: Clientify → SuiteCRM (cuando se crean o modifican contactos en Clientify)
Campos por entidad
Contactos SuiteCRM ↔ Contactos Clientify
Se utiliza el campo id de SuiteCRM almacenado en integrations[].integration_id de Clientify para vincular de manera única los registros.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
first_name | first_name | Nombre |
last_name | last_name | Apellido |
email1 | emails[0].email | Email principal (tipo 1) |
phone_mobile | phones[0].phone | Teléfono móvil (tipo 1) |
phone_work | phones[1].phone | Teléfono trabajo (tipo 2) |
primary_address_street | addresses[0].street | Dirección (tipo 5) |
primary_address_city | addresses[0].city | Ciudad |
primary_address_state | addresses[0].state | Provincia/Estado |
primary_address_country | addresses[0].country | País |
primary_address_postalcode | addresses[0].postal_code | Código postal |
description | summary | Descripción/Resumen |
title | title | Cargo |
assigned_user_id | owner | Propietario (se mapea por email del usuario) |
id | integrations[].integration_id | ID de SuiteCRM |
status (Leads) | status | Estado del lead (se mapea según estado de SuiteCRM) |
| – | status | Para Contacts siempre se establece como ‘client’ |
| – | contact_type | Se establece según el tipo (client o lead) |
| – | tags | Se añade automáticamente la etiqueta ‘suitecrm’ |
Mapeo de estados de Leads:
new→cold-leadassigned→warm-leadin process→warm-leadrecycled→warm-leadconverted→clientdead→lost-lead
Leads SuiteCRM → Contactos Clientify
Los Leads de SuiteCRM se sincronizan como contactos en Clientify con estados de lead. Solo se sincronizan leads que no estén en estado converted.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
first_name | first_name | Nombre |
last_name | last_name | Apellido |
email1 | emails[0].email | Email principal |
phone_mobile | phones[0].phone | Teléfono móvil |
phone_work | phones[1].phone | Teléfono trabajo |
status | status | Estado del lead (mapeado según tabla anterior) |
id | integrations[].integration_id | ID de SuiteCRM |
Empresas SuiteCRM ↔ Empresas Clientify
Se utiliza el campo id de SuiteCRM almacenado en integrations[].integration_id de Clientify para vincular de manera única los registros.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
name | name | Nombre de la empresa |
name | business_name | Razón social |
account_type | status | Tipo de cuenta |
type | contact_type | Tipo de contacto (por defecto ‘client’) |
phone_office | phones[0].phone | Teléfono principal (tipo 1) |
email1 | emails[0].email | Email principal (tipo 1) |
website | website[0].website | Sitio web |
billing_address_street | addresses[0].street | Dirección de facturación (tipo 2) |
billing_address_city | addresses[0].city | Ciudad de facturación |
billing_address_state | addresses[0].state | Provincia/Estado de facturación |
billing_address_country | addresses[0].country | País de facturación |
billing_address_postalcode | addresses[0].postal_code | Código postal de facturación |
shipping_address_street | addresses[1].street | Dirección de envío (tipo 3) |
shipping_address_city | addresses[1].city | Ciudad de envío |
shipping_address_state | addresses[1].state | Provincia/Estado de envío |
shipping_address_country | addresses[1].country | País de envío |
shipping_address_postalcode | addresses[1].postal_code | Código postal de envío |
description | summary | Descripción/Resumen |
assigned_user_id | owner | Propietario (se mapea por email del usuario) |
id | integrations[].integration_id | ID de SuiteCRM |
| – | tags | Se añade automáticamente la etiqueta ‘suitecrm’ |
Productos SuiteCRM ↔ Productos Clientify
Se utiliza el campo part_number de SuiteCRM (o id si no existe) y sku de Clientify para vincular de manera única los registros.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
name | name | Nombre del producto |
description | description | Descripción |
price | price | Precio (redondeado a 2 decimales) |
part_number o id | sku | Campo clave para vinculación |
product_image | product_picture_url | Imagen del producto (solo si es URL válida) |
Nota: Si el producto no tiene part_number, se utiliza el id de SuiteCRM como SKU.
Oportunidades SuiteCRM → Deals Clientify
Se utiliza el campo id de SuiteCRM almacenado en el campo personalizado suitecrm_deal_id de Clientify para vincular de manera única los registros.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
name | name | Nombre de la oportunidad |
amount | amount | Importe |
account_id | company | Se sincroniza primero la empresa asociada |
date_closed | actual_closed_date | Fecha de cierre real |
date_closed | expected_closed_date | Fecha de cierre esperada |
probability | probability | Probabilidad (dividida entre 10) |
sales_stage | pipeline_stage | Etapa del pipeline (se crea pipeline ‘suitecrm’ si no existe) |
opportunity_type | custom_fields[].value | Tipo de oportunidad (campo personalizado ‘suitecrm_type’) |
campaign_name | custom_fields[].value | Campaña (campo personalizado ‘suitecrm_campaign’) |
lead_source | custom_fields[].value | Origen del lead (campo personalizado ‘suitecrm_lead_source’) |
id | custom_fields[].value | ID de SuiteCRM (campo personalizado ‘suitecrm_deal_id’) |
date_entered | created | Fecha de creación |
| – | tags | Se añade automáticamente la etiqueta ‘suitecrm’ |
Etapas del pipeline SuiteCRM:
- Prospecting
- Qualification
- Needs Analysis
- Value Proposition
- Identifying Decision Makers
- Perception Analysis
- Proposal/Price Quote
- Negotiation/Review
- Closed Won
- Closed Lost
La integración crea automáticamente un pipeline llamado «suitecrm» en Clientify con estas etapas si no existe.
Presupuestos SuiteCRM → Presupuestos Clientify
Se utiliza el campo number de SuiteCRM con prefijo «SUITE-» y budget_code de Clientify para vincular de manera única los registros.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
name | name | Nombre del presupuesto |
date_entered | created | Fecha de creación |
expiration | expiration_date | Fecha de expiración |
description | description | Descripción |
approval_issue | notes | Notas de aprobación |
stage | status | Estado (mapeado: ‘closed lost’ → ‘rejected’, ‘closed accepted’ → ‘accepted’, otros → ‘expired’) |
subtotal_amount | subtotal | Subtotal (redondeado) |
discount_amount | discount | Descuento (redondeado) |
total_amt | total | Total (redondeado) |
number | budget_code | Código del presupuesto (con prefijo «SUITE-«) |
billing_contact_id | contact | Se sincroniza primero el contacto asociado |
billing_account_id | company | Se sincroniza primero la empresa asociada |
opportunity_id | deal | Se sincroniza primero la oportunidad asociada |
Líneas de presupuesto:
AOS_Products_Quotes→items[]en Clientify- Cada línea incluye: nombre, cantidad, precio unitario, descuento, descripción, impuestos
Llamadas SuiteCRM → Llamadas Clientify
Las llamadas de SuiteCRM se sincronizan como llamadas en el timeline de contactos/empresas en Clientify.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
date_start | call_date | Fecha de la llamada |
date_start y date_end | call_time | Duración calculada |
direction | type | Tipo: ‘inbound’ → ‘incoming’, otros → ‘outgoing’ |
status | outcome | Resultado: ‘held’ → ‘connected’, otros → ‘no_answer’ |
description | comment | Descripción con información de SuiteCRM |
Reuniones SuiteCRM → Check-ins Clientify
Las reuniones de SuiteCRM se sincronizan como check-ins en el timeline de contactos/empresas en Clientify.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
date_start | date | Fecha y hora de la reunión |
name | comment | Asunto de la reunión |
description | comment | Descripción con información de SuiteCRM |
status | outcome | Resultado: ‘held’ → ‘completed’, otros → ‘scheduled’ |
| – | type | Siempre se establece como ‘virtual’ |
Notas SuiteCRM → Notas Clientify
Las notas de SuiteCRM se sincronizan como notas en el timeline de contactos/empresas en Clientify.
| Campo SuiteCRM | Campo Clientify | Observaciones |
|---|---|---|
name | name | Título de la nota |
name y description | comment | Contenido con información de SuiteCRM |
Mecanismo de sincronización
Proceso de vinculación
La integración utiliza diferentes estrategias para vincular registros:
- Por campo de integración: Se busca primero si existe un campo de integración que contenga el ID de SuiteCRM.
- Por SKU (productos): Para productos, se busca por el SKU (
part_numberoid). - Por código de presupuesto: Para presupuestos, se busca por el
budget_codecon prefijo «SUITE-«. - Por ID de deal: Para deals, se busca por el campo personalizado
suitecrm_deal_id. - Creación: Si no se encuentra ninguna coincidencia, se crea un nuevo registro.
Resolución de conflictos
Cuando se encuentra una coincidencia, la integración compara las fechas de modificación:
- Si el registro de Clientify es más reciente → Se actualiza SuiteCRM
- Si el registro de SuiteCRM es más reciente → Se actualiza Clientify
Modos de sincronización
La integración puede ejecutarse en dos modos:
- Full: Sincroniza todos los registros
- Modified: Sincroniza solo los registros modificados en las últimas 24 horas
Webhooks
La integración soporta webhooks para sincronización en tiempo real desde Clientify hacia SuiteCRM:
contact.saved: Sincroniza contactos cuando se crean o modifican en Clientify
Requisitos para webhooks:
- El contacto debe tener un campo de integración con ID de SuiteCRM o se creará uno nuevo
- Se busca primero por campo de integración, luego por email
Autenticación
La integración utiliza la API SOAP v4.1 de SuiteCRM. El proceso de autenticación:
- Se conecta al endpoint WSDL:
{url}/service/v4_1/soap.php?wsdl - Realiza login con usuario y contraseña (MD5)
- Obtiene un
session_id(login_id) que se utiliza para todas las operaciones - El token se refresca automáticamente cuando es necesario
Proceso de conexión
Credenciales necesarias
Para configurar la integración se necesitan las siguientes credenciales:
- URL de SuiteCRM: URL base de la instalación de SuiteCRM (ej:
https://suitecrm.ejemplo.com) - Usuario: Nombre de usuario de SuiteCRM
- Contraseña: Contraseña del usuario de SuiteCRM
Obtención de credenciales
1. URL de SuiteCRM
La URL debe ser la dirección base de tu instalación de SuiteCRM, sin barras finales. Por ejemplo:
https://suitecrm.ejemplo.comhttps://crm.miempresa.com
2. Usuario y Contraseña
Necesitas un usuario de SuiteCRM con permisos suficientes para:
- Leer y escribir en módulos: Contacts, Leads, Accounts, Products, Opportunities, AOS_Quotes, Calls, Meetings, Notes
- Acceso a la API SOAP
Recomendación: Usa un usuario dedicado para la integración con permisos de administrador o permisos específicos para los módulos mencionados.
Configuración en Clientify
- Acceder a la pestaña de Integraciones en Clientify
- Seleccionar la tarjeta de SuiteCRM
- Rellenar los campos:
- URL
- Usuario
- Contraseña
- Guardar la configuración
- Si todo es correcto, aparecerá un mensaje de confirmación y la integración se activará
Compatibilidad
Versiones de SuiteCRM
La integración se ha desarrollado utilizando la API SOAP v4.1 de SuiteCRM. En principio, debería ser compatible con todas las versiones de SuiteCRM que soporten esta API, ya que:
- Utiliza el protocolo SOAP estándar de SuiteCRM
- No depende de funcionalidades específicas de versión
- Los módulos utilizados son estándar en SuiteCRM
Nota: Versiones muy antiguas de SuiteCRM (anteriores a la 7.x) podrían presentar incompatibilidades debido a cambios en la estructura de la API.
Requisitos
- Usuario de SuiteCRM con permisos de API
- Acceso a la API SOAP de SuiteCRM (endpoint
/service/v4_1/soap.php?wsdl) - Credenciales válidas (usuario y contraseña)
- Integración PREMIUM activa en Clientify
Campos personalizados
La integración crea automáticamente los siguientes campos personalizados en Clientify:
Para Deals:
suitecrm_type: Tipo de oportunidadsuitecrm_campaign: Campaña asociadasuitecrm_lead_source: Origen del leadsuitecrm_deal_id: ID de la oportunidad en SuiteCRM
Para Contactos (configuración personalizada por cuenta):
Rol Suitecrm: Rol del contacto en SuiteCRM (si está configurado)
Para Empresas (configuración personalizada por cuenta):
Estado: Estado de la empresa en SuiteCRM (si está configurado)
Pipeline de Deals
La integración crea automáticamente un pipeline llamado «suitecrm» en Clientify con las siguientes etapas:
- Prospecting
- Qualification
- Needs Analysis
- Value Proposition
- Identifying Decision Makers
- Perception Analysis
- Proposal/Price Quote
- Negotiation/Review
- Closed Won
- Closed Lost
Si el pipeline ya existe, se utiliza el existente. Las oportunidades de SuiteCRM se asignan automáticamente a la etapa correspondiente según su sales_stage.
