BeeL.es
Producto
Precio
Precio
← Blog
Desarrollo9 min de lectura

Cómo Integrar Facturación Española en tu CRM con la API de BeeL

Sincroniza clientes y facturas entre tu CRM y la facturación española. API REST con SDK de TypeScript, validación de NIF y cumplimiento VeriFactu automático.

09 Abril 2026•
Roger Massana
Roger Massana

#Tu CRM gestiona clientes. Pero no factura.

Si tienes un CRM — ya sea HubSpot, Salesforce, Pipedrive o uno propio — probablemente gestiona el ciclo de vida del cliente: desde el lead hasta el cierre. Pero cuando llega el momento de facturar, empieza el trabajo manual: copiar datos del cliente, abrir otro software, crear la factura, enviarla, y luego volver al CRM a actualizar el estado.

Con la API de BeeL, puedes automatizar todo ese flujo directamente desde tu CRM. Crear clientes, validar NIFs, generar facturas conformes a VeriFactu y sincronizar estados — todo programáticamente.

ℹ️SDK oficial disponible

El SDK de TypeScript (@beel_es/sdk) simplifica la integración: tipado completo, errores tipados, reintentos automáticos y cero configuración.


#El flujo completo: CRM → BeeL → Factura

El patrón típico de integración tiene 4 pasos:

  1. Sincronizar cliente del CRM a BeeL (con validación de NIF)
  2. Crear factura cuando se cierra un deal o se genera una venta
  3. Emitir y enviar la factura al cliente
  4. Sincronizar estado de vuelta al CRM (pagada, anulada, etc.)

#Paso 1: Sincronizar clientes con validación de NIF

Antes de crear una factura, necesitas el cliente en BeeL. Lo ideal es sincronizarlo cuando se crea o actualiza en tu CRM.

import { BeeL, CustomerBuilder } from '@beel_es/sdk';
 
const beel = new BeeL({ apiKey: process.env.BEEL_API_KEY! });
 
// Primero: validar el NIF contra la AEAT
const nifResult = await beel.nif.validate(crmContact.nif);
 
if (!nifResult.valid) {
  // Marcar en el CRM que el NIF es inválido
  await crm.updateContact(crmContact.id, {
    nif_status: 'INVALID',
    nif_error: 'NIF no registrado en la AEAT',
  });
  return;
}
 
// Crear cliente en BeeL
const customerData = CustomerBuilder.create()
  .name(crmContact.company_name)
  .nif(crmContact.nif)
  .email(crmContact.email)
  .phone(crmContact.phone)
  .address(
    crmContact.street,
    crmContact.number,
    crmContact.postal_code,
    crmContact.city,
    crmContact.province,
    'Spain'
  )
  .build();
 
const customer = await beel.customers.create(customerData);
 
// Guardar el ID de BeeL en el CRM para futuras facturas
await crm.updateContact(crmContact.id, {
  beel_customer_id: customer.id,
  nif_status: 'VALID',
});

⚠️Valida siempre el NIF antes de facturar

Una factura con NIF inválido es una factura con problemas legales. La validación contra la AEAT tarda milisegundos y te ahorra correcciones posteriores.


#Paso 2: Crear factura al cerrar un deal

Cuando un deal se cierra en tu CRM, generas la factura automáticamente:

async function onDealClosed(deal: CrmDeal) {
  const beelCustomerId = deal.contact.beel_customer_id;
 
  if (!beelCustomerId) {
    throw new Error('Cliente no sincronizado con BeeL');
  }
 
  // Mapear líneas del deal a líneas de factura
  const lines = deal.products.map(product => ({
    description: product.name,
    quantity: product.quantity,
    unit_price: product.price,
    discount_percentage: product.discount || 0,
  }));
 
  const invoice = await beel.invoices.create({
    type: 'STANDARD',
    recipient: { customer_id: beelCustomerId },
    lines,
  });
 
  // Emitir inmediatamente (asigna número + VeriFactu)
  const issued = await beel.invoices.issue(invoice.id);
 
  // Enviar por email al cliente
  await beel.invoices.sendEmail(issued.id);
 
  // Actualizar el deal en el CRM
  await crm.updateDeal(deal.id, {
    invoice_id: issued.id,
    invoice_number: issued.invoice_number,
    invoice_status: 'ISSUED',
  });
}

#Paso 3: Sincronizar el estado de pago

Cuando el cliente paga, puedes marcarlo desde el CRM o usar webhooks para sincronización automática:

// Opción A: Marcar como pagada desde el CRM
async function onPaymentReceived(deal: CrmDeal) {
  await beel.invoices.markPaid(deal.invoice_id, {
    payment_date: new Date().toISOString().split('T')[0],
  });
 
  await crm.updateDeal(deal.id, {
    invoice_status: 'PAID',
  });
}
 
// Opción B: Webhook de BeeL → actualizar CRM
// (Ver blog sobre webhooks para implementación completa)

#Búsqueda y listado de facturas

Para mostrar facturas dentro de tu CRM, usa los filtros de la API:

// Facturas pendientes de un cliente
const { invoices } = await beel.invoices.list({
  status: 'ISSUED',
  limit: 50,
});
 
// Buscar clientes sincronizados
const { customers } = await beel.customers.list({
  search: 'Acme',
  limit: 10,
});

#Gestión de errores en la integración

Los errores tipados del SDK hacen que manejar fallos sea predecible:

import { BeeLValidationError, BeeLConflictError } from '@beel_es/sdk';
 
try {
  await beel.invoices.create(invoiceData);
} catch (error) {
  if (error instanceof BeeLValidationError) {
    // Campos inválidos — loguear detalles
    console.error('Campos con error:', error.details);
    await crm.addNote(deal.id, `Error facturación: ${JSON.stringify(error.details)}`);
  } else if (error instanceof BeeLConflictError) {
    // Ya existe — posible duplicado, recuperar la existente
    console.warn('Posible factura duplicada');
  } else {
    // Error inesperado — el SDK ya reintentó 3 veces en 5xx
    throw error;
  }
}

#Arquitectura recomendada

Para integraciones robustas, recomendamos:

ComponenteRecomendación
SincronizaciónEvent-driven: webhook del CRM al crear/actualizar cliente
IdempotenciaEl SDK añade claves automáticas — seguro reintentar
Mapeo de IDsGuardar beel_customer_id y beel_invoice_id en el CRM
EstadoWebhooks de BeeL para sync bidireccional
ErroresCola de reintentos para fallos transitorios

#Preguntas frecuentes

#¿Puedo sincronizar clientes en ambas direcciones?

Sí. La API permite crear, actualizar y listar clientes. Puedes implementar sincronización bidireccional: CRM → BeeL al crear clientes, BeeL → CRM vía webhooks cuando cambien datos.

#¿Se valida el NIF automáticamente al crear un cliente?

No se valida automáticamente al crear — eso te da control. Pero el endpoint beel.nif.validate() está disponible para validar antes de crear. Es la práctica recomendada.

#¿Funciona con CRMs que no son Node.js?

Sí. La API REST funciona con cualquier lenguaje. El SDK de TypeScript simplifica la integración en Node.js, pero puedes usar fetch, curl o cualquier cliente HTTP con los mismos endpoints.

#¿Cómo gestiono la sincronización masiva inicial?

Para migrar clientes existentes, usa un script que itere sobre los contactos del CRM, valide NIFs y cree clientes en BeeL. Las claves de idempotencia protegen contra duplicados si necesitas reiniciar el proceso.


¿Necesitas integrar facturación en tu CRM? Empieza con el SDK de TypeScript (código fuente en GitHub), consulta la documentación de la API y la página de SDKs para quickstarts en otros lenguajes.

¿Te ha resultado útil? Compártelo con otros autónomos

Compartir:

¿Listo para simplificar tu facturación?

Únete a BeeL.es y cumple con Verifactu sin complicaciones

7 días gratis

← Ver todos los artículos del blog
BeeL.es

Nuestro mejor cliente pasa 47 segundos al mes en BeeL. Ese es el objetivo.

Producto

  • Blog
  • API
  • Docs API
  • Stripe
  • Demo gestorías
  • Roadmap
  • Status

Comparaciones

  • Comparar software
  • vs Holded
  • vs Quipu
  • vs Contasimple
  • vs STEL Order
  • vs A3Factura
  • Ver todas →

Verifactu

  • ¿Qué es Verifactu?
  • Fechas y plazos
  • Guía para autónomos
  • Multas y sanciones
  • Artículos sobre Verifactu →
  • Por ciudades →

Comunidad

  • LinkedIn
  • Instagram
  • TikTok
  • YouTube

Legal

  • Privacidad
  • Cookies
  • Términos
  • Cancelación
  • Declaración Responsable

© 2026 BeeL.es - Hecho con ❤️ para autónomos como tú

BeeL.es - Platja d'Aro, Girona, España•hola@beel.es•WhatsApp