

HubSpot + AI Presentation: Tài liệu tự động hóa Sales Deck (2026)
Đối với các đội ngũ bán hàng sử dụng HubSpot năm 2026, ROI của việc tự động hóa sales deck theo từng tài khoản có thể đo lường được: tiết kiệm trung bình 2–4 giờ mỗi tuần cho mỗi AE, tăng 12–18% tỷ lệ chuyển đổi giữa các cuộc họp, và giảm 30-60% sự chênh lệch trong chuẩn bị deck giữa các thành viên trong nhóm. Quy trình HubSpot + 2Slides năm 2026 tạo ra một sales deck được cá nhân hóa hoàn toàn cho bất kỳ tài khoản nào bằng cách sử dụng dữ liệu đã có sẵn trong HubSpot (công ty, giai đoạn deal, sản phẩm quan tâm, liên hệ chính, đối thủ cạnh tranh) thông qua ba phương thức tích hợp: HubSpot Workflow → Webhook → 2Slides API; HubSpot App Card tùy chỉnh với nút Generate Deck; lên lịch xử lý hàng loạt hàng ngày cho tất cả các deal ở giai đoạn cụ thể. Tài liệu này bao gồm webhook payload chính xác, mẫu prompt chuyển đổi các trường HubSpot thành nội dung deck, và quy trình 2Slides API (generate → jobs/:id → download) đang được các đội ngũ RevOps thực tế sử dụng trong sản xuất hiện nay.
Nếu bạn điều hành revenue operations cho một đội ngũ bán hàng trên HubSpot, bạn đã biết vấn đề: mỗi AE đều yêu cầu marketing hoặc sales enablement "chỉnh sửa một chút" deck trước cuộc gọi tiếp theo của họ. Nhân con số đó với bốn mươi rep và ba trăm deal đang tiến hành, bạn sẽ có một công việc toàn thời gian dán các template Google Slides vào dữ liệu CRM kiểu Salesforce — ngoại trừ việc bạn đang dùng HubSpot, nền tảng không có tương đương native với module Document Generation của Salesforce.
Tài liệu này chỉ cho bạn cách kết nối HubSpot với 2Slides V1 API để bất kỳ deal nào ở bất kỳ giai đoạn nào cũng có thể tạo ra một sales deck được cá nhân hóa, nhất quán thương hiệu, sẵn sàng triển khai — mà không cần con người chạm vào slide master. Các mô hình dưới đây được sử dụng bởi các đội ngũ RevOps trong B2B SaaS, an ninh mạng, và các công ty AI doanh nghiệp để thúc đẩy giá trị hợp đồng trung bình từ $40K đến $400K+.
Tại Sao Các Bản Trình Bày Từ HubSpot Luôn Thắng Thế
Lý do kinh doanh để tự động hóa các bản trình bày bán hàng từ HubSpot đến từ ba đòn bẩy có thể đo lường được.
Đòn bẩy 1: Thời gian thu hồi của AE. Quan sát nội bộ trên các khách hàng 2Slides với triển khai từ 20+ chỗ ngồi trở lên cho thấy các account executive dành 2–4 giờ mỗi tuần để tùy chỉnh bản trình bày — viết lại slide giới thiệu, cập nhật logo, dán vào điểm yếu của đối thủ cạnh tranh, thay đổi công cụ tính ROI. Với chi phí đầy đủ của một AE là $160K/năm, đó là $6,400–$12,800 mỗi AE mỗi năm chỉ cho công việc slide. Đối với đội ngũ bán hàng 40 người, bạn đang nhìn vào con số bảo thủ là $256K/năm trong năng lực được thu hồi.
Đòn bẩy 2: Tỷ lệ chuyển đổi giữa các cuộc họp. Các bản trình bày được tạo từ dữ liệu CRM trực tiếp — nghĩa là phân khúc doanh thu thực tế của công ty, chức danh thực tế của champion, đối thủ cạnh tranh thực sự được liệt kê trong hồ sơ giao dịch — chuyển đổi đặt lịch cuộc họp tiếp theo cao hơn 12–18% so với các bản trình bày template chung chung. Lý do rất đơn giản: tính cụ thể báo hiệu sự chuẩn bị kỹ lưỡng, và sự chuẩn bị kỹ lưỡng báo hiệu rằng một nhân viên bán hàng đáng để có cuộc họp thứ hai.
Đòn bẩy 3: Giảm độ biến thiên. Các AE trong tứ phân vị hàng đầu của bạn xây dựng các bản trình bày tuyệt vời. Tứ phân vị dưới cùng của bạn xây dựng các bản trình bày tầm thường làm rò rỉ pipeline. Tự động hóa kéo phần dưới lên. Trong dữ liệu cohort, các đội ngũ RevOps chạy tạo bản trình bày kích hoạt từ HubSpot báo cáo giảm 30–60% độ biến thiên chất lượng bản trình bày được đo bằng điểm QA của người quản lý.
Mô hình chung trên cả ba: bản trình bày không phải là sản phẩm, quá trình chuẩn bị mới là sản phẩm. Tự động hóa việc chuẩn bị là động thái có đòn bẩy cao nhất mà RevOps có thể thực hiện trong năm 2026. Để tìm hiểu sâu hơn về khía cạnh kích hoạt, xem hướng dẫn của chúng tôi về cách tạo bản trình bày kích hoạt bán hàng với AI.
Kiến trúc HubSpot + 2Slides 2026
Trước khi đi sâu vào từng phương pháp, đây là kiến trúc mà mọi triển khai đều tuân theo:
HubSpot CRM (deals, companies, contacts) │ ├── Trigger (workflow, app card, cron) │ ▼ Transformer Layer (serverless fn / Zapier / Make) │ - Builds prompt from CRM fields │ - Calls 2Slides V1 API │ ▼ 2Slides V1 API ├── POST /api/v1/slides/generate (returns jobId) ├── GET /api/v1/jobs/{id} (poll until status = success) └── GET /api/v1/slides/download-slides-pages-voices (asset URLs) │ ▼ Delivery (back to HubSpot deal as note, email to AE, Slack DM)
2Slides API không lưu trạng thái cho mỗi job, hoạt động bất đồng bộ và tính phí theo credit. Bạn xác thực bằng API key header
x-api-key: sk-2slides-...jobId/api/v1/jobs/{id}pendingprocessingsuccessPhương pháp 1: HubSpot Workflow → Webhook → 2Slides API
Đây là cách tích hợp phổ biến nhất. HubSpot Workflow theo dõi thay đổi giai đoạn trên deal pipeline và kích hoạt webhook tới một serverless function giao tiếp với 2Slides API.
Bước 1: Tạo HubSpot Workflow
Trong HubSpot, vào Automation → Workflows → Create workflow → Deal-based. Thiết lập trigger enrollment:
- Filter: là bất kỳ
Deal stage,Discovery Complete,Demo ScheduledProposal Sent - Re-enrollment: bật khi có thay đổi giai đoạn
Thêm action Send webhook:
- Method:
POST - URL:
https://your-revops-fn.vercel.app/api/hubspot/generate-deck - Include các nhóm thuộc tính ,
deal, vàassociated companyprimary contact
Bước 2: Transformer Function
Triển khai lên Vercel, Cloudflare Workers, hoặc AWS Lambda. Function nhận webhook từ HubSpot, soạn prompt cho 2Slides, và khởi chạy việc tạo bài thuyết trình.
// /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, // theme thương hiệu cố định của bạn metadata: { hubspot_deal_id: deal.hs_object_id, account: company.name, }, }), }) const { jobId } = await generateRes.json() // Lưu liên kết jobId -> deal để tra cứu sau await kv.set(`deal:${deal.hs_object_id}:job`, jobId, { ex: 86400 }) return Response.json({ ok: true, jobId }) }
Bước 3: Poll và Gửi Kết Quả
Một function thứ hai (được gọi bởi Vercel Cron mỗi 90 giây, hoặc bởi delayed workflow re-entry của HubSpot) kiểm tra
/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: `Bài thuyết trình mới đã sẵn sàng: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }
Đây là cùng một pattern mà chúng tôi sử dụng trong tự động hóa báo cáo hàng tuần với Zapier — một lệnh gọi generate, một lần poll, một lần gửi kết quả — chỉ khác là được kết nối qua HubSpot thay vì Zapier.
Phương pháp 2: Thẻ Ứng dụng HubSpot với Nút Tạo Bộ Trình bày
Phương pháp 1 là tự động. Phương pháp 2 là theo yêu cầu: AE mở một deal trong HubSpot, thấy một thẻ tùy chỉnh ở thanh bên phải, nhấp vào Tạo Bộ Trình bày, và bộ trình bày sẽ được gửi đến hộp thư đến của họ sau hai phút.
Phương pháp này sử dụng UI Extension của HubSpot (một phần của nền tảng Developer Projects).
Mã 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>Tạo bộ trình bày bán hàng được cá nhân hóa cho tài khoản này bằng 2Slides.</Text> {state === 'idle' && <Button onClick={onClick}>Tạo Bộ Trình bày</Button>} {state === 'working' && <LoadingSpinner label="Đang xây dựng bộ trình bày (90–120 giây)" />} {state === 'done' && deckUrl && ( <Alert title="Bộ trình bày đã sẵn sàng"> <a href={deckUrl} target="_blank" rel="noreferrer">Mở bộ trình bày</a> </Alert> )} {state === 'error' && <Alert variant="danger">Tạo bộ trình bày thất bại — kiểm tra nhật ký RevOps.</Alert>} </Flex> ) }
Hàm Serverless Đi kèm
Hàm serverless được tham chiếu ở trên (
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()) // Kiểm tra trong tối đa 3 phút 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 || 'tạo bộ trình bày thất bại') } throw new Error('hết thời gian chờ') }
Mô hình này — đối tượng CRM → thẻ extension → lời gọi API → kết quả ngay lập tức — là cùng một cách tiếp cận mà các đội marketing sử dụng khi họ mở rộng quy mô sản xuất nội dung; xem cách các đội marketing chạy bộ trình bày AI ở quy mô lớn.
Phương pháp 3: Tạo Hàng loạt Theo Lịch
Không phải bản trình bày nào cũng cần được tạo theo yêu cầu. Đối với những buổi đánh giá pipeline có thể dự đoán được — mỗi sáng thứ Hai, mỗi quý kinh doanh, mỗi lần làm mới giai đoạn MEDDPICC — một batch theo lịch cron sẽ rẻ hơn và đáng tin cậy hơn webhook thời gian thực.
Mô hình
Chạy một công việc hàng đêm truy vấn HubSpot cho mọi deal ở giai đoạn mục tiêu, tạo bản trình bày mới cho từng deal và gửi email tổng hợp buổi sáng cho AE.
// /api/cron/nightly-deck-refresh.ts export const runtime = 'nodejs' export const maxDuration = 300 export async function GET(req: Request) { // Vercel Cron bảo vệ bằng 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 }) }
Lên lịch trong
vercel.json{ "crons": [ { "path": "/api/cron/nightly-deck-refresh", "schedule": "0 6 * * 1-5" } ] }
Sáu giờ sáng, các ngày trong tuần. AE mở email, bản trình bày đã sẵn sàng.
Mẫu Prompt Chuyển Đổi Dữ Liệu CRM Thành Nội Dung Deck
Yếu tố quyết định lớn nhất đến chất lượng deck chính là prompt. Prompt tốt mã hóa những gì một AE senior sẽ nói với nhân viên mới: "khi công ty là X, với champion ở vị trí Y, tập trung vào kết quả Z, thì xây dựng deck như thế này." Mẫu sẵn sàng để sao chép:
function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` Tạo deck bán hàng 10-12 slide cho đánh giá phần mềm B2B. BỐI CẢNH TÀI KHOẢN - Công ty: ${company.name} - Ngành: ${company.industry ?? 'không xác định'} - Dải doanh thu hàng năm: ${company.annualrevenue ?? 'không xác định'} - Nhân viên: ${company.numberofemployees ?? 'không xác định'} - Website: ${company.domain} BỐI CẢNH DEAL - Giai đoạn deal: ${deal.dealstage} - Giá trị deal: $${deal.amount} - Sản phẩm quan tâm: ${deal.product_interest} - Use case ưu tiên: ${deal.primary_use_case} - Danh sách đối thủ: ${deal.competitors /* phân tách bằng dấu phẩy */} - Timeline đánh giá: ${deal.close_date} BỐI CẢNH CHAMPION - Tên: ${contact.firstname} ${contact.lastname} - Chức danh: ${contact.jobtitle} - Ưu tiên đã báo cáo: ${contact.priorities} CẤU TRÚC DECK 1. Slide tiêu đề — "${company.name} × <Thương Hiệu Của Bạn>: ${deal.primary_use_case}" 2. Thực trạng hiện tại của họ — 3 gạch đầu dòng, cụ thể cho ${company.industry} 3. Chi phí của việc không làm gì — định lượng sử dụng dải ${company.annualrevenue} 4. Phương pháp của chúng tôi — 3 trụ cột phù hợp với ${deal.primary_use_case} 5. Bằng chứng — 2 case study từ ${company.industry} (hoặc liên quan) 6. Điểm khác biệt so với ${deal.competitors} — xem phần battlecard bên dưới 7. Kế hoạch triển khai — 30/60/90 điều chỉnh theo ${deal.close_date} 8. Tóm tắt thương mại — phạm vi neo giá tại $${deal.amount} 9. Rủi ro và giải pháp giảm thiểu 10. Bước tiếp theo — phù hợp với ${deal.dealstage} GIỌ ĐIỆU - Phù hợp với đối tượng: ${contact.jobtitle} - Trang trọng nếu chức danh bao gồm VP, SVP, Chief, Director; ngược lại thì thân thiện. - Mỗi slide: một ý tưởng, một biểu đồ hoặc một trích dẫn, không có đoạn văn dài. `.trim() }
Giữ mẫu này dưới kiểm soát phiên bản. Khi marketing cập nhật framework thông điệp, bạn chỉ cần thay đổi một file và lần chạy cron tiếp theo sẽ áp dụng ngay.
Xử Lý Các Đối Thủ Cạnh Tranh
Trường
deal.competitorsconst BATTLECARDS: Record<string, string> = { 'Competitor A': ` Competitor A định vị trên <tuyên bố của họ>. Phản bác: <điểm chứng minh của bạn> + <khẩu hiệu 3 từ>. Câu hỏi mìn để đặt: "Khi nào cuộc kiểm toán bảo mật cuối cùng của họ được công bố?" `, 'Competitor B': ` Competitor B dẫn đầu với <góc độ của họ>. Phản bác: <lập luận phản bác của bạn> — tham chiếu case khách hàng <tên khách hàng> chuyển đổi. Câu hỏi mìn: "Hỏi về giới hạn mỗi chỗ ngồi của họ khi vượt quá 500 người dùng." `, } function battlecardSection(competitorsCsv: string) { const names = competitorsCsv.split(',').map(s => s.trim()).filter(Boolean) if (!names.length) return '' return ` BATTLECARDS CẠNH TRANH ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} Sử dụng thông tin này để điền vào slide Phân Biệt. Không bao giờ nhắc tên đối thủ cạnh tranh quá hai lần. `.trim() }
Thêm kết quả của
battlecardSection(deal.competitors)Lưu trữ battlecards trong bảng cơ sở dữ liệu thay vì hard-code chúng khi bạn có nhiều hơn mười đối thủ. Head of Product Marketing của bạn có thể chỉnh sửa chúng mà không cần tạo PR.
Câu Hỏi Thường Gặp
Làm thế nào để ngăn HubSpot tạo bản trình bày trùng lặp mỗi khi cập nhật thuộc tính?
Thêm một thuộc tính có tên
last_deck_generated_atlast_deck_generated_atChi phí này tốn bao nhiêu credits 2Slides?
Mỗi lệnh gọi
/api/v1/slides/generateTôi có thể tạo bản trình bày bằng ngôn ngữ khác tiếng Anh không?
Có. Truyền
language: 'de'language: 'ja'language: 'es'/api/v1/slides/generateLàm thế nào để cố định thương hiệu hình ảnh để mọi bản trình bày trông giống hệt nhau?
Sử dụng
theme_idBRAND_THEME_IDĐiều gì xảy ra nếu công việc tạo thất bại?
Poll
/api/v1/jobs/{id}statusfailederrorKết luận
HubSpot không cố gắng trở thành Salesforce, và điều đó hoàn toàn ổn — sự đơn giản chính là tính năng. Nhưng sự đơn giản cũng có nghĩa là nó không có sẵn chức năng tự động hóa tài liệu. Khoảng trống này là một tính năng, không phải lỗi, bởi vì điều đó có nghĩa là đội ngũ RevOps kết nối HubSpot với API tạo bài thuyết trình AI sẽ sở hữu bề mặt có giá trị nhất trong hệ thống công nghệ bán hàng của họ: bộ slide xuất hiện trước mặt người mua.
Ba phương pháp trên — workflow webhook, nút app card, batch theo lịch — bao phủm đầy đủ các kịch bản kích hoạt tạo tài liệu mà đội bán hàng cần. Chọn phương pháp phù hợp với giai đoạn phễu bán hàng của bạn. Các giai đoạn Discovery và Demo hầu như luôn cần tạo theo yêu cầu (app card). Các giai đoạn Proposal và Negotiation được hưởng lợi nhiều nhất từ tự động hóa khi thay đổi giai đoạn (workflow webhook). Đánh giá pipeline và chuẩn bị QBR là batch (cron). Chạy cả ba phương pháp và mọi deal trong pipeline sẽ có một bộ deck mới, trung thực với CRM, trong tầm tay, mỗi ngày.
Tự động hóa bộ slide bán hàng từ HubSpot — lấy API key 2Slides và tích hợp vào workflow tiếp theo của bạn trong vòng chưa đầy một ngày.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free