2Slides Logo
HubSpot + AI Sunum: Satış Sunumu Otomasyonu Rehberi (2026)
2Slides Team
13 min read

HubSpot + AI Sunum: Satış Sunum Otomasyonu Rehberi (2026)

2026'da HubSpot kullanan satış ekipleri için hesap bazlı satış sunumlarını otomatikleştirmenin yatırım getirisi ölçülebilir: ortalama Hesap Yöneticisi başına haftada 2-4 saat zaman tasarrufu, toplantıdan toplantıya geçişte %12-18 artış ve ekip genelinde sunum hazırlık varyansında %30-60 azalma. 2026 HubSpot + 2Slides iş akışı, HubSpot'ta zaten mevcut olan verilerle (şirket, anlaşma aşaması, ürün ilgisi, şampiyon iletişim, rekabetçi alternatifler) herhangi bir hesap için tamamen kişiselleştirilmiş bir satış sunumu oluşturur. Üç entegrasyon yolu mevcuttur: HubSpot Workflow → Webhook → 2Slides API; Sunum Oluştur butonu içeren özel HubSpot App Card; belirli bir aşamadaki tüm anlaşmalar için planlanmış günlük toplu işlem. Bu rehber, HubSpot alanlarını sunum içeriğine dönüştüren tam webhook payload'unu, prompt şablonunu ve bugün gerçek RevOps ekipleri tarafından üretimde kullanılan 2Slides API akışını (generate → jobs/:id → download) içermektedir.

HubSpot üzerinde bir satış ekibi için gelir operasyonlarını yönetiyorsanız, sorunu zaten biliyorsunuzdur: her Hesap Yöneticisi, bir sonraki görüşmesi öncesinde sunuma "sadece küçük bir ayarlama" yapılması için pazarlama veya satış etkinleştirme ekibinden yardım istiyor. Bunu kırk temsilci ve devam eden üç yüz anlaşmayla çarpın ve Google Slides şablonlarını Salesforce tarzı CRM verilerine yapıştırmak tam zamanlı bir iş haline gelir — üstelik Salesforce'un Belge Oluşturma modülüne eşdeğer yerel bir özelliği olmayan HubSpot'tasınız.

Bu rehber, herhangi bir aşamadaki herhangi bir anlaşmanın, bir insanın slayt yöneticisine dokunmadan kişiselleştirilmiş, marka tutarlı, kanala hazır bir satış sunumu oluşturabilmesi için HubSpot'u 2Slides V1 API'ye nasıl bağlayacağınızı göstermektedir. Aşağıdaki paternler, B2B SaaS, siber güvenlik ve kurumsal AI şirketlerindeki RevOps ekipleri tarafından $40K ile $400K+ arasında ortalama sözleşme değerlerini artırmak için kullanılmaktadır.

HubSpot Entegreli Sunumlar Neden Kazanır

Satış sunumlarını HubSpot üzerinden otomatikleştirmenin iş gerekçesi, üç ölçülebilir kaldıraçtan gelir.

Kaldıraç 1: AE zamanı kazanımı. 20+ kullanıcılı dağıtımlara sahip 2Slides müşterileri arasında yapılan iç gözlemlerde, hesap yöneticilerinin (account executive) haftalık 2-4 saatlerini sunum özelleştirmesine harcadığı görülüyor — giriş slaytlarını yeniden yazma, logoları güncelleme, rakibin zayıf noktalarını yapıştırma, ROI hesaplayıcılarını değiştirme. Tam maliyetli bir AE'nin yıllık 160K$ olduğu düşünüldüğünde, bu her AE için yılda 6.400-12.800$ saf slayt emeği demektir. 40 kişilik bir satış ekibi için muhafazakar bir tahminle yılda 256K$ kazanılmış kapasite söz konusudur.

Kaldıraç 2: Toplantıdan toplantıya dönüşüm. Canlı CRM verilerinden üretilen sunumlar — yani şirketin gerçek gelir bandı, karar vericinin gerçek unvanı, anlaşma kaydında gerçekten listelenen rakip — jenerik şablon sunumlara göre %12-18 daha yüksek bir sonraki toplantı rezervasyonu dönüşümü sağlar. Nedeni basittir: özgüllük hazırlıklılığı işaret eder ve hazırlıklılık bir satış elemanının ikinci bir toplantıya değer olduğunu gösterir.

Kaldıraç 3: Varyans azaltma. En üst çeyrek AE'leriniz harika sunumlar oluşturur. En alt çeyreğiniz ise potansiyel satış hattını kaybettiren vasat sunumlar yapar. Otomasyon, en altı yukarı çeker. Kohort verilerinde, HubSpot tetiklemeli sunum üretimi kullanan RevOps ekipleri, yönetici kalite güvence skorlarıyla ölçülen sunum kalitesi varyansında %30-60 azalma bildiriyor.

Üçünde de ortak kalıp: sunum ürün değildir, hazırlık üründür. Hazırlığı otomatikleştirmek, RevOps'un 2026'da yapabileceği en yüksek kaldıraçlı harekettir. Yetkinlendirme tarafına daha derin bir bakış için, AI ile satış yetkinlendirme sunumları nasıl oluşturulur rehberimize bakın.

2026 HubSpot + 2Slides Mimarisi

Her yönteme dalmadan önce, tüm uygulamaların takip ettiği mimari şu şekildedir:

HubSpot CRM (fırsatlar, şirketler, kişiler) ├── Tetikleyici (workflow, uygulama kartı, cron) Dönüştürücü Katman (serverless fn / Zapier / Make) │ - CRM alanlarından prompt oluşturur │ - 2Slides V1 API'yi çağırır 2Slides V1 API ├── POST /api/v1/slides/generate (jobId döndürür) ├── GET /api/v1/jobs/{id} (durum = success olana kadar yoklama) └── GET /api/v1/slides/download-slides-pages-voices (varlık URL'leri) Teslimat (HubSpot fırsatına not olarak geri, AE'ye e-posta, Slack DM)

2Slides API iş başına durumsuz (stateless), asenkron ve kredi ölçümlüdür.

x-api-key: sk-2slides-...
header'ı ile kimlik doğrulama yaparsınız. Her sunum oluşturma işlemi anında bir
jobId
döndürür ve durum
pending
processing
success
olana kadar
/api/v1/jobs/{id}
endpoint'ini yoklarsınız. Başarılı olduktan sonra, nihai PPTX, PDF veya sayfa başına varlık URL'lerini alırsınız.

Yöntem 1: HubSpot Workflow → Webhook → 2Slides API

Bu en yaygın entegrasyon yoludur. Bir HubSpot Workflow, anlaşma hattındaki aşama değişikliğini izler ve 2Slides API ile iletişim kuran sunucusuz bir fonksiyona webhook tetikler.

Adım 1: HubSpot Workflow Oluşturma

HubSpot'ta Otomasyon → Workflows → Workflow oluştur → Anlaşma tabanlı bölümüne gidin. Kayıt tetikleyicisini ayarlayın:

  • Filtre:
    Anlaşma aşaması
    şunlardan herhangi biri
    Keşif Tamamlandı
    ,
    Demo Planlandı
    ,
    Teklif Gönderildi
  • Yeniden kayıt: aşama değişikliğinde etkinleştirildi

Bir Webhook gönder eylemi ekleyin:

  • Yöntem:
    POST
  • URL:
    https://your-revops-fn.vercel.app/api/hubspot/generate-deck
  • deal
    ,
    ilişkili şirket
    ve
    birincil iletişim
    özellik gruplarını dahil edin

Adım 2: Dönüştürücü Fonksiyon

Bunu Vercel, Cloudflare Workers veya AWS Lambda'ya deploy edin. Fonksiyon HubSpot webhook'unu alır, 2Slides prompt'unu oluşturur ve üretimi başlatır.

// /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, // kilitli marka temanız metadata: { hubspot_deal_id: deal.hs_object_id, account: company.name, }, }), }) const { jobId } = await generateRes.json() // jobId -> anlaşma ilişkilendirmesini sonraki sorgu için kaydet await kv.set(`deal:${deal.hs_object_id}:job`, jobId, { ex: 86400 }) return Response.json({ ok: true, jobId }) }

Adım 3: Sorgulama ve Teslim

İkinci bir fonksiyon (her 90 saniyede bir Vercel Cron tarafından veya HubSpot'un gecikmeli workflow yeniden girişi ile çağrılır)

/api/v1/jobs/{id}
adresini sorgular ve başarı durumunda sunum URL'sini anlaşmaya bir etkileşim notu olarak yazar:

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: `Yeni sunum hazır: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }

Bu, Zapier haftalık rapor otomasyonumuzda kullandığımız desenin aynısıdır — bir üretim çağrısı, bir sorgulama, bir teslim — sadece Zapier yerine HubSpot üzerinden bağlanmıştır.

Yöntem 2: Generate Deck Butonu ile HubSpot App Card

Yöntem 1 otomatiktir. Yöntem 2 ise talep üzerinedir: AE, HubSpot'ta bir deal'ı açar, sağ kenar çubuğunda özel bir kart görür, Generate Deck düğmesine tıklar ve deck iki dakika sonra gelen kutusuna düşer.

Bu, bir HubSpot UI Extension kullanır (Developer Projects platformunun bir parçası).

UI Extension Kodu

// 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 kullanarak bu hesap için kişiselleştirilmiş bir satış sunumu oluşturun.</Text> {state === 'idle' && <Button onClick={onClick}>Generate Deck</Button>} {state === 'working' && <LoadingSpinner label="Sunum hazırlanıyor (90–120s)" />} {state === 'done' && deckUrl && ( <Alert title="Sunum hazır"> <a href={deckUrl} target="_blank" rel="noreferrer">Sunumu aç</a> </Alert> )} {state === 'error' && <Alert variant="danger">Oluşturma başarısız — RevOps loglarını kontrol edin.</Alert>} </Flex> ) }

Serverless Yardımcısı

Yukarıda referans verilen serverless fonksiyonu (

generateDeck
), aynı HubSpot app projesinde bulunur ve Yöntem 1 ile aynı
/api/v1/slides/generate
+
/api/v1/jobs/{id}
akışını çağırır, ancak karta deck URL'sini döndürmeden önce iş başarılı olana kadar (veya zaman aşımına uğrayana kadar) bekler.

// 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 dakikaya kadar yokla 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 || 'oluşturma başarısız') } throw new Error('zaman aşımı') }

Bu pattern — CRM objesi → extension kartı → API çağrısı → satır içi sonuç — pazarlama ekiplerinin içerik üretimini ölçeklendirirken kullandığı yaklaşımın aynısıdır; pazarlama ekiplerinin AI sunum destelerini ölçekte nasıl çalıştırdığını inceleyin.

Yöntem 3: Zamanlanmış Toplu Üretim

Her sunumun talep üzerine oluşturulması gerekmez. Öngörülebilir pipeline incelemeleri için — her Pazartesi sabahı, her çeyreklik iş değerlendirmesi, her MEDDPICC aşaması yenilemesi — cron ile zamanlanmış toplu üretim, gerçek zamanlı webhook'lardan daha ucuz ve daha güvenilirdir.

Desen

HubSpot'ta hedef aşamadaki her fırsatı sorgulayan, her biri için yeni bir sunum oluşturan ve satış temsilcisine sabah özeti e-postası gönderen gecelik bir iş çalıştırın.

// /api/cron/nightly-deck-refresh.ts export const runtime = 'nodejs' export const maxDuration = 300 export async function GET(req: Request) { // Vercel Cron, CRON_SECRET ile koruma sağlar 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
içinde zamanlama:

{ "crons": [ { "path": "/api/cron/nightly-deck-refresh", "schedule": "0 6 * * 1-5" } ] }

Sabah altı, hafta içi. Satış temsilcisi e-postayı açar, sunum hazır bekler.

CRM Alanlarını Sunum İçeriğine Dönüştüren Prompt Şablonu

Sunum kalitesini belirleyen en büyük faktör prompt'tur. İyi prompt'lar, kıdemli bir satış yöneticisinin yeni bir çalışana söyleyeceği şeyleri kodlar: "şirket X olduğunda, Y rolünde bir şampiyon varken, Z sonuca odaklanıldığında, sunumu böyle oluştur." Yapıştırmaya hazır şablon:

function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` B2B yazılım değerlendirmesi için 10-12 slaytlık bir satış sunumu oluştur. HESAP BAĞLAMI - Şirket: ${company.name} - Sektör: ${company.industry ?? 'belirtilmemiş'} - Yıllık gelir bandı: ${company.annualrevenue ?? 'belirtilmemiş'} - Çalışan sayısı: ${company.numberofemployees ?? 'belirtilmemiş'} - Web sitesi: ${company.domain} ANLAŞMA BAĞLAMI - Anlaşma aşaması: ${deal.dealstage} - Anlaşma tutarı: $${deal.amount} - Ürün ilgisi: ${deal.product_interest} - Öncelikli kullanım senaryosu: ${deal.primary_use_case} - Rakip kısa listesi: ${deal.competitors /* virgülle ayrılmış */} - Değerlendirme zaman çizelgesi: ${deal.close_date} ŞAMPİYON BAĞLAMI - İsim: ${contact.firstname} ${contact.lastname} - Ünvan: ${contact.jobtitle} - Bildirilen öncelikler: ${contact.priorities} SUNUM YAPISI 1. Başlık slaytı — "${company.name} × <Markanız>: ${deal.primary_use_case}" 2. Bugünkü dünyaları — ${company.industry} sektörüne özgü 3 madde 3. Hiçbir şey yapmama maliyeti — ${company.annualrevenue} bandını kullanarak ölçümle 4. Yaklaşımımız — ${deal.primary_use_case} ile uyumlu 3 temel sütun 5. Kanıt — ${company.industry} sektöründen (veya yakın sektörlerden) 2 vaka çalışması 6. ${deal.competitors} karşısında farklılaşma — aşağıdaki savaş kartı bölümüne bakın 7. Uygulama planı — ${deal.close_date} tarihine uyarlanmış 30/60/90 8. Ticari özet — $${deal.amount} tutarına dayalı aralık 9. Riskler ve azaltma önlemleri 10. Sonraki adımlar — ${deal.dealstage} ile uyumlu TON - Hedef kitleye uygun: ${contact.jobtitle} - Ünvan VP, SVP, Chief, Director içeriyorsa resmi; aksi halde samimi. - Her slayt: bir fikir, bir grafik veya bir alıntı, metin duvarı yok. `.trim() }

Şablonu versiyon kontrolü altında tutun. Pazarlama ekibi mesajlaşma çerçevesini güncellediğinde, tek bir dosyayı değiştirirsiniz ve bir sonraki cron çalışması bunu alır.

Rekabetçi Alternatifleri Ele Alma

HubSpot'taki

deal.competitors
alanı — ister özel tek satırlık metin alanı, ister çoklu onay kutusu veya açılır menü olsun — altın değerindedir. Koşullu olarak prompt'a bir battlecard bloğu enjekte edin:

const BATTLECARDS: Record<string, string> = { 'Rakip A': ` Rakip A kendini <onların iddiası> üzerinden konumlandırıyor. Karşı argüman: <sizin kanıt noktanız> + <3 kelimelik slogan>. Yerleştirilecek mayın sorusu: "Son güvenlik denetimlerini ne zaman yayınladılar?" `, 'Rakip B': ` Rakip B <onların açısı> ile öne çıkıyor. Karşı argüman: <sizin karşı argümanınız> — <müşteri adı> geçiş vakasına referans verin. Mayın: "500 kullanıcı sonrası kişi başı limitlerini sorun." `, } function battlecardSection(competitorsCsv: string) { const names = competitorsCsv.split(',').map(s => s.trim()).filter(Boolean) if (!names.length) return '' return ` REKABETÇİ BATTLECARD'LAR ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} Bunu Farklılaştırma slaytını doldurmak için kullanın. Rakibi asla ikiden fazla kez adlandırmayın. `.trim() }

battlecardSection(deal.competitors)
sonucunu prompt'unuza ekleyin. Sunum artık AE seviyesinde rekabetçi çerçeveleme taşıyor — normalde rekabet istihbaratı liderle otuz dakikalık bir görüşme gerektiren türden.

Ondan fazla olduğunda battlecard'ları sabit kodlamak yerine bir veritabanı tablosunda saklayın. Ürün Pazarlama Müdürünüz PR göndermeden bunları düzenleyebilir.

Sık Sorulan Sorular

HubSpot'un her özellik güncellemesinde yinelenen sunumlar oluşturmasını nasıl engellerim?

Deal nesnesine

last_deck_generated_at
adında bir özellik ekleyin ve HubSpot Workflow'a bir filtre ekleyin:
last_deck_generated_at
bilinmiyor veya 7 günden daha eski. Transformer fonksiyonunuz, başarılı bir oluşturma sonrasında bu zaman damgasını Deal API aracılığıyla HubSpot'a geri yazmalıdır. Bu tek başına gereksiz API çağrılarının %90'ını önler.

2Slides kredileri açısından maliyeti nedir?

Her

/api/v1/slides/generate
çağrısı, slayt sayısına ve eklentilere (görsel oluşturma, sesli anlatım) göre kredi düşer. Markalı görsellere sahip tipik 10 slaytlık bir satış sunumu için sunum başına 20–40 kredi bütçeleyin. Ayda 500 sunum oluşturan bir RevOps ekibi 150–400 $ aralığına denk gelir — bu, tek bir kurumsal anlaşmada tasarruf edilen AE emeğinin çok altındadır.

Sunumu İngilizce dışında bir dilde oluşturabilir miyim?

Evet.

/api/v1/slides/generate
payload'ında
language: 'de'
,
language: 'ja'
,
language: 'es'
vb. geçirin. Prompt şablonu ayrıca, şampiyonunuzun iletişim kaydı İngilizce olmayan tercih edilen bir dil gösterdiğinde yerelleştirilmiş bir giriş içermelidir.

Görsel markayı nasıl sabitlerim ki her sunum aynı görünsün?

Her oluşturma isteğinde kilitli bir

theme_id
kullanın. Marka temanızı 2Slides kullanıcı arayüzünde bir kez oluşturun, ID'sini kopyalayın ve ortam değişkenlerinizde
BRAND_THEME_ID
olarak saklayın. Tema, yazı tiplerini, renk paletini, logo yerleşimini ve ana düzenleri kontrol eder — böylece içerik hesaba göre değişirken çerçeve piksel düzeyinde özdeş kalır.

Oluşturma işi başarısız olursa ne olur?

/api/v1/jobs/{id}
adresini yoklayın ve
status
değerini inceleyin.
failed
durumunda, yanıt makine tarafından okunabilir bir kod içeren
error
içerir. Üstel geri çekilme ile bir kez yeniden deneyin; ikinci kez başarısız olursa, RevOps kanalına bir Slack uyarısı gönderin ve AE çağrısından önce engellenmemesi için statik bir şablon sunuma geri dönün.

Sonuç

HubSpot, Salesforce olmaya çalışmıyor ve bu sorun değil — sadeliği bir özellik. Ancak sadelik aynı zamanda native doküman otomasyonu sunmadığı anlamına da geliyor. Bu boşluk bir hata değil, bir özellik çünkü HubSpot'u bir AI sunum API'sine bağlayan RevOps ekibinin, satış teknoloji yığınındaki en değerli alanın sahibi olduğu anlamına geliyor: alıcının önüne gelen sunum.

Yukarıdaki üç yöntem — workflow webhook, uygulama kartı butonu, planlanmış batch işleme — bir satış ekibinin ihtiyaç duyduğu tüm oluşturma tetikleyicilerini kapsıyor. Huni aşamanıza uygun olanı seçin. Discovery ve Demo aşamaları neredeyse her zaman talep üzerine (uygulama kartı) çalışmayı ister. Teklif ve Müzakere aşamaları, aşama değişikliğinde otomasyondan en çok faydayı görür (workflow webhook). Pipeline incelemeleri ve QBR hazırlıkları batch işlemedir (cron). Üçünü de çalıştırın ve pipeline'daki her fırsat, her gün, el altında CRM-doğru bir sunuma sahip olsun.

Satış sunumlarınızı HubSpot'tan otomatikleştirin — 2Slides API key edinin ve bir gün içinde bir sonraki workflow'unuza entegre edin.

About 2Slides

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

Try For Free