Transkription in HubSpot: Verifizierte Integrationswege
apihubspotintegrationen

Transkription in HubSpot: Verifizierte Integrationswege

BMMamane B. MoussaMay 26, 2026Updated July 2, 202611 min read

Summarize this article with:

TL;DR

HubSpots Conversation Intelligence (Sales Hub Professional für 90 $/Nutzer/Monat) transkribiert Anrufe über den nativen Dialer, Zoom und Google Meet automatisch. Für Anrufe von externen Dialern, hochgeladene Aufnahmen oder Sprachen außerhalb der Abdeckung müssen Sie Transkripte über die Calls API einspielen. Dieser Leitfaden behandelt beide Wege: wann Sie auf natives CI setzen und wann Sie die Webhook-zu-Engagement-Pipeline selbst bauen – mit korrigierten Assoziations-IDs und einem funktionierenden End-to-End-Handler.

Der schnellste Weg zu Anruftranskripten in HubSpot hängt davon ab, wo Ihre Anrufe entstehen. Wählt Ihr Team über HubSpots eingebautes Anruf-Tool, Zoom oder Google Meet, übernimmt HubSpots integrierte Conversation Intelligence die Transkription automatisch – auf Professional- und Enterprise-Stufen. Nutzen Sie einen externen Dialer, nehmen Sie eingehende Anrufe auf einer Drittanbieter-Plattform entgegen oder möchten Sie Aufnahmen von Gong, Zoom Cloud oder einem S3-Bucket nachträglich importieren, müssen Sie die Transkripte selbst über die Calls API einspielen.

Dieser Leitfaden behandelt beide Wege.

Wann native Conversation Intelligence ausreicht

HubSpot Sales Hub Professional (90 $ pro Nutzer und Monat, jährlich abgerechnet) enthält Conversation Intelligence, das Ihnen bis zu 1.500 Stunden Transkription pro Konto und Monat gibt. Anrufe werden automatisch transkribiert, wenn sie über Folgendes geführt werden:

  • HubSpots eingebautes Anruf-Tool
  • Die native Zoom-Integration (Meeting-Aufnahmen synchronisieren sich automatisch)
  • Google Meet (Professional und Enterprise)
  • Einige im HubSpot-Marktplatz gelistete Drittanbieter-Anrufdienste

In diesen Szenarien erhalten Sie Transkripte an der Kontakt-Timeline, ohne eine Zeile Code zu schreiben. Der Manager kann einen Kontakt öffnen, durch den Aktivitäten-Feed scrollen und das Transkript direkt nach dem Anruf lesen oder durchsuchen.

Die Grenzen: CI erfordert einen bezahlten Sales- oder Service-Hub-Sitzplatz pro Nutzer, transkribiert keine Anrufe von Dialern außerhalb der unterstützten Liste und kann Aufnahmen, die Sie manuell aus einem Dateisystem hochladen, nicht verarbeiten.

Meine Einschätzung: Wenn Ihr gesamtes Team bereits HubSpots Dialer oder Zoom über HubSpot nutzt, ist natives CI die naheliegende Wahl. Der folgende API-Weg ist für die Lückenfälle da.

Wann Sie den API-Weg brauchen

Das API-Rezept deckt ab:

  1. Anrufe, die außerhalb von HubSpot aufgezeichnet wurden (Gong-Exporte, Zoom Cloud eigenständig, externe Dialer, persönliche Aufnahmen).
  2. Massenhafte Nachimporte historischer Aufnahmen.
  3. Sprachen oder Sprecherzahlen, bei denen Sie die Transkriptions-Engine selbst steuern wollen.
  4. Teams, die sich die Pro-Nutzer-Preise von Sales Hub Professional nicht für jeden Rep leisten können.

Der Workflow ist unkompliziert:

  1. Der Sales Rep zeichnet einen Anruf auf (Zoom eigenständig, externer Dialer, hochgeladenes Audio).
  2. Die Aufnahme landet in zugänglichem Speicher (S3, Cloudflare R2, Google Drive).
  3. Ihr System sendet die Datei an eine Transkriptions-API.
  4. Bei Abschluss feuert ein Webhook an Ihren Handler.
  5. Der Handler ordnet den Anruf einem HubSpot-Kontakt und Deal zu.
  6. Das Transkript wird als HubSpot-Call-Engagement an der Kontakt-Timeline angehängt.
  7. Optional werden Deal-Eigenschaften mit extrahierten Signalen aktualisiert (nächste Schritte, Sentiment, Einwände).

Etwa 200 Zeilen Code. Die meisten Revenue-Ops-Teams haben ihn am selben Tag am Laufen.

Schritt 1: HubSpot Private App einrichten

In HubSpot: Einstellungen, Integrationen, Private Apps, Private App erstellen.

Benennen Sie sie „Transkriptions-Integration" und fordern Sie diese Scopes an:

  • crm.objects.contacts.read
  • crm.objects.contacts.write
  • crm.objects.deals.read
  • crm.objects.deals.write
  • crm.objects.calls.write
  • crm.schemas.calls.read

Speichern Sie den Access Token und setzen Sie ihn als HUBSPOT_TOKEN in Ihrer Umgebung.

Schritt 2: Den Transkriptions-Webhook empfangen

Der Handler, der auslöst, wenn die Transkription abgeschlossen ist. Die Abwägungen dazu finden Sie unter Webhook vs. Polling für Transkripte.

import express from 'express';
import { Client as HubSpotClient } from '@hubspot/api-client';
import crypto from 'crypto';

const app = express();
const hubspot = new HubSpotClient({ accessToken: process.env.HUBSPOT_TOKEN });

app.post(
  '/webhooks/transcript',
  express.raw({ type: 'application/json' }),
  async (req, res) => {
    const sig = req.header('X-CATT-Signature');
    const expected = crypto
      .createHmac('sha256', process.env.TRANSCRIPT_WEBHOOK_SECRET)
      .update(req.body)
      .digest('hex');

    if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
      return res.status(401).send('Bad signature');
    }

    const event = JSON.parse(req.body.toString());
    if (event.event !== 'job.completed') return res.sendStatus(200);

    await processCompletedTranscription(event.data);
    res.sendStatus(200);
  }
);

Meeting-Transkription bereit zum Anhängen an eine HubSpot-Kontakt-Timeline
Meeting-Transkription bereit zum Anhängen an eine HubSpot-Kontakt-Timeline

Fertiges Transkript, bereit zur Weiterleitung an einen CRM-Kontakt oder Deal.

Schritt 3: Den Anruf einem HubSpot-Kontakt zuordnen

Die Kontaktzuordnung ist der Teil, den die meisten Teams unterschätzen. Drei Signale funktionieren:

Telefonnummer. Bestes Signal, wenn Ihr Dialer die ausgehende Nummer erfasst. Normalisieren Sie vor der Suche: Entfernen Sie alle Nicht-Ziffern-Zeichen, damit „+55 11 99999-8888" und „551199998888" denselben Datensatz treffen.

async function findContactByPhone(phone) {
  const digits = phone.replace(/\D/g, '');
  const result = await hubspot.crm.contacts.searchApi.doSearch({
    filterGroups: [{
      filters: [{ propertyName: 'phone', operator: 'EQ', value: digits }]
    }],
    limit: 1
  });
  return result.results[0] ?? null;
}

E-Mail-Adresse. Wenn der Anruf über den Kalender terminiert wurde, enthält die Einladung die Teilnehmer-E-Mails. Nutzen Sie diese, um den Kontakt zu finden:

async function findContactByEmail(email) {
  const result = await hubspot.crm.contacts.searchApi.doSearch({
    filterGroups: [{
      filters: [{ propertyName: 'email', operator: 'EQ', value: email }]
    }],
    limit: 1
  });
  return result.results[0] ?? null;
}

Rep- und Zeitstempel-Fallback. Wenn weder Telefonnummer noch E-Mail verfügbar sind (Kaltakquise, geteilte Leitungen), greifen Sie auf die offenen Deals des Reps zurück, die rund um die Anrufzeit aktiv sind. Weniger verlässlich, aber nützlich, um das Transkript nicht komplett zu verlieren.

Schritt 4: Ein HubSpot-Call-Engagement erstellen

Nach der Zuordnung schreiben Sie das Transkript als Call Engagement. Die korrekte Assoziationstyp-ID für Anruf-zu-Kontakt ist 194. Für Anruf-zu-Deal lautet die korrekte ID 220 (nicht 195 – diese ist falsch und führt still zu Fehlern oder falschen Assoziationen).

async function attachTranscriptToContact(contactId, dealId, data) {
  const durationMs = data.duration_seconds * 1000;

  const call = await hubspot.crm.objects.calls.basicApi.create({
    properties: {
      hs_timestamp: new Date().toISOString(),
      hs_call_title: `Recorded call (${Math.round(data.duration_seconds / 60)} min)`,
      hs_call_body: data.transcript,
      hs_call_duration: String(durationMs),
      hs_call_status: 'COMPLETED',
      hs_call_direction: 'OUTBOUND',
      hs_call_summary: data.summary ?? ''
    },
    associations: [
      {
        to: { id: contactId },
        types: [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 194 }]
      },
      ...(dealId
        ? [{
            to: { id: dealId },
            types: [{ associationCategory: 'HUBSPOT_DEFINED', associationTypeId: 220 }]
          }]
        : [])
    ]
  });

  return call.id;
}

Das Feld hs_call_body enthält den Transkripttext. Bei langen Anrufen testen Sie, ob der Text innerhalb von HubSpots Zeichenlimit pro Eigenschaft bleibt (laut HubSpot-Dokumentation: konsultieren Sie die Properties-API für das aktuelle Limit von fieldType: textarea). Bei sehr langen Transkripten verwenden Sie eine zweite benutzerdefinierte Eigenschaft oder speichern Sie den vollständigen Text extern und verlinken Sie darauf.

Schritt 5: Deal-Signale extrahieren (optional)

Wenn Ihre Transkriptionsantwort eine Zusammenfassung enthält oder Sie einen LLM-Durchlauf über den Text laufen lassen wollen, können Sie strukturierte Signale in Deal-Eigenschaften schreiben. Legen Sie die benutzerdefinierten Eigenschaften zuerst in HubSpot an (Einstellungen, Eigenschaften, Deals) und aktualisieren Sie dann:

async function updateDealFromTranscript(dealId, transcript, summary) {
  await hubspot.crm.deals.basicApi.update(dealId, {
    properties: {
      last_call_summary: summary ?? '',
      last_call_date: new Date().toISOString().split('T')[0]
      // Add your custom properties here: last_call_sentiment, next_steps, etc.
    }
  });
}

Für strukturierte Extraktion (BANT-Signale, Einwände, Entscheider) führen Sie vor diesem Schritt einen separaten LLM-Aufruf gegen den Transkripttext aus. Das Meeting-Transkriptions-Tool kann formatierte Zusammenfassungen erzeugen, die direkt in dieses Update einfließen.

Der End-to-End-Handler

async function processCompletedTranscription(data) {
  const meta = await getCallMetadata(data.audio_filename);

  const contact =
    (await findContactByPhone(meta.phone)) ??
    (await findContactByEmail(meta.email));

  if (!contact) {
    await logUnmatchedCall(data, meta);
    return;
  }

  const deal = await getActiveDealForContact(contact.id);

  await attachTranscriptToContact(contact.id, deal?.id ?? null, data);

  if (deal && data.summary) {
    await updateDealFromTranscript(deal.id, data.transcript, data.summary);
  }

  await notifyRep(meta.rep_email, contact, data);
}

Die Funktion getCallMetadata zieht Telefonnummer, E-Mail und Rep aus dem Dateinamen der Aufnahme oder einer Metadaten-Sidecar-Datei. Die genaue Quelle hängt von Ihrer Anrufplattform ab.

Umgang mit nicht zugeordneten Anrufen

Rechnen Sie damit, dass 5 bis 15 % der Anrufe die Kontaktzuordnung nicht schaffen: Kaltakquise, neue Leads, die noch nicht in HubSpot sind, oder Anrufe auf geteilten Leitungen.

Option A: Erstellen Sie aus dem Anruf einen neuen Kontakt. Setzen Sie die Telefonnummer als erste Eigenschaft, die Lifecycle-Phase auf „Lead" und lassen Sie den SDR ihn später anreichern.

Option B: Protokollieren Sie nicht zugeordnete Anrufe in einem benutzerdefinierten Objekt „Nicht zugeordnete Transkripte" und leiten Sie sie in eine SDR-Warteschlange für die wöchentliche Sichtung weiter.

Option C: Speichern Sie das Transkript in Ihrer eigenen Datenbank und überspringen Sie HubSpot für diesen Anruf. Manche Anrufe (falsch verbundene Nummern, Roboanrufe) sind echtes Rauschen.

Was natives CI verpasst – und dieser Weg abdeckt

Für Teams, die bereits Sales Hub Professional nutzen, bringt der API-Weg in bestimmten Lücken Mehrwert:

  • Externe Dialer: Anrufe über Outreach, Salesloft oder ein VoIP-System, das nicht auf HubSpots Partnerliste steht, umgehen CI vollständig. Der API-Weg erfasst sie.
  • Historische Nachimporte: CI verarbeitet nur Anrufe ab jetzt. Der API-Weg lässt Sie ein Jahr Zoom-Cloud-Aufnahmen über Nacht importieren.
  • Sprachabdeckung: CIs Unterstützung für Transkriptionssprachen ist schmaler als die spezialisierter Transkriptions-APIs. Für Teams, die nicht englischlastig sind, liefert eine separate Transkriptionsschicht (siehe beste Speech-to-Text-APIs 2026) bessere Genauigkeit.
  • Anrufe außerhalb von HubSpot-Nutzern: CI erfordert einen bezahlten Sitzplatz pro Nutzer. Vertragsbeschäftigte, Offshore-Anrufer oder Partner-Reps mit eigenen Tools erzeugen keine CI-Transkripte. Der API-Weg verarbeitet deren Aufnahmen trotzdem.

Was das kostet – im Vergleich zu Gong

Vor dieser Integration griffen Teams, die Transkriptionsintelligenz für Anrufe wollten, typischerweise auf Folgendes zurück:

  • Gong: Plattformgebühr von 5.000 bis 50.000 $ pro Jahr plus etwa 1.400 bis 2.000 $ pro Sitzplatz und Jahr (nicht veröffentlicht, nur im Enterprise-Angebot). Für ein 10-Reps-Team budgetieren Sie 20.000 bis 35.000 $ pro Jahr.
  • Manuelle Notizen: Reps tippen nach jedem Anruf Zusammenfassungen. Unvollständig, langsam und verzerrt zugunsten günstiger Details.

Der API-Weg kostet:

  • Ein Transkriptions-API-Abo (Flatrate-Optionen starten bei unter 15 $/Monat für Einzelnutzer, skalieren von dort).
  • HubSpot haben Sie bereits.
  • Einen Tag Engineering-Setup.

Der Trade-off ist ehrlich: Gong und Chorus bauen Coaching-Analysen, Keyword-Tracking und Deal-Forecasting auf den Transkripten auf. Der API-Weg liefert Ihnen das Fundament und überlässt die Analyseschicht Ihnen (oder einem günstigeren Add-on wie HubSpots eigenen KI-Tools).

Wenn Sie einfach nur saubere Transkripte an Kontakten und Deals brauchen, ohne ein dediziertes Conversation-Intelligence-Abo, unterstützt das Meeting-Transkriptions-Tool von ConvertAudioToText direkte Datei- oder URL-Übermittlung und liefert strukturierte Ausgaben, die sauber in den obigen Handler mappen.

Zapier-Alternative

Zapier bietet eine native HubSpot-App, die im HubSpot-Marktplatz gelistet ist. Für nicht-technische Teams ist der Ablauf:

  1. Trigger: Webhook (job.completed-Ereignis der Transkription).
  2. Filter oder Formatter: Telefonnummer normalisieren.
  3. Suche: HubSpot-Kontakt per Telefonnummer oder E-Mail finden.
  4. Aktion: HubSpot-Call-Engagement mit dem Transkripttext erstellen.

Das deckt den unkomplizierten Fall ab. Eigener Code meistert Randfälle besser, insbesondere die Kontaktzuordnung bei Kaltakquise und die Fallback-Logik für nicht zugeordnete Anrufe.

Stolperfallen im Produktivbetrieb

Normalisierung von Telefonnummern. Internationale Nummern wie „+55 11 99999-8888" müssen vor der HubSpot-Suche auf Ziffern reduziert werden. Bauen Sie einen normalizePhone(str)-Helfer und schicken jede Nummer vor jedem Lookup hindurch.

Geteilte Telefonleitungen. Teilen sich mehrere Reps eine Nummer, ist die telefonbasierte Zuordnung mehrdeutig. Greifen Sie auf E-Mail oder Kalenderkontext zurück.

Webhook-Zuverlässigkeit. Bauen Sie einen täglichen Abgleich-Job, der nach abgeschlossenen Transkriptions-Jobs pollt, die noch nicht in HubSpot protokolliert sind. Ausfallzeiten Ihres Handlers erzeugen sonst Lücken.

Anruf-Berechtigungen in HubSpot. Anrufdatensätze sind standardmäßig für jeden mit Kontaktzugriff sichtbar. Beschränken Sie sensible Sales-Anrufe über HubSpot-Teams und -Rollen, bevor Sie live gehen.

Testen der Assoziations-IDs. Führen Sie eine Test-Callerstellung gegen einen Sandbox-Kontakt und -Deal durch, bevor Sie an die Produktion anbinden. Protokollieren Sie die zurückgegebene Call-ID und bestätigen Sie, dass das Engagement sowohl an der Kontakt- als auch an der Deal-Timeline erscheint.

Häufige Fragen

Transkribiert HubSpot Anrufe nativ?

Ja, aber nur ab Sales Hub Professional (90 $/Nutzer/Monat bei jährlicher Abrechnung) oder Enterprise. Anrufe über HubSpots nativen Dialer, die Zoom-Integration, die Google-Meet-Integration und ausgewählte Drittanbieter-Anrufdienste werden automatisch transkribiert. Anrufe von externen Dialern oder hochgeladene Audiodateien erfordern einen separaten Übermittlungsweg per API.

Kann ich eine externe Aufnahme hochladen, damit HubSpot sie transkribiert?

Ja, aber mit Einschränkungen. HubSpots Calling-Extensions-API akzeptiert WAV-, FLAC- und MP4-Dateien zur Transkription, das Audio muss mehrkanalig sein (jeder Sprecher auf einem eigenen Kanal), und die Transkription läuft nur für Nutzer mit bezahltem Sales- oder Service-Hub-Sitzplatz. Der Ablauf erfordert die Registrierung eines authentifizierten Endpunkts für Ihre Aufnahme-URL, das Protokollieren des Anrufs mit hs_call_source auf INTEGRATIONS_PLATFORM gesetzt und anschließend den Aufruf des /recordings/ready-Endpunkts, um die Verarbeitung auszulösen.

Welche HubSpot-Assoziationstyp-ID ist korrekt, um einen Anruf mit einem Deal zu verknüpfen?

Die korrekte Assoziationstyp-ID für Anruf-zu-Deal ist 220, nicht 195. Anruf-zu-Kontakt ist 194. Beide verwenden associationCategory mit dem Wert HUBSPOT_DEFINED. Mit 195 schlägt die Verknüpfung still fehl oder es entsteht eine falsche Assoziation.

Gibt es eine No-Code-Möglichkeit, Transkripte in HubSpot zu übertragen?

Zapier bietet eine native HubSpot-App, die im HubSpot-Marktplatz gelistet ist. Sie können einen Webhook-Trigger beim Abschluss der Transkription setzen und die HubSpot-Aktion zum Erstellen eines Engagements nutzen. Die Einschränkung ist die Kontaktzuordnung: Zapier bewältigt einfache E-Mail- oder Telefon-Lookups, aber Randfälle wie Kaltakquise oder geteilte Telefonleitungen benötigen eigenen Code mit Fallback-Logik.

Quellen

Try transcription free

Convert any audio or video to clean, unwatermarked text — speaker labels, timestamps, and AI summaries included. First 10 minutes free, no account.

Related Articles