

HubSpot + AI Presentation: คู่มือระบบอัตโนมัติสำหรับเดคการขาย (2026)
สำหรับทีมขายบน HubSpot ในปี 2026 ผลตอบแทนจากการทำระบบอัตโนมัติสำหรับเดคการขายเฉพาะลูกค้าแต่ละรายสามารถวัดได้ชัดเจน: ประหยัดเวลา AE โดยเฉลี่ย 2–4 ชั่วโมงต่อสัปดาห์, อัตราความสำเร็จจากการประชุมครั้งหนึ่งไปยังครั้งถัดไปเพิ่มขึ้น 12–18%, และลดความแตกต่างในการเตรียมเดคทั่วทั้งทีมได้ 30-60% ระบบการทำงาน HubSpot + 2Slides ปี 2026 สร้างเดคการขายที่ปรับแต่งเฉพาะบุคคลสำหรับลูกค้าใดก็ได้โดยใช้ข้อมูลที่มีอยู่แล้วใน HubSpot (บริษัท, ขั้นตอนดีล, สินค้าที่สนใจ, ผู้ติดต่อหลัก, คู่แข่งทางเลือก) ผ่าน 3 เส้นทางการเชื่อมต่อ: HubSpot Workflow → Webhook → 2Slides API; HubSpot App Card แบบกำหนดเองพร้อมปุ่ม Generate Deck; การประมวลผลแบบแบตช์รายวันอัตโนมัติสำหรับดีลทั้งหมดในขั้นตอนเฉพาะ คู่มือนี้รวมถึงโครงสร้าง webhook payload ที่แน่นอน, เทมเพลต prompt ที่แปลงฟิลด์ใน HubSpot ให้เป็นเนื้อหาเดค, และขั้นตอน 2Slides API (generate → jobs/:id → download) ที่ทีม RevOps จริงใช้งานอยู่ในปัจจุบัน
หากคุณรับผิดชอบด้าน revenue operations สำหรับทีมขายบน HubSpot คุณคงรู้ปัญหานี้อยู่แล้ว: AE ทุกคนขอให้ทีมการตลาดหรือ sales enablement "แก้ไขเล็กน้อย" สำหรับเดคก่อนโทรครั้งถัดไป คูณด้วย 40 คนและดีล 300 รายการที่กำลังดำเนินการอยู่ และคุณจะมีงานเต็มเวลาในการเชื่อมต่อเทมเพลต Google Slides เข้ากับข้อมูล CRM แบบ Salesforce — ยกเว้นว่าคุณใช้ HubSpot ซึ่งไม่มีฟีเจอร์ที่เทียบเท่ากับโมดูล Document Generation ของ Salesforce
คู่มือนี้จะแสดงวิธีการเชื่อมต่อ HubSpot เข้ากับ 2Slides V1 API เพื่อให้ดีลใด ๆ ในขั้นตอนใด ๆ สามารถสร้างเดคการขายที่ปรับแต่งเฉพาะบุคคล, สอดคล้องกับแบรนด์, และพร้อมใช้งานในช่องทางต่าง ๆ — โดยไม่ต้องให้มนุษย์จัดการกับ slide master เลย รูปแบบด้านล่างนี้ใช้โดยทีม RevOps ในบริษัท B2B SaaS, cybersecurity และ enterprise AI เพื่อขับเคลื่อนมูลค่าสัญญาเฉลี่ยตั้งแต่ $40K ถึง $400K+
ทำไมเด็คที่ขับเคลื่อนโดย HubSpot ถึงชนะ
เหตุผลทางธุรกิจสำหรับการทำให้เด็คขายเป็นอัตโนมัติผ่าน HubSpot มาจากตัวขับเคลื่อนที่วัดผลได้สามตัว
ตัวขับเคลื่อนที่ 1: เวลาของ AE ที่กู้คืนมาได้ การสังเกตการณ์ภายในลูกค้า 2Slides ที่มีการใช้งาน 20+ ที่นั่งพบว่า Account Executive ใช้เวลา 2–4 ชั่วโมงต่อสัปดาห์ในการปรับแต่งเด็ค — เขียนสไลด์เปิดใหม่ อัพเดทโลโก้ วางจุดอ่อนของคู่แข่ง เปลี่ยนเครื่องคำนวณ ROI ที่ต้นทุน AE เต็มที่ $160K/ปี นั่นคือ $6,400–$12,800 ต่อ AE ต่อปีในแรงงานสไลด์แท้ๆ สำหรับทีมขาย 40 คน คุณกำลังมองเห็นกำลังการผลิตที่กู้คืนมาได้อย่างระมัดระวัง $256K/ปี
ตัวขับเคลื่อนที่ 2: การคอนเวอร์ทจากการประชุมสู่การประชุม เด็คที่สร้างจากข้อมูล CRM แบบเรียลไทม์ — หมายถึงแถบรายได้จริงของบริษัท ตำแหน่งจริงของ champion คู่แข่งที่ระบุจริงในบันทึกดีล — คอนเวอร์ทการนัดหมายประชุมครั้งถัดไปสูงกว่า 12–18% เมื่อเทียบกับเด็คเทมเพลตทั่วไป เหตุผลง่ายๆ คือ: ความเฉพาะเจาะจงสื่อถึงความพร้อม และความพร้อมสื่อว่าพนักงานขายคุ้มค่ากับการประชุมครั้งที่สอง
ตัวขับเคลื่อนที่ 3: การลดความแปรปรวน AE ในควอร์ไทล์บนสุดของคุณสร้างเด็คที่ยอดเยี่ยม ควอร์ไทล์ล่างสุดสร้างเด็คที่ปานกลางซึ่งทำให้ pipeline รั่วไหล ระบบอัตโนมัติดึงส่วนล่างขึ้นมา ในข้อมูลกลุ่มตัวอย่าง ทีม RevOps ที่ใช้การสร้างเด็คที่ทริกเกอร์โดย HubSpot รายงานการลดความแปรปรวนของคุณภาพเด็ค 30–60% ที่วัดโดยคะแนน QA ของผู้จัดการ
รูปแบบทั่วไปทั้งสามตัว: เด็คไม่ใช่ผลิตภัณฑ์ การเตรียมการ คือผลิตภัณฑ์ การทำให้การเตรียมการเป็นอัตโนมัติคือการเคลื่อนไหวที่มีประโยชน์สูงสุดที่ RevOps สามารถทำได้ในปี 2026 สำหรับการดูเชิงลึกด้าน enablement ดูคู่มือของเราเกี่ยวกับวิธีสร้าง Sales Enablement Deck ด้วย AI
สถาปัตยกรรม HubSpot + 2Slides ปี 2026
ก่อนที่จะเจาะลึกแต่ละวิธี ต่อไปนี้คือสถาปัตยกรรมที่ทุกการใช้งานปฏิบัติตาม:
HubSpot CRM (ดีล, บริษัท, ผู้ติดต่อ) │ ├── ตัวกระตุ้น (workflow, app card, cron) │ ▼ ชั้น Transformer (serverless fn / Zapier / Make) │ - สร้าง prompt จากฟิลด์ CRM │ - เรียก 2Slides V1 API │ ▼ 2Slides V1 API ├── POST /api/v1/slides/generate (คืนค่า jobId) ├── GET /api/v1/jobs/{id} (poll จนกว่า status = success) └── GET /api/v1/slides/download-slides-pages-voices (URL สินทรัพย์) │ ▼ การส่งมอบ (กลับไปที่ HubSpot deal เป็นโน้ต, อีเมลไปยัง AE, Slack DM)
2Slides API เป็นแบบ stateless ต่องาน, asynchronous และวัดด้วยเครดิต คุณยืนยันตัวตนด้วย API key header
x-api-key: sk-2slides-...jobId/api/v1/jobs/{id}pendingprocessingsuccessวิธีที่ 1: HubSpot Workflow → Webhook → 2Slides API
นี่คือเส้นทางการเชื่อมต่อที่ใช้บ่อยที่สุด HubSpot Workflow จะตรวจจับการเปลี่ยนแปลงสเตจใน deal pipeline และส่ง webhook ไปยัง serverless function ที่เชื่อมต่อกับ 2Slides API
ขั้นตอนที่ 1: สร้าง HubSpot Workflow
ใน HubSpot ไปที่ Automation → Workflows → Create workflow → Deal-based ตั้งค่า enrollment trigger:
- Filter: เป็นอย่างใดอย่างหนึ่งใน
Deal stage,Discovery Complete,Demo ScheduledProposal Sent - Re-enrollment: เปิดใช้งานเมื่อมีการเปลี่ยนแปลงสเตจ
เพิ่ม action Send webhook:
- Method:
POST - URL:
https://your-revops-fn.vercel.app/api/hubspot/generate-deck - รวม property groups ,
dealและassociated companyprimary contact
ขั้นตอนที่ 2: Transformer Function
Deploy ฟังก์ชันนี้ไปยัง Vercel, Cloudflare Workers หรือ AWS Lambda ฟังก์ชันจะรับ webhook จาก HubSpot สร้าง prompt สำหรับ 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 วินาที หรือโดย delayed workflow re-entry ของ HubSpot) จะตรวจสอบ
/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: `งานนำเสนอใหม่พร้อมแล้ว: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }
นี่คือรูปแบบเดียวกับที่เราใช้ใน การทำรายงานประจำสัปดาห์อัตโนมัติด้วย Zapier — เรียก generate, ตรวจสอบ, ส่งมอบ — แค่เชื่อมต่อผ่าน HubSpot แทนที่จะเป็น Zapier
วิธีที่ 2: HubSpot App Card พร้อมปุ่ม Generate Deck
วิธีที่ 1 เป็นแบบอัตโนมัติ วิธีที่ 2 เป็นแบบตามต้องการ: AE เปิดดีลใน HubSpot เห็นการ์ดที่กำหนดเองในแถบด้านข้างขวา คลิก Generate Deck และเด็คจะส่งถึงกล่องจดหมายของพวกเขาในอีกสองนาทีถัดมา
วิธีนี้ใช้ UI Extension ของ HubSpot (ส่วนหนึ่งของแพลตฟอร์ม Developer Projects)
โค้ด 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}>Generate Deck</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 logs</Alert>} </Flex> ) }
Serverless Companion
ฟังก์ชัน serverless ที่อ้างอิงข้างต้น (
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()) // Poll สูงสุด 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 object → extension card → API call → inline result — เป็นแนวทางเดียวกันกับที่ทีมการตลาดใช้เมื่อพวกเขาขยายการผลิตเนื้อหา ดูได้ที่ วิธีที่ทีมการตลาดใช้ AI สร้างงานนำเสนอในระดับใหญ่
วิธีที่ 3: การสร้างเป็นชุดตามตารางเวลา
ไม่ใช่ทุกเดคที่ต้องสร้างแบบเรียลไทม์ สำหรับการนำเสนอที่คาดการณ์ได้ เช่น ทุกเช้าวันจันทร์ ทุกไตรมาส หรือทุกครั้งที่มีการอัปเดตขั้นตอน MEDDPICC — การตั้งเวลาสร้างเป็นชุดด้วย cron จะประหยัดและเชื่อถือได้มากกว่า webhook แบบเรียลไทม์
รูปแบบการทำงาน
รันงานตอนกลางคืนที่ดึงข้อมูลดีลทุกรายการจาก 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" } ] }
หกโมงเช้า วันจันทร์-ศุกร์ AE เปิดอีเมล เดคก็พร้อมแล้ว
เทมเพลตพรอมต์ที่แปลงฟิลด์ CRM เป็นเนื้อหาเด็ค
ตัวกำหนดคุณภาพเด็คที่สำคัญที่สุดคือพรอมต์ พรอมต์ที่ดีเข้ารหัสสิ่งที่ Senior AE จะพูดกับพนักงานใหม่: "เมื่อบริษัทเป็น X มีแชมเปี้ยนในบทบาท Y มุ่งเน้นผลลัพธ์ Z ให้สร้างเด็คแบบนี้" เทมเพลตพร้อมคัดลอก:
function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` Generate a 10-12 slide sales deck for a B2B software evaluation. ACCOUNT CONTEXT - Company: ${company.name} - Industry: ${company.industry ?? 'unspecified'} - Annual revenue band: ${company.annualrevenue ?? 'unspecified'} - Employees: ${company.numberofemployees ?? 'unspecified'} - Website: ${company.domain} DEAL CONTEXT - Deal stage: ${deal.dealstage} - Deal amount: $${deal.amount} - Product interest: ${deal.product_interest} - Priority use case: ${deal.primary_use_case} - Competitor shortlist: ${deal.competitors /* comma-separated */} - Evaluation timeline: ${deal.close_date} CHAMPION CONTEXT - Name: ${contact.firstname} ${contact.lastname} - Title: ${contact.jobtitle} - Reported priorities: ${contact.priorities} DECK STRUCTURE 1. Title slide — "${company.name} × <Your Brand>: ${deal.primary_use_case}" 2. Their world today — 3 bullets, specific to ${company.industry} 3. The cost of doing nothing — quantify using ${company.annualrevenue} band 4. Our approach — 3 pillars aligned to ${deal.primary_use_case} 5. Proof — 2 case studies from ${company.industry} (or adjacent) 6. Differentiation vs ${deal.competitors} — see battlecard section below 7. Implementation plan — 30/60/90 tuned to ${deal.close_date} 8. Commercial summary — range anchored to $${deal.amount} 9. Risks and mitigations 10. Next steps — aligned to ${deal.dealstage} TONE - Match audience: ${contact.jobtitle} - Formal if title includes VP, SVP, Chief, Director; conversational otherwise. - Every slide: one idea, one chart or one pull-quote, no walls of text. `.trim() }
เก็บเทมเพลตไว้ภายใต้ version control เมื่อทีมการตลาดอัปเดต messaging framework คุณแค่เปลี่ยนไฟล์เดียวและการรัน cron ครั้งถัดไปจะรับการเปลี่ยนแปลงทันที
การจัดการกับคู่แข่ง
ฟิลด์
deal.competitorsconst 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 ` COMPETITIVE BATTLECARDS ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} ใช้ข้อมูลนี้เพื่อสร้างสไลด์ Differentiation อย่าระบุชื่อคู่แข่งมากกว่าสองครั้ง `.trim() }
เพิ่มผลลัพธ์จาก
battlecardSection(deal.competitors)เก็บ battlecards ไว้ใน database table แทนการเขียนโค้ดตายตัว เมื่อคุณมีมากกว่าสิบรายการ Head of Product Marketing ของคุณสามารถแก้ไขได้โดยไม่ต้องยื่น PR
คำถามที่พบบ่อย
ฉันจะหยุดไม่ให้ HubSpot สร้างเดคซ้ำซ้อนทุกครั้งที่มีการอัปเดตพร็อพเพอร์ตี้ได้อย่างไร?
เพิ่มพร็อพเพอร์ตี้ชื่อ
last_deck_generated_atlast_deck_generated_atใช้เครดิต 2Slides เท่าไหร่?
การเรียก
/api/v1/slides/generateฉันสามารถสร้างเดคในภาษาอื่นนอกเหนือจากอังกฤษได้หรือไม่?
ได้ ส่ง
language: 'de'language: 'ja'language: 'es'/api/v1/slides/generateฉันจะกำหนดแบรนด์ภาพให้ทุกเดคดูเหมือนกันได้อย่างไร?
ใช้
theme_idBRAND_THEME_IDจะเกิดอะไรขึ้นถ้า generation job ล้มเหลว?
ตรวจสอบ
/api/v1/jobs/{id}statusfailederrorสรุป
HubSpot ไม่ได้พยายามจะเป็น Salesforce และนั่นก็ไม่เป็นไร — ความเรียบง่ายคือจุดเด่น แต่ความเรียบง่ายก็หมายความว่ามันไม่มีระบบสร้างเอกสารอัตโนมัติในตัว ช่องว่างนี้เป็นจุดเด่น ไม่ใช่ข้อบกพร่อง เพราะมันหมายความว่าทีม RevOps ที่เชื่อมต่อ HubSpot กับ AI presentation API จะเป็นเจ้าของพื้นที่ที่มีคุณค่าที่สุดใน sales tech stack ของพวกเขา: เดคที่ไปอยู่ต่อหน้าผู้ซื้อ
สามวิธีข้างต้น — workflow webhook, ปุ่ม app card, scheduled batch — ครอบคลุมทริกเกอร์การสร้างทั้งหมดที่ทีมขายต้องการ เลือกวิธีที่เข้ากับขั้นตอนใน funnel ของคุณ ขั้นตอน Discovery และ Demo มักต้องการแบบตามคำสั่งเสมอ (app card) ขั้นตอน Proposal และ Negotiation ได้ประโยชน์สูงสุดจาก automation เมื่อเปลี่ยนขั้นตอน (workflow webhook) การตรวจสอบ pipeline และเตรียม QBR เป็นแบบ batch (cron) เปิดใช้งานทั้งสามวิธีแล้วดีลทุกอันใน pipeline จะมีเดคที่สด ตรง CRM อยู่ใกล้แค่เอื้อม ทุกวัน
สร้างเดคขายอัตโนมัติจาก HubSpot — รับ API key ของ 2Slides และเชื่อมต่อกับ workflow ถัดไปของคุณได้ภายในหนึ่งวัน
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free