2Slides Logo
HubSpot + IA para Presentaciones: Guía de Automatización de Presentaciones de Ventas (2026)
2Slides Team
16 min read

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-...
. Cada generación de presentación devuelve un
jobId
inmediatamente, y consultas
/api/v1/jobs/{id}
hasta que el estado transita de
pending
processing
success
. Una vez exitoso, obtienes el PPTX final, PDF o URLs de assets por página.

Mé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:
    Etapa del negocio
    es cualquiera de
    Descubrimiento Completado
    ,
    Demo Programada
    ,
    Propuesta 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
    negocio
    ,
    empresa asociada
    y
    contacto 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}
y, al completarse exitosamente, escribe la URL de la presentación de vuelta al negocio como una nota de actividad:

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
) vive en el mismo proyecto de aplicación de HubSpot y llama al mismo flujo
/api/v1/slides/generate
+
/api/v1/jobs/{id}
que el Método 1, pero bloquea hasta que el trabajo tiene éxito (o se agota el tiempo) antes de devolver la URL del deck a la tarjeta.

// 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.competitors
en HubSpot — ya sea un campo de texto personalizado de una sola línea, un checkbox múltiple o un menú desplegable — es oro. Inyecta un bloque de battlecard en el prompt condicionalmente:

const 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)
a tu prompt. El deck ahora lleva un marco competitivo de nivel AE — del tipo que normalmente requiere una llamada de treinta minutos con el líder de inteligencia competitiva.

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_at
al objeto deal e incluye un filtro en el Workflow de HubSpot:
last_deck_generated_at
es desconocido o tiene más de 7 días de antigüedad. Tu función transformadora debe escribir esta marca de tiempo de vuelta a HubSpot a través de la API de Deal después de una generación exitosa. Esto por sí solo previene el 90% de las llamadas API desperdiciadas.

¿Cuánto cuesta esto en créditos de 2Slides?

Cada llamada a

/api/v1/slides/generate
debita créditos según el número de diapositivas y cualquier complemento (generación de imágenes, narración de voz). Para una presentación de ventas típica de 10 diapositivas con imágenes de marca, presupuesta 20–40 créditos por presentación. Un equipo de RevOps que genera 500 presentaciones al mes se sitúa en el rango de $150–$400, muy por debajo del trabajo de AE ahorrado en un solo acuerdo empresarial.

¿Puedo generar la presentación en un idioma distinto al inglés?

Sí. Pasa

language: 'de'
,
language: 'ja'
,
language: 'es'
, etc. en el payload de
/api/v1/slides/generate
. La plantilla de prompt también debe incluir un preámbulo localizado cuando el registro de contacto de tu champion muestre un idioma preferido que no sea inglés.

¿Cómo fijo la marca visual para que cada presentación se vea idéntica?

Usa un

theme_id
bloqueado en cada solicitud de generación. Crea tu tema de marca una vez en la UI de 2Slides, copia su ID y guárdalo como
BRAND_THEME_ID
en tus variables de entorno. El tema controla las fuentes, paleta, ubicación del logo y layouts maestros, por lo que el contenido varía por cuenta mientras el diseño permanece idéntico píxel a píxel.

¿Qué pasa si falla el trabajo de generación?

Consulta

/api/v1/jobs/{id}
e inspecciona
status
. En caso de
failed
, la respuesta contiene
error
con un código legible por máquina. Reintenta una vez con backoff exponencial; si falla por segunda vez, publica una alerta de Slack en el canal de RevOps y recurre a una presentación de plantilla estática para que el AE no quede bloqueado antes de su llamada.

La 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