# Factronics USA — Blueprint Operativo de Agentes IA **Proyecto:** Ecosistema Hermes para Factronics USA / FACCA **Stack base:** Hostinger VPS → Coolify → n8n → Hermes (Claude API) → QuickBooks Desktop Bridge **Versión QB:** QuickBooks Desktop 2024 Manufacturing Edition **Fecha:** Junio 2026 --- ## 1. Visión General de la Arquitectura ``` ┌─────────────────────────────────────────────────────────────────┐ │ HOSTINGER VPS │ │ (Coolify orquesta todo) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ n8n │ │ Hermes API │ │ RAG Service │ │ │ │ (Workflows) │──▶│ (Orchestrator│──▶│ (Conocimiento │ │ │ │ │ │ + Agents) │ │ Factronics) │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────────────┘ │ │ │ │ │ │ ┌──────▼───────┐ ┌──────▼───────┐ ┌──────────────────┐ │ │ │ PostgreSQL │ │ Redis │ │ Control Panel │ │ │ │ (Estado, │ │ (Colas, │ │ (Dashboard │ │ │ │ logs) │ │ sessions) │ │ Jovan) │ │ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ └─────────────────────────────┬───────────────────────────────────┘ │ HTTPS / Cloudflare Tunnel ▼ ┌─────────────────────────────────────────────────────────────────┐ │ INFRAESTRUCTURA LOCAL FACTRONICS (Medley, FL) │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ QB BRIDGE SERVICE (Python + QBFC SDK) │ │ │ │ QuickBooks Desktop 2024 Manufacturing Edition │ │ │ │ Puerto local: 8765 │ Auth: token rotativo │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ │ ┌───────────────────┼───────────────────┐ ▼ ▼ ▼ Gmail API HubSpot API Slack API (accounting@ (CRM sync, (Notificaciones jovan.gutic@) pipelines) al equipo) ``` --- ## 2. Stack Tecnológico — Configuración por Componente ### 2.1 Infraestructura Cloud — Hostinger VPS **Plataforma elegida:** Hostinger VPS + Coolify (justificación: costo-eficiencia, control total, familiaridad del equipo) ``` Plan: KVM 2 o superior RAM: 8 GB mínimo (16 GB ideal) CPU: 4 vCPUs Storage: 100 GB SSD OS: Ubuntu 22.04 LTS IP: IP estática ``` **Servidor local dedicado (Factronics — Medley, FL):** - Máquina Windows Server 2022 o Windows 11 Pro dedicada exclusivamente a QuickBooks Desktop 2024 Premier Manufacturing Edition - Debe permanecer encendida durante horas laborales (L-V 7:00 AM — 7:00 PM ET) - Conexión a internet estable (mínimo 10 Mbps simétricos) - QB Web Connector se ejecuta como servicio Windows en esta máquina - Esta máquina NO necesita IP pública — el QBWC inicia la comunicación saliente hacia el SOAP endpoint en el VPS ### 2.2 Coolify — Plataforma de Despliegue **Instalación:** ```bash curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash ``` **Servicios a desplegar en Coolify:** | Servicio | Tipo | Puerto interno | Dominio sugerido | |---|---|---|---| | n8n | Docker container | 5678 | n8n.factronic-ops.com | | Hermes API | Docker container | 8000 | api.factronic-ops.com | | Control Panel | Docker container | 3000 | ops.factronic-ops.com | | PostgreSQL | Database | 5432 | interno | | Redis | Database | 6379 | interno | **Variables de entorno globales en Coolify:** ```env ANTHROPIC_API_KEY=sk-ant-... OPENAI_API_KEY=sk-proj-... # Para OpenAI Assistants API (Custom GPTs) OPENAI_ORGANIZATION=org-... # Si aplica GMAIL_CLIENT_ID=... GMAIL_CLIENT_SECRET=... GMAIL_REFRESH_TOKEN_JOVAN=... GMAIL_REFRESH_TOKEN_ACCOUNTING=... SLACK_BOT_TOKEN=xoxb-... SLACK_CHANNEL_OPS=#ops-hermes HUBSPOT_API_KEY=... HUBSPOT_APP_ID=... QBWC_SOAP_USERNAME=hermes # Credenciales para QB Web Connector QBWC_SOAP_PASSWORD=... # QBWC las necesita para autenticar el polling POSTGRES_URL=postgresql://hermes:xxx@postgres:5432/hermes REDIS_URL=redis://redis:6379 ``` --- ### 2.3 QuickBooks Web Connector — Puente Oficial con QB Desktop **Qué es:** Intuit QuickBooks Web Connector (QBWC) es la herramienta oficial y soportada por Intuit para integrar QuickBooks Desktop con aplicaciones web. Es un servicio Windows que corre en la misma máquina donde está instalado QuickBooks y **polling periódicamente** un endpoint SOAP alojado en la nube para recibir y ejecutar instrucciones QBXML. **Ventajas sobre un bridge custom:** - Sin dependencias de pywin32, COM objects o hacks de interoperabilidad - Soportado oficialmente por Intuit (no se rompe con actualizaciones de QB) - Sin necesidad de exponer puertos locales ni Cloudflare Tunnel (comunicación saliente) - Manejo nativo de la cola de trabajos y reintentos - Autenticación incorporada por archivo de configuración **Arquitectura:** ``` ┌─────────────────────────────────────────┐ ┌──────────────────────────────┐ │ SERVIDOR LOCAL FACTRONICS (Windows) │ │ HOSTINGER VPS (Cloud) │ │ │ │ │ │ QuickBooks Desktop 2024 Premier ME │ │ Hermes API │ │ ↑ (QBXML vía COM) │ │ │ │ │ ↑ │ │ │ POST /qbwc (SOAP) │ │ QB Web Connector (Windows Service) │─────│ │ │ │ Polls cada 60 segundos │ │ │ Encola trabajos QBXML │ │ Autenticación: usuario/contraseña │ │ │ │ │ No necesita inbound ports │ │ PostgreSQL │ │ No necesita Cloudflare Tunnel │ │ └── qbwc_jobs_queue │ └─────────────────────────────────────────┘ └──────────────────────────────┘ ``` **Cómo funciona el flujo:** ``` 1. Hermes procesa una PO y genera el QBXML para crear una Sales Order Draft 2. Hermes guarda el trabajo en PostgreSQL: INSERT INTO qbwc_jobs_queue (...) 3. QB Web Connector (en la PC de Factronics) hace polling al endpoint: POST https://api.factronic-ops.com/qbwc con autenticación básica (QBWC_SOAP_USERNAME / QBWC_SOAP_PASSWORD) 4. El endpoint SOAP de Hermes revisa la cola y devuelve el QBXML pendiente 5. QBWC ejecuta el QBXML contra QuickBooks Desktop 6. QBWC envía la respuesta (éxito/error + datos) de vuelta al endpoint SOAP 7. Hermes actualiza el estado del trabajo en PostgreSQL 8. Slack: notificación a Jovan del resultado ``` **Endpoint SOAP que debe exponer Hermes:** ``` POST /qbwc — Endpoint SOAP que QBWC consulta periódicamente Recibe: QBWC authentication + empty request Responde: QBXML de la próxima tarea pendiente (o vacío si no hay nada) Callback: QBWC envía el resultado de la ejecución QBXML ``` **Configuración del QBWC en la máquina local (archivo .QWC):** ```xml Hermes Factronics Integration factronics-hermes-001 https://api.factronic-ops.com/qbwc Integración automática POs → Sales Orders vía Hermes AI mailto:support@coordenadas.agency hermes {00000000-0000-0000-0000-000000000001} {00000000-0000-0000-0000-000000000002} QBFS false false ``` **Setup en la máquina local de Factronics:** ```bash # 1. Descargar QB Web Connector desde Intuit # https://developer.intuit.com/app/developer/qbdesktop/download-qbwc # 2. Instalar QBWC en el servidor Windows dedicado # 3. Copiar archivo hermes_factronics.qwc a la máquina # 4. Hacer doble clic en .QWC → QBWC lo registra automáticamente # 5. Probar conexión: QBWC muestra "Connected" para la app Hermes ``` **Base de datos — Cola de trabajos QBWC:** ```sql CREATE TABLE qbwc_jobs_queue ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), job_type VARCHAR(50) NOT NULL, -- 'sales_order_draft'|'customer_query'|'item_query' qbxml_request TEXT NOT NULL, -- QBXML a ejecutar status VARCHAR(20) DEFAULT 'pending', -- 'pending'|'in_progress'|'completed'|'failed' qbxml_response TEXT, -- QBXML respuesta de QB error_message TEXT, source_ref TEXT, -- email_id, po_number, etc. completed_at TIMESTAMPTZ, retry_count INTEGER DEFAULT 0, max_retries INTEGER DEFAULT 3 ); ``` **CRÍTICO — QuickBooks debe estar abierto** para que QBWC funcione. La máquina servidor dedicada debe permanecer encendida con QB abierto durante horas laborales. --- ### 2.4 Hermes API — El Orquestador Central **Descripción:** Hermes es el cerebro del sistema. Es una API FastAPI en Python que recibe instrucciones de n8n, decide qué agente activar, llama a Claude API con el contexto correcto, y devuelve acciones estructuradas. **Estructura de archivos:** ``` hermes-api/ ├── main.py # FastAPI app, rutas principales ├── agents/ │ ├── accounting.py # Agente Contable (PO → QB via QBWC) │ ├── inbox.py # Agente de Inbox (triaje + borradores + HubSpot) │ ├── operations.py # Agente Operativo (tareas vía API externa) │ └── onboarding.py # Agente de Onboarding (ex-Tax Exemptions) ├── tools/ │ ├── qbwc.py # QB Web Connector — SOAP endpoint + job queue │ ├── gmail.py # Cliente Gmail API │ ├── hubspot.py # Cliente HubSpot (CRUD + sentiment + deal progression) │ ├── slack.py # Notificaciones Slack │ ├── assistants.py # OpenAI Assistants API (Custom GPTs de Factronics) │ └── pdf_extractor.py # Extracción de PDFs via Claude ├── prompts/ # Prompts por agente │ ├── accounting.txt │ ├── inbox_triage.txt │ ├── inbox_draft.txt │ ├── operations.txt │ └── onboarding.txt ├── models/ │ ├── purchase_order.py # Schema PO extraída │ ├── sales_order.py # Schema Sales Order QB │ ├── email_triage.py # Schema clasificación inbox + HubSpot │ └── onboarding.py # Schema formulario de onboarding ├── db/ │ ├── audit_log.py # Log inmutable de acciones │ ├── job_queue.py # Cola de trabajos QBWC │ └── onboarding_queue.py # Cola de onboarding pendientes ├── Dockerfile ├── requirements.txt └── config.py ``` **Endpoints principales de Hermes:** ``` POST /agents/accounting/process-po → Procesar PO adjunta POST /agents/inbox/triage → Clasificar email entrante POST /agents/inbox/draft-reply → Generar borrador de respuesta POST /agents/operations/update-tasks → Actualizar estado de tareas POST /agents/onboarding/start → Iniciar onboarding de cliente POST /agents/onboarding/process-forms → Procesar formularios recibidos GET /jobs/{job_id} → Estado de trabajo asíncrono GET /audit-log → Log de todas las acciones GET /health → Health check ``` --- ### 2.5 OpenAI Assistants API — Base de Conocimiento Factronics **Descripción:** En lugar de construir y mantener una base de datos vectorial propia (RAG), Hermes se integra con los **Custom GPTs** que Factronics ya tiene entrenados en ChatGPT. Estos asistentes contienen miles de documentos de soporte técnico, fichas de maquinaria, case studies y documentación de productos. Hermes los invoca vía OpenAI Assistants API cuando necesita contexto técnico o comercial. **Ventajas de esta estrategia:** - **Zero infraestructura RAG** — no hay que construir, mantener ni escalar una vector DB - **Aprovecha inversión existente** — Factronics ya invirtió en entrenar estos GPTs - **Zero Data Retention** — OpenAI Enterprise no retiene datos de las consultas - **Actualización inmediata** — Jovan puede actualizar los GPTs directamente sin involucrar al equipo técnico - **Costo predecible** — costo por consulta al Assistant, sin costos fijos de infraestructura **Arquitectura de integración:** ``` ┌─────────────────────────┐ │ Hermes API (Claude) │ │ │ │ "Necesito contexto │ │ técnico sobre Linx │ │ 9800 para responder │ │ este email..." │ └──────────┬──────────────┘ │ ┌──────────▼──────────────┐ │ OpenAI Assistants API │ │ │ │ Assistant: Soporte │ │ Técnico Linx │ │ ───────────────── │ │ Contiene: fichas │ │ técnicas, manuales, │ │ troubleshooting de │ │ toda la línea Linx │ │ │ │ Assistant: Comercial │ │ ──────────────── │ │ Contiene: case studies,│ │ email sequences, brand │ │ voice, playbook │ └─────────────────────────┘ ``` **Mapeo de Asistentes por contexto:** | Contexto de consulta | Assistant ID | Contenido | |---|---|---| | Soporte técnico Linx | `asst_linx_tech_support` | Fichas técnicas Linx 9800/9000, Iris, SureClean, troubleshooting | | Soporte técnico Anritsu | `asst_anritsu_tech` | Manuales, especificaciones, guías de instalación | | Consultas comerciales | `asst_factronics_commercial` | Case studies, positioning, email sequences, playbook | | Productos Variovac/JMK | `asst_packaging_equipment` | Especificaciones de maquinaria de empaque | **Implementación en Hermes API:** ```python # tools/assistants.py — Cliente para OpenAI Assistants API import openai class FactronicsAssistants: ASSISTANT_MAP = { "technical_linx": "asst_linx_tech_support", "technical_anritsu": "asst_anritsu_tech", "commercial": "asst_factronics_commercial", "packaging": "asst_packaging_equipment", } def query(self, context_type: str, question: str) -> str: assistant_id = self.ASSISTANT_MAP.get(context_type) if not assistant_id: return "" thread = openai.beta.threads.create() openai.beta.threads.messages.create( thread_id=thread.id, role="user", content=question ) run = openai.beta.threads.runs.create_and_poll( thread_id=thread.id, assistant_id=assistant_id ) messages = openai.beta.threads.messages.list(thread_id=thread.id) return messages.data[0].content[0].text.value ``` **Costo estimado:** ~$20-40/mes adicionales en API de OpenAI (dependiendo del volumen de consultas técnicas). Esto reemplaza el costo de infraestructura y mantenimiento de un RAG self-hosted. --- ### 2.6 n8n — Capa de Orquestación de Workflows **Descripción:** n8n es la capa que conecta los triggers del mundo real (email nuevo, PO recibida, tarea vencida) con los agentes de Hermes. No contiene lógica de negocio — solo enruta eventos. **Variables de entorno n8n en Coolify:** ```env N8N_BASIC_AUTH_ACTIVE=true N8N_BASIC_AUTH_USER=admin N8N_BASIC_AUTH_PASSWORD=... EXECUTIONS_DATA_SAVE_ON_ERROR=all EXECUTIONS_DATA_SAVE_ON_SUCCESS=all N8N_LOG_LEVEL=info WEBHOOK_URL=https://n8n.factronic-ops.com ``` --- ### 2.7 Control Panel — Dashboard para Jovan **Descripción:** Una interfaz web simple (Next.js o HTML estático) que muestra en tiempo real lo que hicieron los agentes, con acceso directo a cada borrador. **Vistas del panel:** ``` / → Resumen del día (POs procesadas, emails triados, alertas) /borradores → Lista de Sales Orders y facturas en Draft en QB /inbox → Borradores de email pendientes de revisión /alertas → Discrepancias de precio, certificados vencidos /audit → Log completo de acciones de todos los agentes /config → Activar/desactivar agentes (Kill Switch) ``` --- ## 3. Los 4 Agentes — Definición Completa --- ### AGENTE 1: Contador (QB Accounting Agent) **Prioridad:** CRÍTICA — Este es el POC **Tiempo estimado de build:** 3-4 semanas **Función:** Leer POs en PDF que llegan al inbox de `accounting@factronicsusa.com`, extraer los datos, cruzarlos con QB, y crear Sales Orders o Invoices en estado Draft. **Trigger en n8n:** ``` Gmail Trigger → accounting@factronicsusa.com Filtro: tiene adjunto PDF con palabras "Purchase Order" o "PO" en subject o cuerpo Frecuencia de polling: cada 5 minutos ``` **Flujo completo:** ``` 1. n8n detecta email con PDF adjunto 2. n8n llama POST /agents/accounting/process-po con: - email_id (Gmail) - pdf_base64 - sender_email - email_subject 3. Hermes / Agente Contable: a. Llama a Claude API con el PDF y prompt de extracción b. Claude extrae: {customer_id_or_name, po_number, items[], quantities[], unit_prices[], payment_terms, ship_to, requested_date} c. Valida customer_id contra QB Bridge GET /customers d. Para cada item, valida precio unitario contra QB Bridge GET /items/{code} SI precios coinciden (tolerancia ±2%): → Crea Sales Order Draft vía QB Bridge POST /sales-orders/draft → Slack: "✅ Sales Order Draft creada para [Cliente] | PO# [X] | $[Monto]" → Log en PostgreSQL: success SI hay discrepancia de precio: → NO crea la Sales Order → Genera borrador de email aclaratorio al cliente en Gmail Drafts → Slack: "⚠️ DISCREPANCIA en PO de [Cliente] | Precio PO: $X vs QB: $Y | Requiere autorización" → Log en PostgreSQL: pending_review 4. Actualiza Control Panel con resultado ``` **Prompt del Agente Contable (prompts/accounting.txt):** ``` Eres el asistente contable de Factronics USA, especialista en procesar órdenes de compra de clientes industriales. Tu tarea es extraer con PRECISIÓN ABSOLUTA los siguientes campos del PDF de PO: CAMPOS OBLIGATORIOS: - customer_name: Nombre exacto del cliente como aparece en el documento - po_number: Número de orden de compra - po_date: Fecha de la orden (formato YYYY-MM-DD) - requested_delivery_date: Fecha de entrega solicitada (si aplica) - line_items: Lista de items con: * item_code: Código de producto (si existe) * description: Descripción del producto * quantity: Cantidad (número exacto) * unit_price: Precio unitario (número exacto, sin símbolo $) * total_line: Total de la línea - subtotal: Subtotal antes de impuestos - tax_amount: Monto de impuestos (si aplica) - total_amount: Total de la orden - ship_to_address: Dirección de envío completa - billing_contact: Contacto de facturación si aparece - special_instructions: Cualquier nota especial o instrucción REGLAS CRÍTICAS: - NUNCA inventes o estimes un precio. Si no está claro, reporta null. - Si el documento está en inglés, devuelve los valores en su idioma original. - Los precios son siempre en USD. - Si hay múltiples páginas, procesa TODAS. - Responde ÚNICAMENTE en JSON válido, sin texto adicional. FORMATO DE RESPUESTA: { "customer_name": "", "po_number": "", "po_date": "", "requested_delivery_date": null, "line_items": [ { "item_code": null, "description": "", "quantity": 0, "unit_price": 0.00, "total_line": 0.00 } ], "subtotal": 0.00, "tax_amount": 0.00, "total_amount": 0.00, "ship_to_address": "", "billing_contact": null, "special_instructions": null, "confidence_score": 0.0 } El campo confidence_score va de 0 a 1. Si es menor a 0.85, incluye "uncertainty_notes" explicando qué campos no pudiste extraer con certeza. ``` **Casos de clientes principales a configurar en QB mapping:** ```python KNOWN_CUSTOMERS = { "National Steak Processors": "NSP", "NSP Quality Meats": "NSP", "Bauducco Foods": "BAUDUCCO", "Nestlé": "NESTLE", "B. Braun Medical": "BBRAUN", "Armor Iimak": "ARMOR", "Liberty Express": "LIBERTY", # Agregar todos los clientes recurrentes de QB } ``` --- ### AGENTE 2: Inbox Copilot (Email Intelligence Agent) **Prioridad:** ALTA — Build después del POC **Tiempo estimado de build:** 2-3 semanas adicionales **Función:** Leer emails entrantes en `jovan.gutic@factronicsusa.com`, clasificarlos por urgencia y tipo, y generar borradores de respuesta técnicamente precisos que queden en Gmail Drafts. **Trigger en n8n:** ``` Gmail Trigger → jovan.gutic@factronicsusa.com Polling: cada 10 minutos Excluir: newsletters, spam, notificaciones automáticas Incluir: emails de dominios de clientes conocidos o con palabras clave técnicas ``` **Clasificación de emails (taxonomy) + Acciones HubSpot:** ``` TIPO A — Técnico-Comercial: Subcategorías: cotización, comparación_competencia, soporte_técnico, viabilidad_equipo Acción: Borrador técnico usando OpenAI Assistants API (Custom GPTs de Factronics) Prioridad asignada: ALTA si menciona cliente enterprise (Nestlé, NSP, B.Braun) HubSpot: Actualizar deal existente o crear si es lead nuevo. Análisis de intención/sentimiento → Si intención de compra alta: avanzar deal a "Negotiation" en pipeline. → Si es consulta técnica: dejar en "Qualified" o mover a "Technical Evaluation". TIPO B — Administrativo-Operativo: Subcategorías: seguimiento_orden, estatus_entrega, factura, certificado_reventa Acción: Borrador administrativo + consulta QBWC Cache para datos reales Prioridad asignada: MEDIA HubSpot: Actualizar campo personalizado "last_activity" + nota de actividad TIPO C — Soporte Post-Venta: Subcategorías: falla_equipo, repuesto, mantenimiento, inkjet_consumible Acción: Borrador de soporte + búsqueda en OpenAI Assistant técnico (Linx/Anritsu) Prioridad asignada: ALTA (tiempo de respuesta crítico) HubSpot: Crear ticket de soporte en pipeline de servicio si corresponde TIPO D — Marketing/Prospecto: Subcategorías: lead_nuevo, solicitud_demo, cotización_inicial Acción: Borrador de bienvenida + crear contacto en HubSpot automáticamente Prioridad asignada: MEDIA HubSpot: Crear contacto con campos: email, empresa, teléfono, fuente = "Hermes AI" → Poblar campo personalizado "sentiment_score" del análisis → Crear Deal en etapa "New" con monto estimado si aplica → Si sentiment/urgency es alto: asignar prioridad al lead TIPO X — No requiere respuesta del agente: Subcategorías: notificación_interna, confirmación_envío, newsletter Acción: Solo clasificar y archivar, no generar borrador HubSpot: Sin acción ``` **Prompt del Agente Inbox — Clasificación (prompts/inbox_triage.txt):** ``` Eres el asistente de Jovan Gutic, CEO de Factronics USA, empresa especializada en equipos de codificación, marcado, inspección y empaque industrial en el sureste de EE.UU. Analiza el siguiente email y devuelve ÚNICAMENTE JSON con esta estructura: { "type": "A|B|C|D|X", "subtype": "", "priority": "HIGH|MEDIUM|LOW", "sender_is_client": true/false, "client_name": null, "summary_one_line": "", "key_questions": [], "requires_technical_knowledge": true/false, "requires_qb_lookup": true/false, "suggested_response_language": "es|en", "confidence": 0.0, "hubspot": { "sentiment_score": 0.0, "buying_intent": "none|low|medium|high", "urgency": "none|low|medium|high", "suggested_deal_stage": null, "create_contact": true/false, "company_name": null, "contact_email": null, "contact_phone": null } } CAMPOS DE SENTIMIENTO E INTENCIÓN: - sentiment_score: -1.0 (muy negativo) a +1.0 (muy positivo). Mide el tono del email. - buying_intent: Qué tan cerca está de una compra. "high" si pide cotización con detalles técnicos específicos y plazos. "low" si es consulta genérica. - urgency: "high" si menciona fechas límite, producción detenida, emergencias. - suggested_deal_stage: null | "New" | "Qualified" | "Technical Evaluation" | "Negotiation" | "Closed Won" | "Closed Lost" - create_contact: true si el remitente NO está en HubSpot (es un lead nuevo) REGLAS DE AUTONOMÍA: - Si buying_intent = "high" AND urgency = "high" → suggested_deal_stage = "Negotiation" - Si buying_intent = "medium" AND requiere contexto técnico → "Technical Evaluation" - Si es lead nuevo con datos de empresa → create_contact = true - NUNCA mover a "Closed Won" o "Closed Lost" sin múltiples confirmaciones CONTEXTO DE FACTRONICS: - Clientes enterprise: Nestlé, NSP (National Steak Processors), B. Braun Medical, Bauducco Foods - Productos: Linx CIJ/TTO/Laser, Anritsu X-Ray/Metal Detector/Checkweigher, Variovac Thermoformer, JMK VFFS/Case Sealer - Competidores principales: Tecnifar, Markem-Imaje, Videojet, Domino - El CEO habla español e inglés; con clientes latinoamericanos siempre en español ``` **Prompt del Agente Inbox — Generación de Borrador (prompts/inbox_draft.txt):** ``` Eres el asistente ejecutivo de Jovan Gutic, CEO de Factronics USA. Tu rol es redactar borradores de respuesta que Jovan revisará y enviará. ESTILO DE COMUNICACIÓN DE JOVAN: - Directo, técnico y confiable - Nunca hace promesas que no puede cumplir - Usa frases cortas en conversaciones cotidianas - En propuestas técnicas, es detallado y preciso - Tono cálido con clientes de largo plazo - Nunca critica directamente a la competencia — muestra superioridad técnica con datos REGLAS ABSOLUTAS: - NUNCA envíes el email — solo crea el BORRADOR en Gmail Drafts - NUNCA inventes especificaciones técnicas. Si no lo sabes, deja [VERIFICAR] en rojo - NUNCA menciones precios sin consultar la base de datos actualizada - Si el email es de un cliente enterprise (Nestlé, B. Braun, NSP), el borrador debe ser más formal y revisado dos veces antes de sugerir envío - Siempre termina el borrador con la firma estándar de Jovan FIRMA ESTÁNDAR: --- Jovan Gutic CEO | Factronics USA 📞 [teléfono] 📧 jovan.gutic@factronicsusa.com 🌐 factronicsusa.com Medley, FL 33178 --- CONTEXTO TÉCNICO DISPONIBLE: {assistants_context} EMAIL A RESPONDER: {email_thread} CLASIFICACIÓN PREVIA: {triage_result} ACCIONES HUBSPOT A EJECUTAR (si aplican): {hubspot_actions} Genera el borrador de respuesta completo, listo para que Jovan lo revise. ``` --- ### AGENTE 3: Operations Supervisor (Internal Task Agent via API) **Prioridad:** MEDIA — Build en Mes 2-3 **Tiempo estimado de build:** 2 semanas **Función:** Auditar vía API la plataforma de gestión de tareas que Factronics ya utiliza (Airtable, ClickUp o Trello), monitorear el avance del equipo de ingeniería (JMK Robotics) y administración regional (FACCA Caracas), enviar alertas en Slack cuando hay cuellos de botella, y generar resumen diario para Jovan. **Fuentes de datos:** ``` - API de Airtable/ClickUp/Trello (la que Factronics tenga activa) → Tabla/Lista de tareas con responsables, fechas y estados - HubSpot: Deals en etapa "Installation" o "Service" activos - Slack: Canal #operaciones (mensajes sin respuesta) ``` **Trigger en n8n:** ``` Schedule Trigger: - Lunes-Viernes 8:00 AM: Resumen de estado del día - Lunes-Viernes 5:00 PM: Reporte de cierre del día - Cada hora: Scan de tareas vencidas o en riesgo ``` **Flujo del resumen diario:** ``` 1. n8n trigger a las 8 AM 2. Hermes / Agente Operativo: a. Consulta API de Airtable/ClickUp/Trello: tareas con due_date <= hoy AND status != "done" b. Consulta HubSpot: deals en stage "Installation" o "Service" activos c. Consulta Slack: mensajes sin respuesta en #operaciones de las últimas 24h d. Genera resumen con Claude 3. Slack: Envía resumen al canal #ops-jovan con: - ✅ Tareas completadas ayer - 🔴 Tareas vencidas hoy - ⚠️ Tareas en riesgo (vencen en 48h) - 📋 Deals activos en campo ``` **Implementación — tools/task_platform.py:** ```python class TaskPlatformClient: """ Cliente genérico para Airtable / ClickUp / Trello. Se configura por variable de entorno TASK_PLATFORM_TYPE. """ def get_tasks(self, filters: dict) -> list: # GET /api/v1/tasks con filtros por fecha, estado, equipo pass def update_task(self, task_id: str, data: dict) -> bool: # PATCH /api/v1/tasks/{id} (para que Hermes pueda actualizar # estados automáticamente si se confirma finalización) pass ``` **Estructura esperada de la tabla de tareas (API-driven):** ``` Campos obligatorios en la plataforma: - task_id (auto) - description - assigned_to (email del responsable) - team (JMK | FACCA | Medley) - deal_id (HubSpot, opcional) - due_date (ISO 8601) - status (enum: pending | in_progress | blocked | done) - priority (enum: high | medium | low) - notes (texto libre) - last_updated (timestamp) ``` **Prompt del Agente Operativo:** ``` Eres el supervisor de operaciones de Factronics USA. Tu trabajo es analizar el estado actual de las tareas del equipo (obtenidas via API desde una plataforma de gestión de proyectos) y generar un reporte ejecutivo claro para el CEO Jovan Gutic. El reporte debe ser conciso, accionable y en español. Formato: mensaje de Slack (máximo 500 caracteres por sección). Usa estos emojis para el status: ✅ Completado 🔴 Vencido/Bloqueado ⚠️ En riesgo 🔵 En progreso 📋 Pendiente DATA: {task_data} {hubspot_active_deals} {slack_pending_messages} ``` --- ### AGENTE 4: Onboarding Automático (Client Onboarding Agent) **Prioridad:** MEDIA — Build en Mes 3 **Tiempo estimado de build:** 2 semanas **Función:** Automatizar el flujo de onboarding de nuevos clientes. Cuando un prospecto avanza a la etapa de cliente en HubSpot, el agente detona el envío de formularios de registro, extrae los datos de las planillas recibidas, realiza una verificación básica en web pública, e incorpora la información depurada en QuickBooks Desktop vía QBWC. **Trigger en n8n:** ``` HubSpot Webhook: Deal stage changes to "Closed Won" o "Client Onboarding" ``` **Flujo completo de onboarding:** ``` 1. TRIGGER: HubSpot deal cambia a etapa "Closed Won" o "Client Onboarding" → n8n captura el webhook y llama a Hermes 2. HERMES / Agente de Onboarding: a. ENVÍO DE FORMULARIOS: - Genera email con formulario de registro (PDF adjunto o link a formulario web tipo Airtable/Typeform) - Envía el email al contacto principal del cliente - Slack: "📋 Formulario de onboarding enviado a [Cliente]" - Crea registro en onboarding_queue con status "awaiting_forms" b. RECEPCIÓN DE FORMULARIOS (email entrante con PDF adjunto): - Detecta email con "onboarding" o "registration" en subject - Extrae datos del PDF usando Claude API: * company_name, legal_name, tax_id (EIN) * physical_address, shipping_address * resale_certificate_number (si aplica) * resale_certificate_expiry (si aplica) * payment_terms, credit_limit (si negociado) * contacts: billing, operations, purchasing c. VERIFICACIÓN BÁSICA EN WEB: - Busca el nombre de la empresa + "resale certificate" en web pública - Verifica que el tax_id (EIN) está en formato válido - Si es certificado de reventa de Florida: busca en https://services.floridatax.com/file/search (verificación estándar que no requiere manejo de CAPTCHA complejos) - Asigna confidence_score a la verificación d. CREACIÓN EN QUICKBOOKS VIA QBWC: - Prepara QBXML para crear el Customer en QB con: * Nombre legal, dirección, términos de pago * Resale certificate info (si aplica) - Encola en qbwc_jobs_queue para que QBWC lo ejecute - Slack: "✅ Cliente [Nombre] creado en QB | Confianza: [score]" e. ACTUALIZACIÓN EN HUBSPOT: - Actualiza campos personalizados en HubSpot: * "qb_customer_id" → ID de QB * "onboarding_status" → "completed" * "resale_certificate" → archivo adjunto o link * "onboarding_date" → fecha de hoy - Mueve el deal a etapa "Onboarding Complete" f. SI HAY DISCREPANCIAS O BAJA CONFIANZA: - NO crea el cliente en QB automáticamente - Genera borrador de email a contabilidad con la discrepancia - Slack: "⚠️ Onboarding de [Cliente] requiere revisión — discrepancia en [campo]" - Deja en onboarding_queue con status "pending_review" 3. FIN: Cliente activo en QB + HubSpot actualizado + Slack notificado ``` **Estructura de la cola de onboarding:** ```sql CREATE TABLE onboarding_queue ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), hubspot_deal_id VARCHAR(50), company_name VARCHAR(200), contact_email VARCHAR(200), status VARCHAR(20) DEFAULT 'forms_sent', -- 'forms_sent'|'forms_received'|'verified'|'qb_created'| -- 'completed'|'pending_review'|'failed' form_data JSONB, -- Datos extraídos del PDF verification JSONB, -- Resultado de verificación web qb_customer_id VARCHAR(50), -- ID creado en QB confidence DECIMAL(3,2), reviewed_at TIMESTAMPTZ, notes TEXT ); ``` **Prompt del Agente de Onboarding (prompts/onboarding.txt):** ``` Eres el agente de onboarding de Factronics USA. Tu trabajo es guiar a nuevos clientes desde que cierran el trato en HubSpot hasta que están activos en QuickBooks. TUS TAREAS SON: 1. Enviar formularios de registro al nuevo cliente 2. Extraer datos de los formularios recibidos (PDF) 3. Verificar la información en fuentes públicas 4. Crear el cliente en QuickBooks a través del QB Web Connector 5. Actualizar HubSpot con los resultados REGLAS CRÍTICAS: - Nunca crees un cliente en QB sin verificar que los datos son correctos - Si el confidence_score de extracción del PDF es < 0.85, pasa a revisión humana - Si el tax_id (EIN) no tiene formato válido (XX-XXXXXXX), marca como sospechoso - Los resale certificates de Florida se verifican contra el portal público - Siempre actualiza HubSpot con el QB Customer ID después de crear FORMATO DE RESPUESTA: { "action": "send_forms|process_forms|request_review|complete", "form_data": {...}, "verification_score": 0.0, "needs_human_review": false, "review_reason": null, "qb_customer_id": null } ``` --- ## 4. Workflows de n8n — Configuración Detallada ### WF-001: PO Processing (Trigger → Accounting Agent) ``` [Gmail Trigger] ↓ Filtro: has_attachment=true AND (subject CONTAINS "PO" OR "Purchase Order") ↓ Get attachment (PDF base64) [HTTP Request] ↓ POST https://api.factronic-ops.com/agents/accounting/process-po ↓ Headers: Authorization: Bearer {QB_BRIDGE_TOKEN} ↓ Body: {email_id, pdf_base64, sender, subject} [IF: response.status = "success"] ↓ TRUE → Slack: "✅ Sales Order Draft creada | {customer} | ${amount}" ↓ FALSE → IF: response.status = "price_discrepancy" ↓ Slack: "⚠️ Discrepancia de precio | {customer} | Requiere revisión" ↓ HTTP: Crear Gmail Draft con borrador aclaratorio [Postgres: Insert audit_log] ``` ### WF-002: Inbox Triage (Trigger → Inbox Agent) ``` [Gmail Trigger] → jovan.gutic@factronicsusa.com ↓ Filtro: NOT from:noreply* AND NOT label:processed-by-hermes [HTTP Request] → POST /agents/inbox/triage ↓ Body: {email_id, from, subject, body_preview, has_attachment} [IF: triage.type != "X"] ↓ HTTP Request → POST /agents/inbox/draft-reply ↓ Body: {email_id, triage_result, thread_context} [Gmail: Create Draft] ↓ draft_id, reply_to_thread_id [Gmail: Add label "processed-by-hermes"] [IF: triage.priority = "HIGH" AND triage.sender_is_client = true] ↓ Slack: "📧 Email ALTO de {sender} | {summary} | Borrador listo en Gmail" [Postgres: Insert audit_log] ``` ### WF-003: Daily Operations Report ``` [Schedule: 8:00 AM Mon-Fri] [HTTP Request] → GET [Airtable/ClickUp/Trello API]/tasks?filter=due_today_or_overdue [HubSpot: Get deals in stage "Installation", "Service Active"] [Slack: Get pending messages from #operaciones (24h)] [HTTP Request] → POST /agents/operations/daily-summary [Slack: Post to #ops-jovan] ``` ### WF-004: Client Onboarding Flow ``` [HubSpot Webhook: Deal stage = "Closed Won" OR "Client Onboarding"] ↓ [HTTP Request] → POST /agents/onboarding/start ↓ Body: {deal_id, company_name, contact_email, contact_name} ↓ [IF: response.action = "send_forms"] ↓ Gmail: Send registration form email to client ↓ Slack: "📋 Formulario de onboarding enviado a [Cliente]" ↓ PostgreSQL: Insert onboarding_queue (status: forms_sent) [OR: HubSpot Webhook: Email received with attachment "onboarding"] ↓ [HTTP Request] → POST /agents/onboarding/process-forms ↓ Body: {email_id, pdf_base64, onboarding_queue_id} ↓ [IF: response.needs_human_review = false] ↓ QBWC Queue: Create customer in QB ↓ HubSpot: Update deal stage + custom fields ↓ Slack: "✅ Cliente [Nombre] creado en QB | Onboarding completo" [IF: response.needs_human_review = true] ↓ Gmail: Draft email to accounting about discrepancy ↓ Slack: "⚠️ Onboarding de [Cliente] requiere revisión" [Postgres: Insert audit_log] ``` ### WF-005: Kill Switch (Emergency Stop) ``` [Webhook Trigger: POST /killswitch] ↓ Auth: admin token requerido [Code Node: Set all agents status = DISABLED in PostgreSQL] [Remove Gmail Triggers (deactivate WF-001 y WF-002)] [Slack: "🛑 Sistema Hermes DETENIDO por {user} a las {time}"] ``` --- ## 5. Base de Datos — Esquema PostgreSQL ```sql -- Tabla principal de audit log (inmutable) CREATE TABLE audit_log ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), agent VARCHAR(50) NOT NULL, -- 'accounting'|'inbox'|'operations'|'onboarding' workflow VARCHAR(50) NOT NULL, action VARCHAR(100) NOT NULL, input_ref TEXT, -- email_id, pdf_filename, etc. output_ref TEXT, -- qb_sales_order_id, gmail_draft_id, etc. status VARCHAR(20) NOT NULL, -- 'success'|'error'|'pending_review'|'discrepancy' confidence DECIMAL(3,2), error_message TEXT, metadata JSONB ); -- Cola de trabajos pendientes de revisión humana CREATE TABLE pending_review ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), reviewed_at TIMESTAMPTZ, reviewed_by VARCHAR(100), agent VARCHAR(50) NOT NULL, review_type VARCHAR(50) NOT NULL, -- 'price_discrepancy'|'low_confidence'|'unknown_customer'|'onboarding_verification' input_data JSONB NOT NULL, suggested_action JSONB, status VARCHAR(20) DEFAULT 'pending', -- 'pending'|'approved'|'rejected' notes TEXT ); -- Estado de agentes (para kill switch y monitoring) CREATE TABLE agent_status ( agent_name VARCHAR(50) PRIMARY KEY, enabled BOOLEAN DEFAULT TRUE, last_run TIMESTAMPTZ, last_success TIMESTAMPTZ, error_count_24h INTEGER DEFAULT 0, updated_at TIMESTAMPTZ DEFAULT NOW() ); -- Cola de onboarding de nuevos clientes CREATE TABLE onboarding_queue ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), hubspot_deal_id VARCHAR(50), company_name VARCHAR(200), contact_email VARCHAR(200), status VARCHAR(20) DEFAULT 'forms_sent', -- 'forms_sent'|'forms_received'|'verified'|'qb_created'| -- 'completed'|'pending_review'|'failed' form_data JSONB, verification JSONB, qb_customer_id VARCHAR(50), confidence DECIMAL(3,2), reviewed_at TIMESTAMPTZ, notes TEXT ); -- Cola de trabajos QB Web Connector (polling desde la PC de Factronics) CREATE TABLE qbwc_jobs_queue ( id BIGSERIAL PRIMARY KEY, created_at TIMESTAMPTZ DEFAULT NOW(), job_type VARCHAR(50) NOT NULL, -- 'sales_order_draft'|'customer_create'|'customer_query'|'item_query' qbxml_request TEXT NOT NULL, status VARCHAR(20) DEFAULT 'pending', -- 'pending'|'in_progress'|'completed'|'failed' qbxml_response TEXT, error_message TEXT, source_ref TEXT, completed_at TIMESTAMPTZ, retry_count INTEGER DEFAULT 0, max_retries INTEGER DEFAULT 3 ); -- Cache de clientes QB (sincronizado diariamente) CREATE TABLE qb_customers_cache ( qb_id VARCHAR(50) PRIMARY KEY, name VARCHAR(200), email VARCHAR(200), payment_terms VARCHAR(50), tax_exempt BOOLEAN DEFAULT FALSE, last_synced TIMESTAMPTZ DEFAULT NOW() ); -- Cache de items/productos QB (sincronizado diariamente) CREATE TABLE qb_items_cache ( qb_id VARCHAR(50) PRIMARY KEY, item_code VARCHAR(50), description TEXT, unit_price DECIMAL(12,2), sales_price DECIMAL(12,2), is_active BOOLEAN DEFAULT TRUE, last_synced TIMESTAMPTZ DEFAULT NOW() ); ``` --- ## 6. Plan de Ejecución por Semanas ``` SEMANA 1-2: FOUNDATION (No hay agente sin esto) ──────────────────────────────────────────────── □ Hostinger VPS: Ubuntu 22.04, IP estática configurada □ Coolify instalado y funcionando □ PostgreSQL desplegado en Coolify con esquemas creados (incluyendo qbwc_jobs_queue y onboarding_queue) □ Redis desplegado en Coolify □ Cloudflare configurado (dominio factronic-ops.com o similar) □ n8n desplegado en Coolify, accesible en dominio □ Gmail API: OAuth configurado para accounting@ y jovan.gutic@ □ Slack API: Bot creado, token activo, canal #ops-hermes creado □ OpenAI API: Cuenta activa, Custom GPTs de Factronics mapeados con Assistant IDs □ Jovan confirma: plataforma de tareas operativa (Airtable/ClickUp/Trello) y comparte API key □ Jovan confirma: servidor Windows dedicado para QB listo □ QB Web Connector descargado y listo para instalar en Semana 2 ENTREGABLE SEMANA 2: Hostinger + Coolify + n8n + PostgreSQL operativos. Canal #ops-hermes en Slack recibiendo mensajes de prueba. SEMANA 3: QB WEB CONNECTOR + SETUP LOCAL ─────────────────────────────────────────── □ Instalar QB Web Connector en servidor Windows dedicado de Factronics □ Hermes API: implementar endpoint SOAP /qbwc □ Configurar archivo .QWC y registrar app en QBWC □ Probar polling: QBWC → Hermes SOAP → respuesta QBXML vacía □ Probar QBXML de consulta: GET /customers (QBWC devuelve lista real) □ Probar QBXML de consulta: GET /items (QBWC devuelve lista de precios real) □ Configurar caché de clientes e items en PostgreSQL (sincronización diaria vía QBWC) □ Marcar como servicio Windows para arranque automático ENTREGABLE SEMANA 3: QBWC conectado y respondiendo. Cache de clientes e items actualizado. Hermes puede consultar QB sin latencia de polling. SEMANA 4-5: POC CONTABLE (El agente más crítico) ───────────────────────────────────────────────── □ Hermes API: estructura base desplegada en Coolify □ Agente Contable: extracción de PDF con Claude API □ Test con 5 POs históricas reales de NSP, Bauducco, otros clientes □ Validación de precios contra QB Cache □ QBWC: implementar job queue para creación de Sales Order Draft □ Workflow n8n WF-001 completo (Gmail → Hermes → QBWC → Slack) □ Notificación Slack funcionando □ Audit log en PostgreSQL □ Control Panel: vista básica de borradores creados ENTREGABLE SEMANA 5: Demostración a Jovan — PO de NSP llega por email → QBWC la recoge → Draft en QB + mensaje en Slack SEMANA 6-7: INBOX COPILOT + HUBSPOT ───────────────────────────────────── □ OpenAI Assistants API: conectar Custom GPTs de Factronics como asistentes □ Agente Inbox: clasificación de emails con triage + sentimiento + HubSpot □ Agente Inbox: generación de borradores con contexto técnico vía Assistants □ Integración HubSpot: crear contactos automáticos desde emails tipo D □ Integración HubSpot: análisis de sentimiento → actualización autónoma de deal stage □ Test con 20 emails reales del inbox de Jovan (histórico) □ Workflow n8n WF-002 completo □ Gmail: label "processed-by-hermes" funcionando □ Control Panel: vista de borradores de email pendientes + actividad HubSpot ENTREGABLE SEMANA 7: 10 emails del inbox de Jovan procesados, borradores en Gmail, HubSpot actualizado con contactos y deals. SEMANA 8-9: OPERATIONS + ONBOARDING AGENTS ───────────────────────────────────────────── □ Integrar API de Airtable/ClickUp/Trello como fuente de tareas □ Agente Operativo: resumen diario + alertas de tareas vencidas □ Workflow n8n WF-003 □ Agente de Onboarding: flujo completo (HubSpot trigger → forms → extracción → verificación → QB) □ Workflow n8n WF-004 □ WF-005 Kill Switch □ Control Panel: vistas completas de todas las secciones + cola de onboarding □ Documentación de operación para el equipo de Factronics ENTREGABLE SEMANA 9: Sistema completo en staging con los 4 agentes funcionando. Demo con Jovan y equipo contable. SEMANA 10: PRODUCCIÓN + AJUSTE ──────────────────────────────── □ Deploy a producción con datos reales □ Monitoreo intensivo los primeros 5 días □ Ajuste de prompts según feedback de Jovan □ Ajuste de umbrales de confianza (confidence < 0.85 → pending_review) □ Ajuste de reglas de autonomía HubSpot según precisión observada □ Sesión de capacitación: Jovan y equipo aprenden a usar el panel □ Documentación final entregada □ Retainer mensual activado ``` --- ## 7. Seguridad y Compliance ### Variables sensibles — Gestión ``` NUNCA en código fuente. Siempre en: - Coolify: Environment Variables (encriptadas en reposo) - Servidor QB local: archivo .qwc con credenciales de acceso - Rotación de tokens: cada 90 días Tokens a rotar periódicamente: - ANTHROPIC_API_KEY (monitorear uso en dashboard Anthropic) - OPENAI_API_KEY (monitorear uso en dashboard OpenAI) - QBWC_SOAP_PASSWORD (credencial de acceso al endpoint SOAP) - GMAIL_REFRESH_TOKENS (revocar y regenerar si hay incidente) - SLACK_BOT_TOKEN - HUBSPOT_API_KEY ``` ### Logs de auditoría — Política ``` - Cada acción de cada agente se escribe en audit_log (inmutable, no hay DELETE) - Retención: 2 años - Backup automático de PostgreSQL: diario a Google Drive de Factronics - Los logs incluyen: qué PO procesó, con qué confianza, qué creó en QB, cuándo ``` ### Kill Switch — Protocolo ``` Activar en: https://ops.factronic-ops.com/config Requiere: password de admin (solo Jovan y Pablo tienen acceso) Efecto inmediato: 1. Todos los triggers de n8n se desactivan 2. Hermes API rechaza nuevas peticiones (HTTP 503) 3. QBWC deja de recibir trabajos nuevos (el SOAP endpoint responde vacío) 4. Slack alerta al equipo Tiempo estimado de reactivación tras kill switch: 2 minutos ``` ### Política de NO-ENVÍO autónomo ``` REGLA ABSOLUTA: Ningún agente puede enviar emails por cuenta propia. Todo email generado va a Gmail DRAFTS. La Sales Order va a QB como DRAFT. El humano (Jovan o contabilidad) da clic de aprobación. La única excepción: notificaciones internas de Slack (no es comunicación externa). ``` --- ## 8. Estimado de Costos Operativos Mensuales | Concepto | Costo mensual estimado | |---|---|---| | Hostinger VPS (KVM 2) | ~$15-20 USD | | Claude API (orquestación: POs + triage + drafts) | ~$120-200 USD | | OpenAI Assistants API (consulta a Custom GPTs técnicos) | ~$20-40 USD | | Cloudflare (DNS + dominio) | ~$3-5 USD | | Gmail API | Gratis (dentro de límites) | | n8n (self-hosted en Coolify) | $0 | | PostgreSQL + Redis (self-hosted) | $0 | | **Total infraestructura** | **~$158-265 USD/mes** | *Nota: No se requiere Cloudflare Tunnel porque QBWC inicia la comunicación saliente. El costo de Claude API domina el presupuesto (~$120-200/mes para 215 POs + ~500 emails procesados). OpenAI Assistants API es marginal (~$20-40/mes) porque solo se consulta cuando el inbox necesita contexto técnico. Si el volumen se duplica, el estimado sube a ~$300-400/mes.* --- ## 9. KPIs de Éxito — Cómo medir el valor | KPI del RFP | Línea base | Meta | Cómo medirlo | |---|---|---|---|---| | Tiempo en procesamiento QB | 17.92 horas / 5 meses | < 2.5 horas revisión | audit_log: tiempo promedio por PO | | Triaje de inbox | 7.67 horas / 5 meses | Reducción 75% | n8n: emails procesados automáticamente | | Redacción de respuestas | 4.25 horas / 5 meses | 90% automatizado | Gmail Drafts generados vs enviados | | Precisión contable | Variable (error humano) | 98% borradores correctos | pending_review: aprobados vs rechazados | | Tiempo PO → QB Draft | ~7 minutos manual | < 3 minutos automático (incluyendo polling QBWC) | audit_log: created_at vs po_received_at | | Onboarding de clientes | Manual, días o semanas | < 24 horas a QB creado | onboarding_queue: created_at vs qb_created | | Actualización HubSpot autónoma | 0% | 85% deals actualizados sin intervención | hubspot audit log | --- ## 10. Próximos Pasos Inmediatos ``` HOY / ESTA SEMANA: □ Jovan confirma dominio para los servicios (factronic-ops.com u otro) □ Jovan crea: App en Google Cloud Console para Gmail API (accounting@ + jovan.gutic@) □ Jovan crea: App en Slack para el Bot Hermes Ops □ Jovan comparte: 5-10 POs históricas de NSP / Bauducco para pruebas □ Jovan confirma: ¿Qué plataforma de tareas usan? (Airtable / ClickUp / Trello) □ Jovan comparte: API key de la plataforma de tareas □ Jovan comparte: IDs de los Custom GPTs en OpenAI (o acceso para mapearlos) □ Jovan confirma: servidor Windows dedicado para QB Desktop listo □ Jovan confirma: ¿Tienen cuenta Cloudflare existente? SEMANA 1 — TU EQUIPO: □ Provisionar VPS Hostinger + instalar Coolify □ Setup PostgreSQL con esquemas completos □ Setup Redis □ Desplegar n8n + configurar credenciales Gmail y Slack □ Obtener API key de OpenAI + mapear Custom GPTs como Assistants □ Kick-off técnico con equipo de Factronics (30 min — remoto) □ Programar visita a Medley, FL para setup de QBWC (Semana 3) ``` --- *Blueprint elaborado por Coordenadas — Junio 2026* *Versión 2.0 — Actualizado con feedback de Jovan (QBWC, Assistants API, Onboarding, HubSpot autónomo)*