

HubSpot + AI プレゼンテーション: セールスデック自動化プレイブック (2026)
2026年のHubSpotを利用する営業チームにとって、アカウントごとのセールスデック自動化のROIは測定可能です:AE(アカウントエグゼクティブ)あたり平均で週2〜4時間の時間節約、ミーティング間の進行率が12〜18%向上、そしてチーム全体でのデック準備のばらつきが30〜60%削減されます。2026年のHubSpot + 2Slidesワークフローは、HubSpot内に既に存在するデータ(企業情報、商談ステージ、製品への関心、キーパーソン連絡先、競合代替品)を使用して、任意のアカウント向けに完全にパーソナライズされたセールスデックを3つの統合パスで生成します:HubSpot Workflow → Webhook → 2Slides API;カスタムHubSpot App Cardとデック生成ボタン;特定のステージにあるすべての商談の日次一括処理。本プレイブックには、実際のwebhookペイロード、HubSpotフィールドをデックコンテンツに変換するプロンプトテンプレート、そして今日実際の運用で使用されているRevOpsチームが使う2Slides APIフロー(generate → jobs/:id → download)が含まれています。
HubSpotを利用する営業チームの収益オペレーションを担当している方なら、既にこの問題をご存知でしょう:すべてのAEが次の商談の前にデックに「ちょっとした調整」を求めてマーケティングやセールスイネーブルメントに依頼しています。これを40人の担当者と進行中の300件の商談で掛け算すると、Google SlidesテンプレートをSalesforce形式のCRMデータに貼り付けるフルタイムの仕事になります—しかも、HubSpotにはSalesforceのDocument Generationモジュールに相当するネイティブ機能がありません。
本プレイブックでは、HubSpotを2Slides V1 APIに接続して、任意のステージの任意の商談が、人間がスライドマスターに触れることなく、パーソナライズされ、ブランド一貫性があり、チャネル対応のセールスデックを生成できるようにする方法を示します。以下のパターンは、B2B SaaS、サイバーセキュリティ、エンタープライズAI企業のRevOpsチームによって使用され、平均契約額を$40Kから$400K以上に押し上げています。
HubSpot連携プレゼンテーションが勝つ理由
HubSpotから営業プレゼンテーションを自動化するビジネスケースは、3つの測定可能なレバーに基づいています。
レバー1:営業担当者の時間回復。 20席以上の導入をしている2Slides顧客全体の内部観察によると、営業担当者(AE)はプレゼンテーションのカスタマイズに週2〜4時間を費やしています — イントロスライドの書き直し、ロゴの更新、競合他社の弱点の貼り付け、ROI計算ツールの差し替えなど。完全負担コストで年間16万ドルのAEの場合、これは純粋なスライド作業で年間AE1人あたり6,400〜12,800ドルに相当します。40人の営業チームの場合、控えめに見積もっても年間25万6,000ドルの回復可能な生産性です。
レバー2:ミーティング間のコンバージョン。 リアルタイムCRMデータから生成されたプレゼンテーション — つまり、企業の実際の収益帯、キーパーソンの実際の役職、案件記録に実際にリストされている競合他社 — は、汎用テンプレートプレゼンテーションと比較して、次回ミーティングの予約を12〜18%高く獲得します。理由はシンプルです:具体性は準備の充実を示し、準備の充実は営業担当者が2回目のミーティングに値することを示します。
レバー3:バラつきの削減。 トップクォーターのAEは素晴らしいプレゼンテーションを作成します。ボトムクォーターはパイプラインを漏らす平凡なプレゼンテーションを作成します。自動化はボトムを引き上げます。コホートデータでは、HubSpotトリガーによるプレゼンテーション生成を実施しているRevOpsチームは、マネージャーのQAスコアで測定されたプレゼンテーション品質のバラつきが30〜60%削減されたと報告しています。
3つすべてに共通するパターン:プレゼンテーションは製品ではなく、準備が製品です。準備の自動化は、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ワークフロー → 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: ポーリングと配信
2つ目の関数(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スケジュールによる一括処理の方が、リアルタイム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" }
]
}午前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 ?? '未指定'}
- Webサイト: ${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が含まれる場合はフォーマルに、それ以外は会話調に。
- すべてのスライド:1つのアイデア、1つのチャート、または1つの引用、テキストの壁は作らない。
`.trim()
}テンプレートはバージョン管理下に置いてください。マーケティングがメッセージングフレームワークを更新したら、1つのファイルを変更するだけで、次回のcron実行時にそれが反映されます。
競合代替案の処理
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')}
これを使って差別化スライドを作成してください。競合名は2回以上言及しないこと。
`.trim()
}battlecardSection(deal.competitors)の結果をプロンプトに追加します。これでデッキは、通常なら競合インテリジェンスリードとの30分の電話が必要なレベルの、AEグレードの競合フレーミングを持つことになります。
10個以上になったら、ハードコーディングではなくデータベーステーブルにバトルカードを保存しましょう。プロダクトマーケティング責任者がPRを提出せずに編集できるようになります。
よくある質問
毎回プロパティが更新されるたびにHubSpotが重複したデッキを生成するのを防ぐにはどうすればよいですか?
取引オブジェクトに last_deck_generated_at というプロパティを追加し、HubSpot Workflowにフィルターを含めます:last_deck_generated_at が不明、または7日以上経過している場合。トランスフォーマー関数は、生成が成功した後、Deal API経由でこのタイムスタンプをHubSpotに書き戻す必要があります。これだけで無駄なAPI呼び出しの90%を防止できます。
2Slidesクレジットではどのくらいのコストがかかりますか?
各 /api/v1/slides/generate 呼び出しは、スライド数と追加オプション(画像生成、音声ナレーション)に基づいてクレジットを消費します。典型的な10スライドのブランディングされた営業資料の場合、1デッキあたり20〜40クレジットを予算化してください。月間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 が含まれています。指数バックオフで一度再試行し、2回目も失敗した場合は、RevOpsチャネルにSlackアラートを投稿し、静的なテンプレートデッキにフォールバックして、AEが通話前にブロックされないようにします。
まとめ
HubSpotはSalesforceになろうとしておらず、それで問題ありません。そのシンプルさこそが機能なのです。しかし、シンプルさはネイティブなドキュメント自動化が搭載されていないことも意味します。このギャップは欠陥ではなく機能です。なぜなら、HubSpotをAIプレゼンテーションAPIに接続するRevOpsチームが、セールステックスタック内で最も価値のある領域、つまり購入者の前に届くデッキを所有することになるからです。
上記の3つの方法 — ワークフローwebhook、アプリカードボタン、スケジュール済みバッチ — は、営業チームが必要とする生成トリガーの全範囲をカバーしています。ファネルステージに合った方法を選んでください。DiscoveryとDemoステージでは、ほぼ常にオンデマンド(アプリカード)が適しています。ProposalとNegotiationステージでは、ステージ変更時の自動化(ワークフローwebhook)が最も効果的です。パイプラインレビューとQBR準備はバッチ(cron)です。3つすべてを実行すれば、パイプライン内のすべての案件が、毎日、手の届く範囲に新鮮でCRMに忠実なデッキを持つことになります。
HubSpotから営業デッキを自動化しましょう — 2Slides APIキーを取得して、1日以内に次のワークフローに組み込めます。
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free