
Transcription vers HubSpot : parcours d'intégration vérifiés
Summarize this article with:
La Conversation Intelligence de HubSpot (Sales Hub Professional à 90 $/siège/mois) transcrit automatiquement les appels passés via son composeur natif, Zoom et Google Meet. Pour les appels provenant de composeurs externes, d'enregistrements importés ou de langues hors de son périmètre, il faut pousser les transcriptions via l'API Calls. Ce guide couvre les deux chemins : quand s'appuyer sur le CI natif et quand construire soi-même le pipeline webhook-vers-engagement, avec les identifiants d'association corrigés et un gestionnaire fonctionnel de bout en bout.
Le chemin le plus rapide pour obtenir des transcriptions d'appels dans HubSpot dépend de l'origine de vos appels. Si votre équipe appelle depuis l'outil d'appel natif de HubSpot, Zoom ou Google Meet, la Conversation Intelligence intégrée de HubSpot gère la transcription automatiquement aux niveaux Professional et Enterprise. Si vous utilisez un composeur externe, recevez des appels entrants sur une plateforme tierce, ou souhaitez rattraper des enregistrements depuis Gong, Zoom Cloud ou un bucket S3, vous devez pousser les transcriptions vous-même via l'API Calls.
Ce guide couvre les deux chemins.
Quand la Conversation Intelligence native suffit
HubSpot Sales Hub Professional (90 $ par siège par mois, facturé annuellement) inclut la Conversation Intelligence, qui offre jusqu'à 1 500 heures de transcription par compte et par mois. Les appels sont transcrits automatiquement lorsqu'ils passent par :
- L'outil d'appel intégré de HubSpot
- L'intégration Zoom native (les enregistrements de réunions se synchronisent automatiquement)
- Google Meet (Professional et Enterprise)
- Certains fournisseurs d'appels tiers répertoriés sur le marketplace HubSpot
Dans ces scénarios, vous obtenez des transcriptions attachées à la chronologie du contact sans écrire une seule ligne de code. Le responsable peut ouvrir un contact, faire défiler le fil d'activité et lire ou rechercher dans la transcription immédiatement après l'appel.
Les limites : le CI exige une licence payante Sales ou Service Hub par utilisateur, ne transcrit pas les appels passés depuis des composeurs hors de la liste prise en charge, et ne peut pas traiter les enregistrements que vous importez manuellement depuis un système de fichiers.
Mon avis : si toute votre équipe utilise déjà le composeur de HubSpot ou Zoom via HubSpot, le CI natif est le choix évident. Le chemin API ci-dessous sert pour les cas non couverts.
Quand vous avez besoin du chemin API
La recette API couvre :
- Les appels enregistrés en dehors de HubSpot (exports Gong, Zoom Cloud autonome, composeurs externes, enregistrements en présentiel).
- Les rattrapages en masse d'enregistrements historiques.
- Les langues ou nombres d'intervenants pour lesquels vous voulez contrôler le moteur de transcription.
- Les équipes qui ne peuvent pas se permettre la tarification par siège de Sales Hub Professional pour chaque commercial.
Le flux de travail est simple :
- Un commercial enregistre un appel (Zoom autonome, composeur externe, audio importé).
- L'enregistrement arrive dans un stockage accessible (S3, Cloudflare R2, Google Drive).
- Votre système soumet le fichier à une API de transcription.
- À la fin, un webhook se déclenche vers votre gestionnaire.
- Le gestionnaire associe l'appel à un contact et à une transaction HubSpot.
- La transcription est attachée sous forme d'engagement d'appel HubSpot sur la chronologie du contact.
- En option, les propriétés de la transaction sont mises à jour avec les signaux extraits (prochaines étapes, sentiment, objections).
Environ 200 lignes de code. La plupart des équipes revenue ops l'ont opérationnel le jour même.
Étape 1 : configuration de l'application privée HubSpot
Dans HubSpot : Paramètres, Intégrations, Applications privées, Créer une application privée.
Nommez-la « Intégration de transcription » et demandez ces portées :
crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.deals.readcrm.objects.deals.writecrm.objects.calls.writecrm.schemas.calls.read
Enregistrez le jeton d'accès et définissez-le comme HUBSPOT_TOKEN dans votre environnement.
Étape 2 : recevoir le webhook de transcription
Le gestionnaire qui se déclenche lorsque la transcription se termine. Consultez webhook vs polling pour les transcriptions pour comparer les approches.
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);
}
);

Transcription terminée, prête à être routée vers un contact ou une transaction CRM.
Étape 3 : associer l'appel à un contact HubSpot
L'association des contacts est la partie que la plupart des équipes sous-estiment. Trois signaux fonctionnent :
Numéro de téléphone. Meilleur signal lorsque votre composeur capture le numéro sortant. Normalisez avant de rechercher : supprimez tous les caractères non numériques afin que « +55 11 99999-8888 » et « 551199998888 » correspondent au même enregistrement.
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;
}
Adresse e-mail. Lorsque l'appel était planifié via un agenda, l'invitation contient les e-mails des participants. Utilisez-les pour trouver le contact :
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;
}
Repli sur le commercial et l'horodatage. Lorsque ni le téléphone ni l'e-mail ne sont disponibles (appels à froid, lignes partagées), revenez aux transactions ouvertes du commercial actives autour de l'heure de l'appel. Moins fiable, mais utile pour éviter de perdre complètement la transcription.
Étape 4 : créer un engagement d'appel HubSpot
Une fois l'association faite, écrivez la transcription sous forme d'engagement d'appel. L'identifiant de type d'association correct pour appel-vers-contact est 194. Pour appel-vers-transaction, l'identifiant correct est 220 (pas 195, qui est incorrect et échouera silencieusement ou créera de mauvaises associations).
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;
}
Le champ hs_call_body contient le texte de la transcription. Pour les appels longs, testez si le texte reste dans la limite de caractères par propriété de HubSpot (selon la documentation HubSpot, consultez l'API properties pour connaître le plafond actuel de fieldType: textarea). Pour les transcriptions très longues, utilisez une seconde propriété personnalisée ou stockez le texte complet en externe et liez-y.
Étape 5 : extraire les signaux de transaction (facultatif)
Si la réponse de transcription inclut un résumé ou si vous voulez faire passer un LLM sur le texte, vous pouvez pousser des signaux structurés vers les propriétés de la transaction. Créez d'abord les propriétés personnalisées dans HubSpot (Paramètres, Propriétés, Transactions), puis mettez à jour :
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.
}
});
}
Pour une extraction structurée (signaux BANT, objections, décideurs), exécutez un appel LLM distinct sur le texte de la transcription avant cette étape. L'outil de transcription de réunions peut générer des résumés formatés qui s'insèrent directement dans cette mise à jour.
Le gestionnaire de bout en bout
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);
}
La fonction getCallMetadata extrait le téléphone, l'e-mail et le commercial du nom de fichier de l'enregistrement ou d'un fichier de métadonnées adjacent. La source exacte dépend de votre plateforme d'appels.
Gérer les appels sans correspondance
Attendez-vous à ce que 5 à 15 % des appels échouent à l'association de contact : prospection à froid, nouveaux leads pas encore dans HubSpot, ou appels sur des lignes partagées.
Option A : créez un nouveau contact à partir de l'appel. Définissez le téléphone comme première propriété, l'étape du cycle de vie comme « Lead », et laissez le SDR l'enrichir plus tard.
Option B : consignez les appels sans correspondance dans un objet personnalisé « Transcriptions non associées » et routez-les vers une file SDR pour un triage hebdomadaire.
Option C : enregistrez la transcription dans votre propre base de données et passez outre HubSpot pour cet appel. Certains appels (mauvais numéros, robocalls) sont du pur bruit.
Ce que le CI natif ne couvre pas et que cette solution corrige
Pour les équipes déjà sur Sales Hub Professional, le chemin API apporte de la valeur sur des lacunes précises :
- Composeurs externes : les appels passés depuis Outreach, Salesloft ou un système VoIP absent de la liste de partenaires de HubSpot échappent totalement au CI. Le chemin API les capture.
- Rattrapages historiques : le CI ne traite que les appels à venir. Le chemin API permet d'ingérer un an d'enregistrements Zoom Cloud en une nuit.
- Couverture linguistique : la prise en charge des langues par le CI est plus étroite que celle des API de transcription dédiées. Pour les équipes peu anglophones, une couche de transcription séparée (voir meilleures API speech-to-text en 2026) offre une meilleure précision.
- Appels hors utilisateurs HubSpot : le CI exige une licence payante par utilisateur. Les employés contractuels, les téléconseillers offshore ou les commerciaux partenaires utilisant des outils distincts ne produisent pas de transcriptions CI. Le chemin API traite leurs enregistrements quoi qu'il arrive.
Combien cela coûte face à Gong
Avant cette intégration, les équipes qui voulaient de l'intelligence de transcription d'appels regardaient généralement :
- Gong : frais de plateforme de 5 000 à 50 000 $ par an plus environ 1 400 à 2 000 $ par siège et par an (non publié, devis entreprise). Pour une équipe de 10 commerciaux, prévoyez 20 000 à 35 000 $ par an.
- Notes manuelles : les commerciaux tapent des résumés après chaque appel. Incomplet, lent, et biaisé vers les détails favorables.
Le chemin API coûte :
- Un abonnement à une API de transcription (des options à tarif fixe commencent à moins de 15 $/mois pour un utilisateur solo, avec montée en charge ensuite).
- HubSpot que vous avez déjà.
- Une journée de mise en place technique.
Le compromis est honnête : Gong et Chorus construisent des analyses de coaching, du suivi de mots-clés et de la prévision de transactions par-dessus les transcriptions. Le chemin API vous donne la fondation et laisse la couche analytique à vous (ou à un module complémentaire moins cher comme les outils IA de HubSpot eux-mêmes).
Si vous avez juste besoin de transcriptions propres attachées aux contacts et transactions sans abonnement dédié à la conversation intelligence, l'outil de transcription de réunions de ConvertAudioToText prend en charge la soumission directe de fichier ou d'URL et renvoie une sortie structurée qui s'intègre proprement dans le gestionnaire ci-dessus.
L'alternative Zapier
Zapier dispose d'une application HubSpot native répertoriée sur le marketplace HubSpot. Pour les équipes non techniques, le flux est :
- Déclencheur : Webhook (événement job.completed de transcription).
- Filtre ou Formatter : normalisez le numéro de téléphone.
- Recherche : trouvez le contact HubSpot par téléphone ou e-mail.
- Action : créez un engagement d'appel HubSpot avec le texte de la transcription.
Cela couvre le cas simple. Le code personnalisé gère mieux les cas particuliers, notamment l'association de contacts pour les appels à froid et la logique de repli pour les appels sans correspondance.
Pièges en production
Normalisation des numéros de téléphone. Les numéros internationaux comme « +55 11 99999-8888 » doivent être réduits à leurs chiffres avant de rechercher dans HubSpot. Construisez une fonction utilitaire normalizePhone(str) et faites passer chaque numéro dedans avant toute recherche.
Lignes téléphoniques multi-utilisateurs ou partagées. Si plusieurs commerciaux partagent un numéro, l'association par téléphone est ambiguë. Revenez à l'e-mail ou au contexte d'agenda.
Fiabilité du webhook. Construisez un job de réconciliation quotidien qui interroge les tâches de transcription terminées pas encore consignées dans HubSpot. Sinon, une indisponibilité de votre gestionnaire peut créer des trous.
Permissions d'appel dans HubSpot. Les enregistrements d'appels sont visibles par défaut par toute personne ayant accès aux contacts. Pour les appels commerciaux sensibles, restreignez via les équipes et rôles HubSpot avant la mise en production.
Tester les identifiants d'association. Exécutez une création d'appel de test sur un contact et une transaction sandbox avant de brancher en production. Consignez l'identifiant d'appel renvoyé et confirmez que l'engagement apparaît à la fois sur la chronologie du contact et celle de la transaction.
Questions fréquentes
HubSpot transcrit-il les appels nativement ?
Oui, mais uniquement aux niveaux Sales Hub Professional (90 $/siège/mois facturé annuellement) ou Enterprise. Les appels passés via le composeur natif de HubSpot, l'intégration Zoom, l'intégration Google Meet et certains fournisseurs d'appels tiers sélectionnés sont transcrits automatiquement. Les appels provenant de composeurs externes ou les fichiers audio importés nécessitent une voie de soumission API distincte.
Puis-je importer un enregistrement externe pour que HubSpot le transcrive ?
Oui, mais avec des restrictions. L'API calling extensions de HubSpot accepte les fichiers WAV, FLAC et MP4 pour la transcription, l'audio doit être multicanal (chaque intervenant sur une piste séparée), et la transcription ne fonctionne que pour les utilisateurs disposant d'une licence payante Sales ou Service Hub. Le processus exige d'enregistrer un point de terminaison authentifié pour l'URL de votre enregistrement, de journaliser l'appel avec hs_call_source défini sur INTEGRATIONS_PLATFORM, puis d'appeler le point de terminaison /recordings/ready pour déclencher le traitement.
Quel est l'identifiant de type d'association HubSpot correct pour lier un appel à une transaction ?
L'identifiant de type d'association correct pour appel-vers-transaction est 220, pas 195. Appel-vers-contact est 194. Les deux utilisent associationCategory défini sur HUBSPOT_DEFINED. Utiliser 195 échouera silencieusement ou créera une association incorrecte.
Existe-t-il un moyen sans code de pousser des transcriptions dans HubSpot ?
Zapier dispose d'une application HubSpot native répertoriée sur le marketplace HubSpot. Vous pouvez définir un déclencheur webhook à la fin de la transcription et utiliser l'action HubSpot pour créer un engagement. La limite concerne l'association des contacts : Zapier gère les recherches simples par e-mail ou téléphone, mais les cas particuliers comme les appels à froid ou les lignes téléphoniques partagées exigent du code personnalisé avec une logique de repli.
Sources
- Tarification HubSpot Sales Hub - vérifié en juillet 2026
- Consulter les enregistrements et transcriptions d'appels - Base de connaissances HubSpot - vérifié en juillet 2026
- HubSpot Calling Extensions : API Enregistrements et Transcriptions - vérifié en juillet 2026
- API v3 des engagements d'appel HubSpot - Identifiants de types d'association - vérifié en juillet 2026
- Tarification Gong 2026 - vérifié en juillet 2026
- Intégration Zapier HubSpot - Marketplace HubSpot - vérifié en juillet 2026
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

Speechmatics Alternative for Non-Developers: Web Transcription Without Code
Speechmatics is genuinely excellent for developers: 50 hours free per month, 56 languages, on-prem deployment. If you need a drag-and-drop web app with flat $9.99/mo pricing instead of an API, here is an honest comparison of the two.

Best Transcription Tools with API Access (2026)
Which transcription SaaS tools actually give you API keys, and on which plan? Verified pricing and plan gates for Descript, Sonix, Fireflies, Happy Scribe, AssemblyAI, and more.