2Slides Logo
HubSpot + AI 프레젠테이션: 영업 자료 자동화 플레이북 (2026)
2Slides Team
12 min read

HubSpot + AI 프레젠테이션: 영업 자료 자동화 플레이북 (2026)

2026년 HubSpot을 사용하는 영업 팀에게 계정별 영업 자료 자동화의 ROI는 측정 가능합니다: 평균 영업 담당자(AE)당 주당 24시간 절약, 미팅 진행률 1218% 향상, 팀 전체의 자료 준비 편차 30~60% 감소. 2026 HubSpot + 2Slides 워크플로우는 HubSpot에 이미 있는 데이터(회사, 딜 단계, 제품 관심사, 챔피언 연락처, 경쟁 대안)를 사용하여 모든 계정에 대해 완전히 개인화된 영업 자료를 생성합니다. 세 가지 통합 경로를 통해: HubSpot Workflow → Webhook → 2Slides API; 자료 생성 버튼이 있는 커스텀 HubSpot App Card; 특정 단계의 모든 딜에 대한 일일 배치 예약. 이 플레이북에는 정확한 webhook 페이로드, HubSpot 필드를 자료 콘텐츠로 변환하는 프롬프트 템플릿, 그리고 오늘날 실제 RevOps 팀이 프로덕션에서 사용하는 2Slides API 플로우(generate → jobs/:id → download)가 포함되어 있습니다.

HubSpot을 사용하는 영업 팀의 수익 운영(revenue operations)을 담당하고 있다면, 이미 문제를 알고 계실 것입니다: 모든 영업 담당자가 다음 통화 전에 마케팅이나 영업 지원팀에 자료를 "조금만" 수정해달라고 요청합니다. 이를 40명의 담당자와 진행 중인 300개의 딜에 곱하면, Google Slides 템플릿을 Salesforce 스타일의 CRM 데이터에 연결하는 풀타임 업무가 됩니다 — 하지만 여러분은 HubSpot을 사용하고 있으며, HubSpot에는 Salesforce의 Document Generation 모듈에 해당하는 네이티브 기능이 없습니다.

이 플레이북은 HubSpot을 2Slides V1 API에 연결하여 모든 단계의 모든 딜이 개인화되고 브랜드 일관성 있는 채널 준비 완료된 영업 자료를 생성할 수 있도록 하는 방법을 보여줍니다 — 사람이 슬라이드 마스터를 건드릴 필요 없이. 아래 패턴은 B2B SaaS, 사이버보안, 엔터프라이즈 AI 기업의 RevOps 팀이 평균 계약 가치를 $40K에서 $400K+ 까지 끌어올리는 데 사용하고 있습니다.

HubSpot 기반 프레젠테이션이 성공하는 이유

HubSpot에서 영업 프레젠테이션을 자동화해야 하는 비즈니스 근거는 세 가지 측정 가능한 레버에서 나옵니다.

레버 1: AE 시간 회수. 20석 이상 배포한 2Slides 고객들을 대상으로 한 내부 관찰에 따르면, 영업 담당자(AE)들은 주당 24시간을 프레젠테이션 커스터마이징에 소비합니다 — 소개 슬라이드 재작성, 로고 업데이트, 경쟁사의 약점 붙여넣기, ROI 계산기 교체 등. AE 1인당 총 비용이 연간 $160K일 때, 이는 순수 슬라이드 작업에만 AE 1인당 연간 $6,400$12,800에 해당합니다. 40명의 영업팀의 경우, 보수적으로 계산해도 연간 $256K의 생산성을 회수할 수 있습니다.

레버 2: 미팅-투-미팅 전환율. 실시간 CRM 데이터에서 생성된 프레젠테이션 — 즉, 고객사의 실제 매출 규모, 챔피언의 실제 직함, 거래 기록에 실제로 기재된 경쟁사 정보를 담은 프레젠테이션은 일반적인 템플릿 프레젠테이션보다 다음 미팅 예약률이 12~18% 더 높습니다. 이유는 간단합니다: 구체성은 준비성을 나타내고, 준비성은 영업사원이 두 번째 미팅을 가질 가치가 있다는 신호를 보냅니다.

레버 3: 편차 감소. 상위 25% AE들은 훌륭한 프레젠테이션을 만듭니다. 하위 25%는 파이프라인을 누수시키는 평범한 프레젠테이션을 만듭니다. 자동화는 하위 그룹을 끌어올립니다. 코호트 데이터에서 HubSpot 트리거 프레젠테이션 생성을 실행하는 RevOps 팀들은 관리자 QA 점수로 측정한 프레젠테이션 품질 편차가 30~60% 감소했다고 보고합니다.

세 가지 모두에서 공통된 패턴: 프레젠테이션 자체가 제품이 아니라, 준비 과정이 제품입니다. 준비 과정을 자동화하는 것이 2026년에 RevOps가 할 수 있는 가장 높은 레버리지를 가진 행동입니다. 영업 지원 측면을 더 깊이 살펴보려면 AI로 영업 지원 프레젠테이션을 만드는 방법에 대한 가이드를 참조하세요.

2026 HubSpot + 2Slides 아키텍처

각 방법을 살펴보기 전에, 모든 구현이 따르는 아키텍처는 다음과 같습니다:

HubSpot CRM (거래, 회사, 연락처) ├── 트리거 (워크플로우, 앱 카드, cron) 변환 레이어 (서버리스 함수 / Zapier / Make) │ - CRM 필드에서 프롬프트 구성 │ - 2Slides V1 API 호출 2Slides V1 API ├── POST /api/v1/slides/generate (jobId 반환) ├── GET /api/v1/jobs/{id} (status = success가 될 때까지 폴링) └── GET /api/v1/slides/download-slides-pages-voices (에셋 URL) 전달 (HubSpot 거래에 노트로, AE에게 이메일, Slack DM)

2Slides API는 작업당 무상태, 비동기식이며 크레딧 측정 방식입니다. API 키 헤더

x-api-key: sk-2slides-...
로 인증합니다. 모든 덱 생성은 즉시
jobId
를 반환하며, 상태가
pending
processing
success
로 전환될 때까지
/api/v1/jobs/{id}
를 폴링합니다. 성공하면 최종 PPTX, PDF 또는 페이지별 에셋 URL을 가져옵니다.

방법 1: HubSpot 워크플로우 → 웹훅 → 2Slides API

가장 일반적인 통합 경로입니다. HubSpot 워크플로우가 딜 파이프라인의 단계 변경을 감지하고 2Slides API와 통신하는 서버리스 함수로 웹훅을 발송합니다.

단계 1: HubSpot 워크플로우 생성

HubSpot에서 자동화 → 워크플로우 → 워크플로우 생성 → 딜 기반으로 이동합니다. 등록 트리거를 설정하세요:

  • 필터:
    딜 단계
    Discovery Complete
    ,
    Demo Scheduled
    ,
    Proposal Sent
    중 하나
  • 재등록: 단계 변경 시 활성화

웹훅 전송 액션을 추가하세요:

  • 메서드:
    POST
  • URL:
    https://your-revops-fn.vercel.app/api/hubspot/generate-deck
  • deal
    ,
    associated company
    ,
    primary contact
    속성 그룹 포함

단계 2: 변환 함수

Vercel, Cloudflare Workers 또는 AWS Lambda에 배포합니다. 이 함수는 HubSpot 웹훅을 수신하고, 2Slides 프롬프트를 구성하며, 생성을 시작합니다.

// /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, // 고정된 브랜드 테마 metadata: { hubspot_deal_id: deal.hs_object_id, account: company.name, }, }), }) const { jobId } = await generateRes.json() // 나중에 조회할 수 있도록 jobId → deal 연결 저장 await kv.set(`deal:${deal.hs_object_id}:job`, jobId, { ex: 86400 }) return Response.json({ ok: true, jobId }) }

단계 3: 폴링 및 전달

두 번째 함수(Vercel Cron이 90초마다 호출하거나 HubSpot의 지연된 워크플로우 재진입으로 호출)가

/api/v1/jobs/{id}
를 폴링하고, 성공 시 딜에 참여 노트로 덱 URL을 작성합니다:

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: `새로운 덱이 준비되었습니다: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }

이것은 Zapier 주간 보고서 자동화에서 사용하는 것과 동일한 패턴입니다 — 생성 호출, 폴링, 전달 — Zapier 대신 HubSpot을 통해 연결된 것입니다.

방법 2: 덱 생성 버튼이 있는 HubSpot 앱 카드

방법 1은 자동이고, 방법 2는 온디맨드 방식입니다: AE가 HubSpot에서 거래를 열면 오른쪽 사이드바에 커스텀 카드가 표시되고, 덱 생성을 클릭하면 2분 후 덱이 받은 편지함에 도착합니다.

이는 HubSpot UI 확장(Developer Projects 플랫폼의 일부)을 사용합니다.

UI 확장 코드

// 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>2Slides를 사용하여 이 계정에 대한 맞춤형 영업 덱을 생성합니다.</Text> {state === 'idle' && <Button onClick={onClick}>덱 생성</Button>} {state === 'working' && <LoadingSpinner label="덱 생성 중 (90–120초)" />} {state === 'done' && deckUrl && ( <Alert title="덱 준비 완료"> <a href={deckUrl} target="_blank" rel="noreferrer">덱 열기</a> </Alert> )} {state === 'error' && <Alert variant="danger">생성 실패 — RevOps 로그를 확인하세요.</Alert>} </Flex> ) }

서버리스 컴패니언

위에서 참조된 서버리스 함수(

generateDeck
)는 동일한 HubSpot 앱 프로젝트에 있으며, 방법 1과 동일한
/api/v1/slides/generate
+
/api/v1/jobs/{id}
플로우를 호출하지만, 카드에 덱 URL을 반환하기 전에 작업이 성공하거나 시간 초과될 때까지 대기합니다.

// 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()) // 최대 3분간 폴링 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') }

이 패턴 — CRM 객체 → 확장 카드 → API 호출 → 인라인 결과 — 은 마케팅 팀이 콘텐츠 제작을 확장할 때 사용하는 것과 동일한 접근 방식입니다. 마케팅 팀이 대규모로 AI 프레젠테이션 덱을 실행하는 방법을 참조하세요.

방법 3: 예약된 배치 생성

모든 프레젠테이션이 실시간으로 생성되어야 하는 것은 아닙니다. 예측 가능한 파이프라인 리뷰 — 매주 월요일 아침, 분기별 비즈니스 리뷰, MEDDPICC 단계 새로고침 — 의 경우, cron 예약 배치가 실시간 웹훅보다 비용 효율적이고 안정적입니다.

패턴

매일 밤 작업을 실행하여 HubSpot에서 특정 단계의 모든 거래를 조회하고, 각각에 대해 새로운 프레젠테이션을 생성한 후, AE에게 아침 요약 이메일을 발송합니다.

// /api/cron/nightly-deck-refresh.ts export const runtime = 'nodejs' export const maxDuration = 300 export async function GET(req: Request) { // Vercel Cron은 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 }) }

vercel.json
에서 스케줄 설정:

{ "crons": [ { "path": "/api/cron/nightly-deck-refresh", "schedule": "0 6 * * 1-5" } ] }

오전 6시, 평일. AE가 이메일을 열면 프레젠테이션이 준비되어 있습니다.

CRM 필드를 덱 콘텐츠로 변환하는 프롬프트 템플릿

덱 품질을 결정하는 가장 큰 요소는 프롬프트입니다. 좋은 프롬프트는 시니어 AE가 신입사원에게 하는 말을 인코딩합니다: "회사가 X이고, Y 역할의 챔피언이 있으며, Z 결과에 집중할 때, 덱을 이렇게 구성하세요." 바로 사용 가능한 템플릿:

function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` B2B 소프트웨어 평가를 위한 10-12페이지 영업 덱을 생성하세요. 고객사 컨텍스트 - 회사명: ${company.name} - 산업: ${company.industry ?? '미지정'} - 연간 매출 범위: ${company.annualrevenue ?? '미지정'} - 직원 수: ${company.numberofemployees ?? '미지정'} - 웹사이트: ${company.domain} 딜 컨텍스트 - 딜 단계: ${deal.dealstage} - 딜 금액: $${deal.amount} - 제품 관심사: ${deal.product_interest} - 우선 유즈케이스: ${deal.primary_use_case} - 경쟁사 후보 목록: ${deal.competitors /* 쉼표로 구분 */} - 평가 일정: ${deal.close_date} 챔피언 컨텍스트 - 이름: ${contact.firstname} ${contact.lastname} - 직함: ${contact.jobtitle} - 보고된 우선순위: ${contact.priorities} 덱 구조 1. 타이틀 슬라이드 — "${company.name} × <귀사 브랜드>: ${deal.primary_use_case}" 2. 현재 그들의 세계 — ${company.industry}에 특화된 3개 불릿 3. 아무것도 하지 않을 때의 비용 — ${company.annualrevenue} 범위를 사용하여 정량화 4. 우리의 접근법 — ${deal.primary_use_case}에 부합하는 3가지 핵심 요소 5. 증거 — ${company.industry}(또는 인접 산업)의 2개 사례 연구 6. ${deal.competitors}와의 차별화 — 아래 배틀카드 섹션 참조 7. 실행 계획 — ${deal.close_date}에 맞춘 30/60/90일 계획 8. 상업적 요약 — $${deal.amount}에 기반한 가격 범위 9. 리스크와 완화 방안 10. 다음 단계 — ${deal.dealstage}에 부합 - 청중에 맞춤: ${contact.jobtitle} - VP, SVP, Chief, Director가 포함된 직함이면 격식 있게; 그 외에는 대화체로. - 모든 슬라이드: 하나의 아이디어, 하나의 차트 또는 하나의 인용구, 텍스트 나열 금지. `.trim() }

템플릿을 버전 관리 하에 두세요. 마케팅팀이 메시징 프레임워크를 업데이트하면, 파일 하나만 변경하면 다음 크론 실행 시 자동으로 반영됩니다.

경쟁 대안 처리하기

HubSpot의

deal.competitors
필드는 — 커스텀 단일 라인 텍스트 필드, 다중 체크박스, 또는 드롭다운이든 — 금과 같습니다. 프롬프트에 배틀카드 블록을 조건부로 삽입하세요:

const BATTLECARDS: Record<string, string> = { 'Competitor A': ` Competitor A는 <그들의 주장>으로 포지셔닝합니다. 대응: <당신의 증명 포인트> + <3단어 태그라인>. 심을 지뢰 질문: "그들의 마지막 보안 감사는 언제 공개되었나요?" `, 'Competitor B': ` Competitor B는 <그들의 접근>으로 리드합니다. 대응: <당신의 대응> — <고객 이름> 전환 사례 참조. 지뢰: "사용자 500명 이후의 시트당 제한에 대해 물어보세요." `, } function battlecardSection(competitorsCsv: string) { const names = competitorsCsv.split(',').map(s => s.trim()).filter(Boolean) if (!names.length) return '' return ` 경쟁사 배틀카드 ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} 이를 사용하여 차별화 슬라이드를 채우세요. 경쟁사 이름을 두 번 이상 언급하지 마세요. `.trim() }

battlecardSection(deal.competitors)
의 결과를 프롬프트에 추가하세요. 이제 덱은 AE 수준의 경쟁 프레이밍을 가집니다 — 일반적으로 경쟁 인텔리전스 리드와의 30분짜리 통화가 필요한 종류입니다.

배틀카드가 열 개 이상이 되면 하드코딩하는 대신 데이터베이스 테이블에 저장하세요. 제품 마케팅 책임자가 PR을 제출하지 않고도 편집할 수 있습니다.

자주 묻는 질문

HubSpot에서 속성이 업데이트될 때마다 중복 덱이 생성되는 것을 어떻게 방지하나요?

거래 객체에

last_deck_generated_at
이라는 속성을 추가하고 HubSpot Workflow에 다음 필터를 포함하세요:
last_deck_generated_at
이 알 수 없음이거나 7일 이상 경과. 트랜스포머 함수는 성공적인 생성 후 Deal API를 통해 이 타임스탬프를 HubSpot에 다시 기록해야 합니다. 이것만으로도 낭비되는 API 호출의 90%를 방지할 수 있습니다.

2Slides 크레딧 비용은 얼마나 드나요?

/api/v1/slides/generate
호출은 슬라이드 수와 모든 추가 기능(이미지 생성, 음성 나레이션)을 기준으로 크레딧을 차감합니다. 브랜드 이미지가 포함된 일반적인 10슬라이드 영업 덱의 경우, 덱당 2040 크레딧을 예산으로 책정하세요. 월 500개의 덱을 생성하는 RevOps 팀의 경우 $150$400 범위에 해당하며, 이는 단일 엔터프라이즈 거래에서 절감되는 AE 인건비보다 훨씬 낮습니다.

영어가 아닌 다른 언어로 덱을 생성할 수 있나요?

네.

/api/v1/slides/generate
페이로드에서
language: 'de'
,
language: 'ja'
,
language: 'es'
등을 전달하세요. 챔피언의 연락처 레코드에 영어가 아닌 다른 선호 언어가 표시된 경우, 프롬프트 템플릿에도 현지화된 서문을 포함해야 합니다.

모든 덱이 동일하게 보이도록 시각적 브랜드를 고정하려면 어떻게 하나요?

모든 생성 요청에서 고정된

theme_id
를 사용하세요. 2Slides UI에서 브랜드 테마를 한 번 생성하고 해당 ID를 복사한 후 환경 변수에
BRAND_THEME_ID
로 저장하세요. 테마는 폰트, 팔레트, 로고 배치 및 마스터 레이아웃을 제어하므로 콘텐츠는 계정마다 다르지만 외관은 픽셀 단위로 동일하게 유지됩니다.

생성 작업이 실패하면 어떻게 하나요?

/api/v1/jobs/{id}
를 폴링하고
status
를 확인하세요.
failed
상태일 경우, 응답에는 기계 판독 가능한 코드가 포함된
error
가 포함됩니다. 지수 백오프를 사용하여 한 번 재시도하고, 두 번째로도 실패하면 RevOps 채널에 Slack 알림을 게시하고 정적 템플릿 덱으로 폴백하여 AE가 통화 전에 차단되지 않도록 하세요.

핵심 요약

HubSpot은 Salesforce가 되려고 하지 않으며, 그것으로 충분합니다 — 단순함이 바로 특징입니다. 하지만 단순함은 네이티브 문서 자동화를 제공하지 않는다는 의미이기도 합니다. 이 공백은 버그가 아닌 기능입니다. 왜냐하면 HubSpot을 AI 프레젠테이션 API에 연결하는 RevOps 팀이 영업 기술 스택에서 가장 가치 있는 영역, 즉 구매자 앞에 놓이는 덱을 소유하게 되기 때문입니다.

위의 세 가지 방법 — 워크플로우 webhook, 앱 카드 버튼, 예약 배치 작업 — 은 영업 팀이 필요로 하는 모든 생성 트리거를 포괄합니다. 퍼널 단계에 맞는 방법을 선택하세요. Discovery 및 Demo 단계는 거의 항상 온디맨드 방식(앱 카드)을 원합니다. Proposal 및 Negotiation 단계는 단계 변경 시 자동화(워크플로우 webhook)에서 가장 큰 이점을 얻습니다. 파이프라인 리뷰와 QBR 준비는 배치 작업(cron)이 적합합니다. 세 가지를 모두 실행하면 파이프라인의 모든 딜이 매일 손이 닿는 곳에 신선하고 CRM에 기반한 정확한 덱을 갖추게 됩니다.

HubSpot에서 영업 덱을 자동화하세요 — 2Slides API key를 받아 하루 안에 다음 워크플로우에 연결하세요.

About 2Slides

Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.

Try For Free