

HubSpot + IA Presentación: Manual de Automatización de Sales Decks (2026)
Para equipos de ventas en HubSpot en 2026, el ROI de automatizar sales decks por cuenta es medible: ahorro promedio de tiempo para AEs de 2–4 horas por semana, un aumento del 12–18% en la progresión de reunión a reunión, y una reducción del 30-60% en la varianza de preparación de decks en todo el equipo. El flujo de trabajo HubSpot + 2Slides de 2026 genera un sales deck completamente personalizado para cualquier cuenta utilizando datos que ya están en HubSpot (empresa, etapa del deal, interés en producto, contacto champion, alternativas competitivas) mediante tres rutas de integración: HubSpot Workflow → Webhook → 2Slides API; HubSpot App Card personalizada con botón Generate Deck; lote programado diario para todos los deals en una etapa específica. Este manual incluye el payload exacto del webhook, la plantilla de prompt que convierte campos de HubSpot en contenido de deck, y el flujo de 2Slides API (generate → jobs/:id → download) utilizado por equipos RevOps reales en producción hoy.
Si gestionas operaciones de ingresos para un equipo de ventas en HubSpot, ya conoces el problema: cada AE está pidiendo a marketing o sales enablement "solo un pequeño ajuste" al deck antes de su próxima llamada. Multiplica eso por cuarenta representantes y trescientos deals en curso, y tendrás un trabajo de tiempo completo pegando plantillas de Google Slides a datos de CRM estilo Salesforce — excepto que estás en HubSpot, que no tiene un equivalente nativo del módulo Document Generation de Salesforce.
Este manual te muestra cómo conectar HubSpot a la 2Slides V1 API para que cualquier deal en cualquier etapa pueda generar un sales deck personalizado, consistente con la marca y listo para el canal — sin que un humano toque un slide master. Los patrones a continuación son utilizados por equipos RevOps en B2B SaaS, ciberseguridad y empresas de IA empresarial para impulsar valores promedio de contrato desde $40K hasta más de $400K.
Por qué las presentaciones generadas desde HubSpot ganan
El caso de negocio para automatizar presentaciones de ventas desde HubSpot proviene de tres palancas medibles.
Palanca 1: Tiempo recuperado de los AE. La observación interna en clientes de 2Slides con implementaciones de más de 20 usuarios muestra que los ejecutivos de cuentas dedican 2–4 horas por semana a la personalización de presentaciones — reescribir diapositivas de introducción, actualizar logos, pegar las debilidades del competidor, cambiar calculadoras de ROI. Con un costo total de AE de $160K/año, eso representa $6,400–$12,800 por AE por año en trabajo puro de diapositivas. Para un equipo de ventas de 40 personas, estamos hablando de $256K/año conservadores en capacidad recuperada.
Palanca 2: Conversión de reunión a reunión. Las presentaciones generadas a partir de datos CRM en vivo — es decir, la banda de ingresos real de la empresa, el cargo real del promotor, el competidor realmente listado en el registro del trato — convierten reservas de siguiente reunión un 12–18% más alto que las presentaciones de plantillas genéricas. La razón es simple: la especificidad señala preparación, y la preparación señala que un vendedor merece una segunda reunión.
Palanca 3: Reducción de varianza. Tus mejores AEs (cuartil superior) construyen excelentes presentaciones. Tu cuartil inferior construye presentaciones mediocres que pierden pipeline. La automatización eleva el nivel inferior. En datos de cohortes, los equipos de RevOps que ejecutan generación de presentaciones activada desde HubSpot reportan una reducción del 30–60% en la varianza de calidad de presentaciones medida por puntuaciones de control de calidad de gerentes.
El patrón común en las tres: la presentación no es el producto, la preparación es el producto. Automatizar la preparación es el movimiento de mayor apalancamiento que RevOps puede hacer en 2026. Para una mirada más profunda del lado de la habilitación, consulta nuestra guía sobre cómo crear presentaciones de habilitación de ventas con AI.
La Arquitectura HubSpot + 2Slides 2026
Antes de profundizar en cada método, aquí está la arquitectura que sigue cada implementación:
HubSpot CRM (deals, companies, contacts) │ ├── Activador (workflow, app card, cron) │ ▼ Capa de Transformación (serverless fn / Zapier / Make) │ - Construye el prompt desde campos del CRM │ - Llama a la API V1 de 2Slides │ ▼ API V1 de 2Slides ├── POST /api/v1/slides/generate (devuelve jobId) ├── GET /api/v1/jobs/{id} (consulta hasta que status = success) └── GET /api/v1/slides/download-slides-pages-voices (URLs de assets) │ ▼ Entrega (de vuelta a deal de HubSpot como nota, email al AE, mensaje directo en Slack)
La API de 2Slides no tiene estado por trabajo, es asíncrona y se mide por créditos. Te autenticas con un header de API key
x-api-key: sk-2slides-...jobId/api/v1/jobs/{id}pendingprocessingsuccessMétodo 1: Flujo de Trabajo de HubSpot → Webhook → API de 2Slides
Esta es la ruta de integración más común. Un Flujo de Trabajo de HubSpot monitorea los cambios de etapa en el pipeline de negocios y dispara un webhook a una función serverless que se comunica con la API de 2Slides.
Paso 1: Crear el Flujo de Trabajo de HubSpot
En HubSpot, ve a Automatización → Flujos de trabajo → Crear flujo de trabajo → Basado en negocios. Configura el disparador de inscripción:
- Filtro: es cualquiera de
Etapa del negocio,Descubrimiento Completado,Demo ProgramadaPropuesta Enviada - Re-inscripción: habilitada al cambiar de etapa
Agrega una acción Enviar webhook:
- Método:
POST - URL:
https://your-revops-fn.vercel.app/api/hubspot/generate-deck - Incluye los grupos de propiedades ,
negocioyempresa asociadacontacto principal
Paso 2: Función Transformadora
Despliega esto en Vercel, Cloudflare Workers o AWS Lambda. La función recibe el webhook de HubSpot, compone el prompt de 2Slides e inicia la generación.
// /api/hubspot/generate-deck.ts export async function POST(req: Request) { const payload = await req.json() const deal = payload.properties const company = payload.associations?.company?.properties ?? {} const contact = payload.associations?.contact?.properties ?? {} const prompt = buildDeckPrompt({ deal, company, contact }) const generateRes = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY!, }, body: JSON.stringify({ prompt, slide_count: 12, language: 'en', aspect_ratio: '16:9', theme_id: process.env.BRAND_THEME_ID, // tu tema de marca bloqueado metadata: { hubspot_deal_id: deal.hs_object_id, account: company.name, }, }), }) const { jobId } = await generateRes.json() // Persiste la asociación jobId -> negocio para búsqueda posterior await kv.set(`deal:${deal.hs_object_id}:job`, jobId, { ex: 86400 }) return Response.json({ ok: true, jobId }) }
Paso 3: Sondear y Entregar
Una segunda función (llamada por un Cron de Vercel cada 90 segundos, o por la re-entrada retardada del flujo de trabajo de HubSpot) sondea
/api/v1/jobs/{id}const jobRes = await fetch(`https://2slides.com/api/v1/jobs/${jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY! }, }) const job = await jobRes.json() if (job.status === 'success') { const assets = await fetch( `https://2slides.com/api/v1/slides/download-slides-pages-voices?jobId=${jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY! } } ).then(r => r.json()) await hubspotClient.crm.objects.notes.basicApi.create({ properties: { hs_note_body: `Presentación lista: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }
Este es el mismo patrón que usamos en nuestra automatización de informes semanales con Zapier — una llamada de generación, un sondeo, una entrega — solo que conectado a través de HubSpot en lugar de Zapier.
Método 2: Tarjeta de Aplicación de HubSpot con Botón Generar Deck
El Método 1 es automático. El Método 2 es bajo demanda: el AE abre un negocio en HubSpot, ve una tarjeta personalizada en la barra lateral derecha, hace clic en Generar Deck, y el deck llega a su bandeja de entrada dos minutos después.
Esto utiliza una UI Extension (Extensión de Interfaz) de HubSpot (parte de la plataforma Developer Projects).
Código de UI Extension
// src/app/extensions/DealDeckCard.tsx import { hubspot, Button, Flex, Text, Alert, LoadingSpinner, } from '@hubspot/ui-extensions' import { useState } from 'react' hubspot.extend(({ context, runServerlessFunction }) => ( <DeckCard context={context} runServerless={runServerlessFunction} /> )) function DeckCard({ context, runServerless }) { const [state, setState] = useState<'idle' | 'working' | 'done' | 'error'>('idle') const [deckUrl, setDeckUrl] = useState<string | null>(null) async function onClick() { setState('working') const { response } = await runServerless({ name: 'generateDeck', parameters: { dealId: context.crm.objectId }, }) if (response.deckUrl) { setDeckUrl(response.deckUrl) setState('done') } else { setState('error') } } return ( <Flex direction="column" gap="sm"> <Text>Genera un deck de ventas personalizado para esta cuenta usando 2Slides.</Text> {state === 'idle' && <Button onClick={onClick}>Generar Deck</Button>} {state === 'working' && <LoadingSpinner label="Construyendo deck (90–120s)" />} {state === 'done' && deckUrl && ( <Alert title="Deck listo"> <a href={deckUrl} target="_blank" rel="noreferrer">Abrir deck</a> </Alert> )} {state === 'error' && <Alert variant="danger">Generación fallida — revisa los logs de RevOps.</Alert>} </Flex> ) }
El Compañero Serverless
La función serverless referenciada arriba (
generateDeck/api/v1/slides/generate/api/v1/jobs/{id}// src/app/app.functions/generateDeck.js exports.main = async (context) => { const { dealId } = context.parameters const deal = await hubspotFetchDeal(dealId) const prompt = buildDeckPrompt(deal) const gen = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY }, body: JSON.stringify({ prompt, slide_count: 12, theme_id: process.env.BRAND_THEME_ID }), }).then(r => r.json()) // Sondear hasta 3 minutos for (let i = 0; i < 36; i++) { await new Promise(r => setTimeout(r, 5000)) const job = await fetch(`https://2slides.com/api/v1/jobs/${gen.jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY }, }).then(r => r.json()) if (job.status === 'success') { return { deckUrl: job.result?.pptx_url } } if (job.status === 'failed') throw new Error(job.error || 'generation failed') } throw new Error('timeout') }
Este patrón — objeto CRM → tarjeta de extensión → llamada API → resultado en línea — es el mismo enfoque que los equipos de marketing utilizan cuando escalan la producción de contenido; consulta cómo los equipos de marketing ejecutan decks de presentaciones con IA a escala.
Método 3: Generación por Lotes Programada
No todos los decks necesitan generarse bajo demanda. Para revisiones de pipeline predecibles — cada lunes por la mañana, cada revisión trimestral de negocio, cada actualización de fase MEDDPICC — un lote programado con cron es más económico y confiable que webhooks en tiempo real.
El Patrón
Ejecuta un trabajo nocturno que consulta HubSpot por cada deal en una etapa objetivo, genera un deck actualizado para cada uno y envía al AE un resumen matutino por correo.
// /api/cron/nightly-deck-refresh.ts export const runtime = 'nodejs' export const maxDuration = 300 export async function GET(req: Request) { // Vercel Cron protege con CRON_SECRET if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { return new Response('Unauthorized', { status: 401 }) } const deals = await hubspotClient.crm.deals.searchApi.doSearch({ filterGroups: [{ filters: [ { propertyName: 'dealstage', operator: 'EQ', value: 'proposal_sent' }, { propertyName: 'hs_lastmodifieddate', operator: 'GT', value: String(Date.now() - 86400000) }, ], }], properties: ['dealname', 'amount', 'competitor', 'product_interest', 'champion_title'], limit: 100, }) const jobs = await Promise.all(deals.results.map(async (deal) => { const prompt = buildDeckPrompt(deal) const res = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY! }, body: JSON.stringify({ prompt, slide_count: 10, theme_id: process.env.BRAND_THEME_ID }), }).then(r => r.json()) return { dealId: deal.id, jobId: res.jobId, owner: deal.properties.hubspot_owner_id } })) await enqueueDeliveryJobs(jobs) // SQS / Upstash QStash / Trigger.dev return Response.json({ enqueued: jobs.length }) }
Programa en
vercel.json{ "crons": [ { "path": "/api/cron/nightly-deck-refresh", "schedule": "0 6 * * 1-5" } ] }
Seis de la mañana, días hábiles. El AE abre el correo, el deck está esperando.
La Plantilla de Prompt que Convierte Campos del CRM en Contenido de Presentación
El factor determinante más importante de la calidad de la presentación es el prompt. Los buenos prompts codifican lo que un AE senior le diría a un nuevo empleado: "cuando la empresa es X, con un champion en rol Y, enfocado en resultado Z, construye la presentación así". Plantilla lista para copiar y pegar:
function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` Genera una presentación de ventas de 10-12 diapositivas para una evaluación de software B2B. CONTEXTO DE LA CUENTA - Empresa: ${company.name} - Industria: ${company.industry ?? 'no especificada'} - Rango de ingresos anuales: ${company.annualrevenue ?? 'no especificado'} - Empleados: ${company.numberofemployees ?? 'no especificado'} - Sitio web: ${company.domain} CONTEXTO DEL DEAL - Etapa del deal: ${deal.dealstage} - Monto del deal: $${deal.amount} - Interés en producto: ${deal.product_interest} - Caso de uso prioritario: ${deal.primary_use_case} - Lista corta de competidores: ${deal.competitors /* separados por comas */} - Cronograma de evaluación: ${deal.close_date} CONTEXTO DEL CHAMPION - Nombre: ${contact.firstname} ${contact.lastname} - Cargo: ${contact.jobtitle} - Prioridades reportadas: ${contact.priorities} ESTRUCTURA DE LA PRESENTACIÓN 1. Diapositiva de título — "${company.name} × <Tu Marca>: ${deal.primary_use_case}" 2. Su mundo hoy — 3 viñetas, específicas a ${company.industry} 3. El costo de no hacer nada — cuantificar usando el rango de ${company.annualrevenue} 4. Nuestro enfoque — 3 pilares alineados con ${deal.primary_use_case} 5. Prueba — 2 casos de estudio de ${company.industry} (o adyacentes) 6. Diferenciación vs ${deal.competitors} — ver sección de battlecard abajo 7. Plan de implementación — 30/60/90 ajustado a ${deal.close_date} 8. Resumen comercial — rango anclado a $${deal.amount} 9. Riesgos y mitigaciones 10. Próximos pasos — alineados a ${deal.dealstage} TONO - Ajustar a la audiencia: ${contact.jobtitle} - Formal si el título incluye VP, SVP, Chief, Director; conversacional en otros casos. - Cada diapositiva: una idea, un gráfico o una cita destacada, sin muros de texto. `.trim() }
Mantén la plantilla bajo control de versiones. Cuando marketing actualice el framework de mensajería, cambias un archivo y la próxima ejecución del cron lo incorpora.
Manejo de Alternativas Competitivas
El campo
deal.competitorsconst BATTLECARDS: Record<string, string> = { 'Competitor A': ` Competitor A se posiciona en <su afirmación>. Contra-argumento: <tu punto de prueba> + <eslogan de 3 palabras>. Pregunta trampa para plantar: "¿Cuándo fue publicada su última auditoría de seguridad?" `, 'Competitor B': ` Competitor B lidera con <su ángulo>. Contra-argumento: <tu contra-argumento> — referencia caso de cambio de <nombre del cliente>. Pregunta trampa: "Pregunta sobre sus límites por usuario después de 500 usuarios." `, } function battlecardSection(competitorsCsv: string) { const names = competitorsCsv.split(',').map(s => s.trim()).filter(Boolean) if (!names.length) return '' return ` BATTLECARDS COMPETITIVAS ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} Usa esto para completar la diapositiva de Diferenciación. Nunca menciones al competidor más de dos veces. `.trim() }
Añade el resultado de
battlecardSection(deal.competitors)Almacena las battlecards en una tabla de base de datos en lugar de codificarlas una vez que tengas más de diez. Tu Head de Product Marketing puede editarlas sin tener que enviar un PR.
Preguntas Frecuentes
¿Cómo evito que HubSpot genere presentaciones duplicadas en cada actualización de propiedad?
Añade una propiedad llamada
last_deck_generated_atlast_deck_generated_at¿Cuánto cuesta esto en créditos de 2Slides?
Cada llamada a
/api/v1/slides/generate¿Puedo generar la presentación en un idioma distinto al inglés?
Sí. Pasa
language: 'de'language: 'ja'language: 'es'/api/v1/slides/generate¿Cómo fijo la marca visual para que cada presentación se vea idéntica?
Usa un
theme_idBRAND_THEME_ID¿Qué pasa si falla el trabajo de generación?
Consulta
/api/v1/jobs/{id}statusfailederrorLa Conclusión
HubSpot no intenta ser Salesforce, y eso está bien — su simplicidad es la característica principal. Pero la simplicidad también significa que no incluye automatización de documentos de forma nativa. Esta brecha es una característica, no un error, porque significa que el equipo de RevOps que conecta HubSpot con una API de presentaciones AI controla el área de superficie más valiosa de su stack de tecnología de ventas: la presentación que llega al comprador.
Los tres métodos anteriores — webhook de flujo de trabajo, botón de tarjeta de aplicación, lote programado — cubren toda la gama de disparadores de generación que necesita un equipo de ventas. Elige el que coincida con tu etapa de embudo. Las etapas de Discovery y Demo casi siempre requieren generación bajo demanda (la tarjeta de aplicación). Las etapas de Propuesta y Negociación se benefician más de la automatización en el cambio de etapa (el webhook de flujo de trabajo). Las revisiones de pipeline y la preparación de QBR son por lote (el cron). Ejecuta los tres y cada negocio en el pipeline tendrá una presentación actualizada y fiel al CRM al alcance de la mano, todos los días.
Automatiza tus presentaciones de ventas desde HubSpot — obtén una clave API de 2Slides e intégrala en tu próximo flujo de trabajo en menos de un día.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free