2Slides Logo
HubSpot + AI 演示文稿:销售方案自动化实战手册(2026)
2Slides Team
7 min read

HubSpot + AI 演示文稿:销售资料自动化手册(2026)

对于 2026 年使用 HubSpot 的销售团队而言,自动化生成针对每个客户的销售资料的投资回报率是可衡量的:客户经理(AE)平均每周节省 2-4 小时,会议推进率提升 12-18%,团队内部资料准备差异减少 30-60%。2026 年的 HubSpot + 2Slides 工作流程能够利用 HubSpot 中已有的数据(公司信息、交易阶段、产品兴趣、关键联系人、竞争对手替代方案)为任何客户生成完全个性化的销售资料,通过三种集成路径实现:HubSpot 工作流程 → Webhook → 2Slides API;带有"生成资料"按钮的自定义 HubSpot 应用卡片;针对特定阶段所有交易的每日定时批量处理。本手册包含确切的 webhook 负载、将 HubSpot 字段转换为资料内容的提示词模板,以及当前实际生产环境中 RevOps 团队使用的 2Slides API 流程(生成 → jobs/:id → 下载)。

如果您负责 HubSpot 销售团队的营收运营,您一定了解这个问题:每位客户经理在下次电话会议前都要求市场部或销售支持团队对资料进行"微调"。将这个需求乘以四十名销售代表和三百个进行中的交易,您就需要一个全职岗位来将 Google Slides 模板与 Salesforce 风格的 CRM 数据粘合在一起——但您使用的是 HubSpot,它没有与 Salesforce 文档生成模块相当的原生功能。

本手册向您展示如何将 HubSpot 连接到 2Slides V1 API,使任何阶段的任何交易都能生成个性化、品牌一致、可直接使用的销售资料——无需人工接触幻灯片母版。以下模式已被 B2B SaaS、网络安全和企业 AI 公司的 RevOps 团队使用,推动平均合同价值从 4 万美元提升到 40 万美元以上。


目录

为什么 HubSpot 驱动的演示文稿更胜一筹

将销售演示文稿自动化并接入 HubSpot 的商业价值体现在三个可衡量的杠杆上。

**杠杆 1:客户经理时间回收。**通过对 2Slides 20+ 席位部署客户的内部观察显示,客户经理(AE)每周需要花费 2-4 小时进行演示文稿定制——重写介绍页、更新 logo、粘贴竞争对手的弱点、更换 ROI 计算器。按照客户经理 16 万美元/年的完全加载成本计算,这相当于每位客户经理每年在纯幻灯片工作上花费 6,400-12,800 美元。对于一个 40 人的销售团队来说,保守估计每年可以回收 25.6 万美元的产能。

**杠杆 2:会议到会议的转化率。**由实时 CRM 数据生成的演示文稿——即公司的实际营收区间、关键决策者的实际职位、交易记录中实际列出的竞争对手——比通用模板演示文稿的下次会议预订转化率高出 12-18%。原因很简单:具体性传达准备充分,准备充分则表明销售人员值得进行第二次会议。

**杠杆 3:差异性降低。**你的头部四分之一客户经理制作出色的演示文稿。你的底部四分之一制作的平庸演示文稿会导致销售漏斗流失。自动化将底部水平拉升。在队列数据中,运行 HubSpot 触发式演示文稿生成的 RevOps 团队报告称,通过经理 QA 评分衡量的演示文稿质量差异降低了 30-60%。

这三者的共同模式是:演示文稿不是产品,准备工作才是产品。自动化准备工作是 RevOps 在 2026 年可以采取的最高杠杆举措。如需更深入了解赋能方面的内容,请参阅我们的指南如何使用 AI 创建销售赋能演示文稿

2026 HubSpot + 2Slides 架构

在深入了解每种方法之前,以下是每个实现遵循的架构:

HubSpot CRM (交易、公司、联系人) ├── 触发器 (工作流、应用卡片、定时任务) 转换层 (无服务器函数 / Zapier / Make) │ - 从 CRM 字段构建提示词 │ - 调用 2Slides V1 API 2Slides V1 API ├── POST /api/v1/slides/generate (返回 jobId) ├── GET /api/v1/jobs/{id} (轮询直到状态 = success) └── GET /api/v1/slides/download-slides-pages-voices (资源 URLs) 交付 (作为备注返回到 HubSpot 交易、发送邮件给客户经理、Slack 私信)

2Slides API 对每个任务是无状态的、异步的,并按积分计费。您使用 API 密钥头

x-api-key: sk-2slides-...
进行身份验证。每次生成演示文稿都会立即返回一个
jobId
,然后您轮询
/api/v1/jobs/{id}
直到状态从
pending
processing
success
转换。一旦成功,您就可以获取最终的 PPTX、PDF 或单页资源 URLs。

方法 1:HubSpot 工作流 → Webhook → 2Slides API

这是最常见的集成路径。HubSpot 工作流监控交易管道的阶段变化,并向与 2Slides API 通信的无服务器函数触发 webhook。

步骤 1:创建 HubSpot 工作流

在 HubSpot 中,前往自动化 → 工作流 → 创建工作流 → 基于交易。设置注册触发器:

  • 筛选条件:
    交易阶段
    探索完成
    演示已安排
    提案已发送
    中的任意一个
  • 重新注册:在阶段变化时启用

添加发送 webhook 操作:

  • 方法:
    POST
  • URL:
    https://your-revops-fn.vercel.app/api/hubspot/generate-deck
  • 包含
    交易
    关联公司
    主要联系人
    属性组

步骤 2:转换器函数

将此部署到 Vercel、Cloudflare Workers 或 AWS Lambda。该函数接收 HubSpot webhook,组合 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 → 交易关联以便后续查询 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 每周报告自动化中使用的模式相同——一个生成调用、一个轮询、一个交付——只是通过 HubSpot 而不是 Zapier 连接。

方法 2:带生成演示文稿按钮的 HubSpot 应用卡片

方法 1 是自动化的。方法 2 是按需触发:销售代表在 HubSpot 中打开交易,在右侧边栏看到一个自定义卡片,点击生成演示文稿,两分钟后演示文稿就会发送到他们的收件箱。

这使用了 HubSpot UI Extension(开发者项目平台的一部分)。

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>使用 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> ) }

Serverless 配套函数

上述引用的 serverless 函数(

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阶段刷新——定时批量任务比实时webhook更经济、更可靠。

模式

运行每日任务,查询HubSpot中所有处于目标阶段的交易,为每个交易生成全新演示文稿,并通过邮件向销售代表发送晨间摘要。

// /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点执行。销售代表打开邮件时,演示文稿已经准备就绪。

将 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. 他们的现状 — 3 个要点,针对 ${company.industry} 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(客户经理)级别的竞品对比框架——这种内容通常需要与竞争情报负责人进行三十分钟的电话才能获得。

一旦竞品超过十个,就将竞品对比卡片存储在数据库表中,而不是硬编码。这样你的产品营销主管就可以直接编辑它们,而无需提交 PR。

常见问题解答

如何防止 HubSpot 在每次属性更新时生成重复的演示文稿?

在交易对象中添加一个名为

last_deck_generated_at
的属性,并在 HubSpot 工作流中包含过滤条件:
last_deck_generated_at
未知或超过 7 天。您的转换函数应在成功生成后通过 Deal API 将此时间戳写回 HubSpot。仅此一项就能防止 90% 的 API 调用浪费。

这在 2Slides 积分方面需要多少成本?

每次

/api/v1/slides/generate
调用会根据幻灯片数量和任何附加功能(图像生成、语音旁白)扣除积分。对于一个典型的 10 张幻灯片销售演示文稿(包含品牌图像),每个演示文稿预算 20-40 个积分。一个 RevOps 团队每月生成 500 个演示文稿的费用在 150-400 美元之间——远低于在单笔企业交易上节省的客户经理人工成本。

我可以生成英语以外的其他语言的演示文稿吗?

可以。在

/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 警报,并回退到静态模板演示文稿,以确保客户经理在通话前不会被阻塞。

总结

HubSpot 并不试图成为 Salesforce,这完全没问题——它的简洁性本身就是特色。但简洁性也意味着它不提供原生文档自动化功能。这个缺口是特性而非缺陷,因为这意味着将 HubSpot 连接到 AI 演示文稿 API 的 RevOps 团队掌控着销售技术栈中最有价值的接触面:呈现在买家面前的演示文稿。

上述三种方法——工作流 webhook、应用卡片按钮、定时批量处理——涵盖了销售团队所需的全部生成触发场景。选择与您漏斗阶段相匹配的方法。发现和演示阶段几乎总是需要按需生成(应用卡片)。提案和谈判阶段最受益于阶段变更时的自动化(工作流 webhook)。管道审查和 QBR 准备是批量处理(定时任务)。三种方法同时运行,管道中的每笔交易每天都能触手可及地获得一份新鲜的、符合 CRM 真实数据的演示文稿。

从 HubSpot 自动化您的销售演示文稿——获取 2Slides API 密钥,在一天内将其接入您的下一个工作流。

About 2Slides

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

Try For Free