

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