¿Qué hace este flujo y qué problema resuelve?
Este flujo automatiza la generación de propuestas comerciales desde el CRM hasta un documento PDF final, firmado o listo para envío. Resuelve tres problemas críticos que afectan a equipos comerciales y de operaciones: pérdida de tiempo por copiar/pegar, errores recurrentes en datos y falta de control sobre cláusulas legales y descuentos.
Resumen funcional: al pulsar un botón "Generar Propuesta" en el CRM, el sistema recupera los datos del deal (cliente, lista de productos/servicios, precios, condiciones), aplica reglas de negocio predefinidas (márgenes, descuentos, cláusulas por país), valida campos obligatorios, solicita aprobación cuando procede y genera un PDF inmutable almacenado en un repositorio centralizado. Finalmente, actualiza el registro del deal con el enlace al documento y notifica a las partes responsables.
Impacto cuantificable: reducción del tiempo de creación de propuestas desde un promedio de 45 minutos a menos de 2 minutos por propuesta; eliminación de errores de copia/pegar (nombres de clientes, cláusulas incorrectas); cumplimiento normativo homogéneo entre países; trazabilidad completa de aprobaciones y versiones.
Actores clave y responsabilidades:
- Dirección Comercial / RevOps: define la plantilla maestra, reglas de descuentos, umbrales de aprobación y cláusulas por país. Ejemplo: InnovaCloud decide que descuentos >15% requieren aprobación de dirección y que las cláusulas GDPR de España aplican siempre a contratos SaaS.
- Equipo Técnico (IT / RevOps técnico): implementa el webhook del CRM, configura n8n, mapea campos en Google Docs y gestiona integración con almacenamiento y firma electrónica. Ejemplo: AlfaLogistics configura la autenticación del webhook y mapea el campo custom.discount_rate.
- Legal / Compliance: mantiene la librería de cláusulas por país y versión, valida la plantilla maestra y autoriza cambios en las cláusulas legales.
Arquitectura simplificada: CRM -> Webhook n8n -> Nodes de enriquecimiento y cálculo -> Plantilla Google Docs -> Export PDF en Google Drive/SharePoint -> Actualización CRM + Notificación via email/Slack.
Cuándo usar este flujo
Cuándo usar este flujo
| ✓ Úsalo cuando… | ✗ No lo uses cuando… |
|---|---|
|
|
Prerrequisitos
Antes de implementar el flujo asegúrate de cubrir estos prerrequisitos técnicos y de negocio. Ignorar alguno de ellos provoca fallos operativos o errores en el documento final.
- CRM con API o webhooks: El CRM debe permitir invocar webhooks o llamadas HTTP para transmitir el ID del deal. Ejemplo: configuración de un botón "Generar Propuesta" que hace POST a https://[N8N_HOST]/webhook/generate-proposal con body {"dealId": "[DEAL_ID]"}.
- Plantilla maestra en Google Docs o HTML: Una plantilla con marcadores claros (por ejemplo, {{client_name}}, {{items_table}}) y una política de versionado controlado por Legal. Mantén una variable [LEGAL_TEMPLATE_DOC_ID] por país.
- Cuenta de servicio con permisos en Google Drive/Docs: Credenciales OAuth o cuenta de servicio con permiso para crear y exportar documentos en formato PDF.
- Repositorio de cláusulas por país: Una carpeta con documentos fragmentarios por jurisdicción (ej. clauses/es_gdpr.md, clauses/mx_ley_fiscal.md) y un identificador único por versión. Legal debe mantener un índice con ids y fechas de vigencia.
- Reglas de negocio definidas: Lista de campos obligatorios en el CRM (email del cliente, persona de contacto, dirección fiscal, moneda), umbrales de descuento y aprobaciones. Ejemplo: [DISCOUNT_THRESHOLD]=15% y [MARGIN_MIN]=12%.
- Gestión de aprobaciones: Canal de aprobación (Slack, correo, formulario interno) y cuenta que reciba notificaciones automáticas desde n8n. Ejemplo: aprobación vía Slack en el canal #approvals con botón "Aprobar 1-click".
- Política de almacenamiento y retención: Define dónde se almacenan PDFs (Google Drive/SharePoint/S3) y la retención legal mínima. Ejemplo: Propuestas comerciales archivadas 7 años en carpeta /Propuestas/2026/.
Checklist de verificación rápida:
- Webhook probado con payload de ejemplo: {"dealId":"12345"}.
- Plantilla maestra validada por Legal y subida a Google Docs con ID [LEGAL_TEMPLATE_DOC_ID].
- Credenciales del servicio de Drive cargadas en n8n y probadas para crear y exportar documentos.
- Mapa de campos del CRM completado y testeado con un deal real en entorno de staging.
Diseño de la plantilla y las reglas de negocio
Explicación detallada del paso
El diseño de la plantilla es la base del flujo. La plantilla debe separar contenido fijo (encabezado, tabla de condiciones generales) de bloques variables (lista de productos, descuentos, cláusulas legales). Use marcadores textuales homogéneos y una librería de fragmentos legales identificados por código y versión. La plantilla maestra debe incluir metadatos invisibles para auditoría: número de versión, fecha de emisión y campo de trazabilidad (ID del deal).
Configuración específica en n8n
- Node: Google Docs Template (o HTTP Request si se usa API de Google Docs)
- Parámetros clave: documentId = [LEGAL_TEMPLATE_DOC_ID], replaceAll = [{"find":"{{client_name}}","replaceValue":"{{$json[\"deal\"].client.name}}"}, {"find":"{{proposal_date}}","replaceValue":"{{new Date().toISOString().split('T')[0]}}"}]
- Node: Set (para construir la tabla de items): use un campo itemsHtml y genere la tabla en HTML para insertar en la plantilla.
- Node: Function (para validar campos obligatorios): código JavaScript que lanza un error con mensaje claro si falta algún campo obligatorio. Ejemplo de mensaje: "Falta email del contacto comercial: field contact.email".
Consideraciones técnicas y de negocio
- Versionado: mantenga una tabla controlada con columnas {template_id, version, valid_from, valid_to, legal_owner}. El n8n debe leer el id de versión activa desde una hoja de control o un endpoint interno.
- Marcadores y formato: use marcadores tipo {{FIELD_NAME}} y evite caracteres especiales en los nombres. Para tablas, prefiera insertar HTML para mantener consistencia en la exportación a PDF.
- Seguridad: los templates pueden contener cláusulas sensibles; restrinja acceso a la cuenta de servicio y habilite logging en Google Drive.
- Auditoría: incluya en el doc campos ocultos o un bloque al final con metadatos: "Generado por [SYSTEM] para Deal [DEAL_ID] - Template [VERSION]".
Ejemplo concreto
Empresa: TecnoSolar. Reglas definidas por RevOps y Legal:
- Descuento máximo autorizado: 10% sin aprobación; 10-20% requiere aprobación de Dirección Comercial; >20% no permitido.
- Márgenes mínimos: si margen <12% se bloquea y solicita revisión financiera.
- Cláusulas por país: España -> cláusula GDPR [ES-GDPR-v2]; México -> cláusula fiscal [MX-FISCAL-v1].
Plantilla maestra: Google Doc ID = [TCS_TEMPLATE_DOC_ID]. Marcadores clave: {{client_name}}, {{items_table}}, {{total_net}}, {{discount_rate}}, {{legal_clauses}}. Fragmentos legales almacenados en Drive con ids: ES-GDPR-v2, MX-FISCAL-v1.
Trigger desde el CRM
Explicación detallada del paso
El trigger convierte la acción del comercial en el CRM en el punto de partida del flujo. Debe transmitir un payload mínimo y fiable: ID del deal, usuario que solicita, lista de items o referencia para recuperar items, y contexto de moneda y país. Idealmente, el botón "Generar Propuesta" verifica campos obligatorios en el cliente antes de llamar al webhook para evitar reintentos innecesarios.
Configuración específica de nodos n8n
- Node: Webhook
- Method: POST
- Path: /webhook/generate-proposal
- Response Mode: On Received (envía confirmación inmediata al CRM)
- Node: HTTP Request (opcional, para recuperar datos del deal en CRM si el webhook sólo envía dealId)
- URL: https://[CRM_API_BASE]/deals/[DEAL_ID]
- Authentication: API Key / OAuth2
- Headers: Authorization: Bearer [CRM_API_KEY]
- Node: Function (normalización): transforma precios a la moneda del template, calcula impuestos locales y prepara estructura items[]
- Node: IF (validación de campos obligatorios): condicional con expresiones n8n para comprobar existence de contact.email, billing.address, currency. Si falla, envía respuesta de error al CRM y detiene el flujo.
Consideraciones técnicas y de negocio
- Seguridad del webhook: habilite API Key en cabecera o firma HMAC para garantizar integridad del origen. Ejemplo: X-Signature: HMAC_SHA256([SECRET],[BODY]).
- Timeouts y reintentos: configure tiempo de espera corto en la respuesta al CRM; el procesamiento largo debe ejecutarse asincrónico. Configure un mecanismo de reintento para errores transitorios y un dead-letter queue para fallos persistentes.
- Validación previa: recomendamos que el CRM ejecute validaciones front-end antes de llamar al webhook para reducir fracasos por datos incompletos.
Ejemplo concreto con datos ficticios
Comercial pulsa "Generar Propuesta" en el deal 2026-045 de BioMedica Soluciones. Payload enviado al webhook:
{ "dealId": "2026-045", "requestedBy": "maria.gomez@biomedica.com", "triggerSource": "button_crm"}n8n recibe el webhook, ejecuta HTTP Request a https://api.crm.example.com/deals/2026-045 con Authorization: Bearer [CRM_API_KEY], obtiene:
{ "id":"2026-045", "client": {"name":"Hospital Santa Clara","country":"ES","billing_address":"C/ Salud 10, Madrid"}, "items":[{"sku":"BM-SVC-1","description":"Servicio de análisis","quantity":1,"unitPrice":7500}], "currency":"EUR", "discountRate":12 }La Function node normaliza la moneda, añade IVA si procede y pasa al siguiente paso los datos listos para aplicar reglas de negocio.
Cálculo y lógica condicional
Explicación detallada del paso
En este punto la automatización aplica las reglas de negocio: cálculo de subtotales, impuestos, verificación de margen, aplicación de descuentos y selección de cláusulas legales según país y tipo de producto. También gestiona aprobaciones automáticas o manuales.
Configuración específica de nodos n8n
- Node: Function (cálculos)
// Ejemplo de Function node (variables en corchetes) const deal = $json["deal"]; const items = deal.items; const DISCOUNT_THRESHOLD = [DISCOUNT_THRESHOLD]; const MARGIN_MIN = [MARGIN_MIN]; let subtotal = 0; items.forEach(i => subtotal += i.quantity * i.unitPrice); const discountAmount = subtotal * (deal.discountRate || 0) / 100; const totalNet = subtotal - discountAmount; const margin = ((totalNet - deal.costTotal) / totalNet) * 100; return [{ json: { subtotal, discountAmount, totalNet, margin } }];- Condición: {{$json["deal"].discountRate}} > [DISCOUNT_THRESHOLD]
- Si true -> Node: Send Notification (Slack / Email) -> Wait For Approval Node (Webhook callback de aprobación)
Consideraciones técnicas y de negocio
- Exactitud de los costes: asegúrese de que el campo costTotal viene del ERP o catálogo actualizado; si no, el cálculo de margen será erróneo y puede bloquear propuestas válidas.
- Race conditions: si varios usuarios modifican el deal simultáneamente, utilice locks lógicos basados en versión (campo version o updated_at) al inicio del flujo.
- Políticas de aprobación: defina SLA de aprobación (por ejemplo, 8 horas). Si la aprobación no llega, el flujo envía una respuesta temporal al comercial y crea una tarea en el gestor de incidencias.
- Auditoría de decisiones automatizadas: registre razones y datos que llevaron a una aprobación/rechazo (por ejemplo, "Descuento 18% > umbral 15% — aprobado por Director Comercial Juan Pérez el 2026-07-12").
Ejemplo concreto
Deal 2026-045 de BioMedica Soluciones: subtotal 7.500 EUR, descuento 12% -> descuento 900 EUR, total neto 6.600 EUR. Coste reportado 5.900 EUR -> margen = ((6.600-5.900)/6.600)*100 = 15.9% > MARGIN_MIN 12% → no se requiere aprobación de margen. Descuento 12% > DISCOUNT_THRESHOLD 10% → inicia solicitud de aprobación automática a dirección:
- Notificación enviada a Slack canal #approvals con botón "Aprobar 1-click"
- Si no hay respuesta en 6 horas, se envía recordatorio y crea tarea en Jira.
Generación del PDF y almacenamiento
Explicación detallada del paso
Una vez validados los cálculos y obtenidas las aprobaciones necesarias, se genera el documento final. La generación puede usar Google Docs como plantilla y exportar a PDF o convertir HTML a PDF con una librería robusta. El archivo resultante se almacena en un repositorio con control de acceso y metadatos, y se publica el enlace seguro en el CRM.
Configuración específica de nodos n8n
- Node: Google Docs - Copy
- Action: Copy existing template document
- Source Document ID: [TEMPLATE_DOC_ID]
- Destination Folder: /Propuestas/[AÑO]/[MES]
- Node: Google Docs - Update
- Use replaceAll mapping: {{client_name}} -> {{$json["deal"].client.name}}, {{items_table}} -> {{$json["itemsHtml"]}}, {{legal_clauses}} -> {{$json["legal_clauses"]}}
- Node: Google Drive - Export
- File ID: ID del documento copiado
- MIME Type: application/pdf
- Output: Binary data PDF
- Node: Google Drive - Upload / Move
- Store en carpeta protegida: /Propuestas/2026/07
- Set permissions: sólo grupo comercial y Legal lectura
- Node: Set (metadatos)
- Fields: proposal_url, proposal_filename, template_version, generated_by, generated_at
- Node: HTTP Request (actualizar CRM)
- PATCH https://[CRM_API_BASE]/deals/[DEAL_ID]
- Body: {"proposal_url":"[PROPOSAL_URL]","proposal_doc_id":"[DOC_ID]","proposal_status":"Generated"}
Consideraciones técnicas y de negocio
- Seguridad y enlaces: no exponga PDFs públicamente. Use enlaces con token o permisos restringidos. Para clientes externos puede generarse un enlace público temporal con expiración (ej. 7 días) y el enlace permanente en el CRM sólo accesible internamente.
- Integración de firma electrónica: si se requiere firma, el PDF exportado debe enviarse al proveedor de firma (DocuSign, HelloSign o proveedor local) mediante API. Añada un estado intermedio "Pending Signature" en el CRM.
- Retención y eliminación: aplique reglas de retención definidas por compliance (ej. guardar 7 años). Automatice limpieza con un proceso batch que archive a cold storage.
- Tamaño y rendimiento: la generación de PDFs con imágenes puede ser intensiva. Optimice plantillas para reducir imágenes pesadas y utilice exportación asíncrona si es necesario.
Ejemplo concreto
Para AlfaLogistics, n8n copia la plantilla ID [ALF_TEMPLATE_2026_v3], reemplaza campos y exporta PDF llamado "Propuesta_AlfaLogistics_2026-045.pdf" a la carpeta "/Propuestas/2026/07/AlfaLogistics" con permiso de visualización para grupo "Ventas Europe" y Legal. Posteriormente actualiza el deal en el CRM con:
{ "proposal_url": "https://drive.google.com/file/d/[DOC_ID]/view?usp=sharing", "proposal_doc_id": "[DOC_ID]", "proposal_status": "Generated"}Output esperado del flujo
El output final es tanto técnico como operativo. Debe permanecer estandarizado para facilitar auditoría y trazabilidad.
Elementos que se deben generar y almacenar:
- Archivo PDF de la propuesta con nombre estandarizado: Propuesta_[CLIENTE]_[DEAL_ID].pdf
- Registro actualizado en el CRM: campos proposal_url, proposal_doc_id, proposal_status, proposal_generated_at
- Registro de auditoría en el repositorio o base de datos interna: quién generó, qué plantilla se usó, versión de cláusulas, aprobaciones recibidas (usuario y timestamp)
- Notificación al comercial solicitante y a Legal si procede
Ejemplo concreto de output (datos ficticios)
{ "dealId": "2026-045", "client": "Hospital Santa Clara", "proposal_file": "Propuesta_Hospital_Santa_Clara_2026-045.pdf", "proposal_url": "https://drive.google.com/file/d/1A2b3C4dEfGhIjKl/view?usp=sharing", "template_id": "TCS_TEMPLATE_DOC_ID", "template_version": "v3.1", "legal_clauses": ["ES-GDPR-v2","ES-CL-PSA-v1"], "discountRate": 12, "subtotal": 7500, "discountAmount": 900, "totalNet": 6600, "margin": 15.9, "approved_by": "juan.perez@tecnosolar.com", "approved_at": "2026-07-12T10:32:00Z", "generated_at": "2026-07-12T10:35:05Z", "proposal_status": "Generated"}Descripción del ejemplo:
- proposal_url: enlace seguro en Google Drive con permisos restringidos.
- legal_clauses: lista de identifiers que Legal debe poder auditar.
- approved_by y approved_at: si la propuesta requirió aprobación, estos campos quedarán registrados.
| Nodo | Función | Configuración clave |
|---|---|---|
| Trigger: CRM "Generar Propuesta" (Webhook) | Inicia el flujo al pulsar el botón en el CRM | URL del webhook; autenticación (API key/OAuth); mapa de payload: dealId, userId, locale |
| Get Deal (CRM API) | Recupera datos del deal: cliente, líneas, precios, campos personalizados | Endpoint API; campos solicitados (client.name, items[], currency, country, customFields); manejo de errores 4xx/5xx |
| Apply Business Rules (Function/Code) | Aplica márgenes, reglas de descuento y cláusulas por país | Script JS con catálogo de reglas; parámetros: descuentoMax, márgenMínimo; tabla de cláusulas por país (ej. GDPR para países EU) |
| Validate Fields (If / Function) | Verifica campos obligatorios y formatos | Lista de campos obligatorios; validaciones regex (email, NIF/CIF); ruta de rechazo con mensaje legible |
| Approval Gate (Manual / Email) | Solicita aprobación cuando procede según umbrales | Condición (descuento > 15%); lista de aprobadores (Dirección/RevOps); tiempo de expiración; registro de aprobaciones y timestamps |
| Generate PDF (Template Engine → PDF) | Genera documento final inmutable listo para firma o envío | ID de plantilla maestra; inyección de datos (cliente, ítems, precios, cláusulas); generación de versión; soporte para firma digital/markup |
| Store Document (Repositorio central) | Almacena PDF con control de acceso y versionado | Destino (S3/minio/Drive corporativo); ruta organizada por cliente/deal; metadatos (version, createdBy, checksum) |
| Update Deal (CRM Update) | Adjunta enlace al documento y actualiza estado del deal | Campo destino en CRM (proposalUrl, proposalStatus); payload de actualización; manejo de concurrencia |
| Notify Stakeholders (Email / Slack) | Informa al equipo comercial y operaciones del resultado | Plantilla de notificación; lista de destinatarios (owner, approver); incluir enlace seguro y resumen de cambios |
Problemas frecuentes y cómo resolverlos
Incluye lista de errores habituales, síntoma, causa probable y solución recomendada.
- Error 1: Documento con nombre de cliente antiguo
- Síntoma: la propuesta generada contiene el nombre de un cliente distinto al deal activo.
- Causa: la plantilla fue copiada manualmente desde un documento previo y no se reemplazó correctamente el marcador {{client_name}}; o la Function node no limpió metadatos al copiar plantilla.
- Solución: utilizar siempre la acción "Copy" del template y luego ejecutar un paso "replaceAll" que sobreescriba explícitamente todos los marcadores. Añadir una Function node que valide que {{$json["deal"].client.name}} aparece en el cuerpo antes de exportar. Implementar tests automáticos en staging con datasets representativos.
- Error 2: Precio o moneda incorrecta
- Síntoma: el PDF muestra precios en una moneda distinta a la acordada o con decimales erróneos.
- Causa: falta de normalización de moneda o conversión en la Function node; o el CRM almacena precios en moneda local y el template espera otra moneda.
- Solución: implantar un nodo de normalización que convierta todos los precios a la moneda del template usando un servicio de tipo FX con timestamp. Añadir tests que verifiquen redondeo y formato. Registrar currency_code en los metadatos del PDF.
- Error 3: Clausulas legales incorrectas según país
- Síntoma: la propuesta incluye cláusulas de otro país o una versión obsoleta.
- Causa: el flujo selecciona cláusulas basadas en un campo country vacío o con formato distinto; la librería de cláusulas no está versionada.
- Solución: validar la existencia y formato del campo client.country antes de seleccionar cláusulas; centralizar un índice de cláusulas con versionado y fecha de vigencia; persistir el id de cláusula usado en los metadatos.
- Error 4: Aprobación no recibida y propuesta bloqueada
- Síntoma: comerciales reportan que la propuesta queda en estado "Pending Approval" sin avanzar.
- Causa: notificación de aprobación enviada a canal equivocado, o el callback de aprobación no está configurado correctamente en n8n (endpoint de respuesta inválido).
- Solución: comprobar el endpoint de callback en el mensaje de aprobación; añadir logs detallados de envío y recepción; configurar reintentos y un canal de escalado (email a Director Comercial) si no hay respuesta en el SLA definido.
- Error 5: Permisos del archivo PDF incorrectos
- Síntoma: el comercial no puede acceder al PDF o el cliente recibe un enlace privado no accesible.
- Causa: al subir el archivo a Drive, no se asignaron permisos o se generó un enlace público por error.
- Solución: definir políticas de permisos por carpeta en Drive y automatizar asignación con la API. Para enlaces a clientes use links temporales con expiración y registre la política de acceso en el CRM. Añadir pruebas de acceso tras la generación para validar permisos.
Adaptaciones del flujo para otros contextos
El flujo básico puede adaptarse a múltiples escenarios comerciales con cambios menores en nodos y reglas de negocio. A continuación, variantes prácticas y cómo implementarlas:
- RFPs y respuestas a licitaciones: agregar un módulo de recolección de documentos adicionales y checklist de cumplimiento. En n8n, añada un nodo que adjunte anexos (especificaciones técnicas) y un paso de validación de criterios obligatorios. Ejemplo: la consultora Grupo Mercadia añade un nodo de almacenamiento S3 para anexos y un nodo de validación que marca la respuesta como "Completa" o "Incompleta" según criterios.
- Generación masiva de ofertas (batch): ejecutar el flujo en modo batch leyendo un CSV con múltiples deals. Use Read Binary File / SplitInBatches en n8n y limite concurrencia para no alcanzar límites API. Ideal para campañas comerciales estacionales.
- Propuestas con múltiples firmas: integre el proveedor de firma electrónica tras la generación del PDF. Añada nodo "Send for Signature" y maneje callbacks de firma completada para actualizar el status en el CRM a "Signed".
- Presupuestos internos o órdenes de compra: ajuste la plantilla y reglas de negocio para incluir centros de coste y cuentas contables; envíe copia al ERP mediante API para generar orden de compra automática si la propuesta es aceptada.
- Workflows multi-idioma: mantenga plantillas por idioma y seleccione la plantilla según campo client.preferred_language. Añada un catálogo de traducciones para todas las etiquetas fijas y cláusulas.
Ejemplo concreto de adaptación
InnovaCloud implementa una variante para respuestas a RFP: al recibir un deal con tag "RFP", el flujo adjunta al PDF el dossier técnico (almacenado en S3), ejecuta validaciones de compliance y envía la propuesta al pipeline de revisión técnica antes de la generación final. Se añade un nodo "Wait" con tiempo máximo para revisión técnica (72h) y un escalado automático si no hay respuesta.
¿Qué hacer ahora?
Pasos inmediatos recomendados para desplegar el flujo en producción:
- Validar prerrequisitos: confirme acceso API del CRM, credenciales de Google Drive y plantilla maestra. Utilice el checklist del apartado "Prerrequisitos".
- Diseñar la plantilla maestra con Legal y RevOps: defina marcadores y versión. Suba la plantilla y documente el Template ID ([TEMPLATE_DOC_ID]).
- Configurar entorno de staging en n8n y desplegar el webhook: Webhook Path = /webhook/generate-proposal ; Security: X-API-KEY = [WEBHOOK_API_KEY].
- Crear tests integrados: escenario mínimo (deal con cliente, 1 item), escenario con descuento que requiere aprobación y escenario con varias jurisdicciones.
- Plan de despliegue: lanzar en un equipo piloto (3-5 comerciales) por 2 semanas, recopilar métricas de tiempo y errores, ajustar reglas de negocio y desplegar al resto del equipo.
Prompts y ejemplos listos para usar
Webhook URL para configurar en el CRM (copiable):
https://[N8N_HOST]/webhook/generate-proposalPayload de ejemplo que el CRM debe enviar (copiable):
{ "dealId": "[DEAL_ID]", "requestedBy": "[USER_EMAIL]", "triggerSource": "crm_button"}Fragmento de Function node para validar campos obligatorios (copiable):
const deal = $json["deal"]; const required = ["client.name","client.country","items","currency"]; const missing = required.filter(path => { const parts = path.split('.'); let v = deal; for (const p of parts) { if (!v || !Object.prototype.hasOwnProperty.call(v,p)) return true; v = v[p]; } return false; }); if (missing.length) throw new Error('Faltan campos obligatorios: ' + missing.join(', ')); return items; Checklist rápido para solicitud de aprobación (copiable para Slack):
Propuesta [DEAL_ID] para [CLIENT_NAME]: Descuento [DISCOUNT_RATE]% > [DISCOUNT_THRESHOLD]%. Necesita aprobación. Link: [PROPOSAL_URL] Aprobar: https://[N8N_HOST]/approve/[DEAL_ID]?token=[TOKEN]Si necesita, le ayudo a generar el flujo n8n paso a paso en su entorno de staging y a definir las reglas de negocio en un workshop de 2 horas con Legal y Dirección Comercial.