Connecteur Typeform

Connectez Typeform à Brevo via Tajo pour synchroniser automatiquement les réponses de formulaires, capturer des leads depuis des formulaires conversationnels, et déclencher des automatisations marketing basées sur les soumissions d’enquêtes et les résultats de quiz.

Vue d’ensemble

PropriétéValeur
PlateformeTypeform
CatégorieFormulaires et Enquêtes (Personnalisé)
Complexité de configurationFacile
Intégration officielleNon
Données synchroniséesRéponses, Contacts, Événements, Formulaires
Méthode d’authentificationOAuth 2.0 / Jeton d’accès personnel

Fonctionnalités

  • Synchronisation des réponses en temps réel - Capture automatique des soumissions de formulaires via webhooks
  • Création de contacts - Créer ou mettre à jour des contacts Brevo depuis les réponses de formulaires
  • Scoring de leads - Utiliser les scores de quiz et les données de formulaires pour la qualification de leads
  • Champs masqués - Transmettre les données clients via des champs masqués pour des formulaires personnalisés
  • Mappage conditionnel - Mapper différents champs de formulaires selon la logique de réponse
  • Support multi-formulaires - Connecter plusieurs typeforms à différentes listes Brevo

Prérequis

Avant de commencer, assurez-vous d’avoir :

  1. Un compte Typeform (plan Basic ou supérieur pour les webhooks)
  2. Un jeton d’accès personnel depuis les paramètres du compte Typeform
  3. Un compte Brevo avec accès API
  4. Un compte Tajo avec permissions de connecteur

Authentification

Jeton d’accès personnel

Terminal window
# Générez un jeton sur https://admin.typeform.com/account#/section/tokens
export TYPEFORM_ACCESS_TOKEN=tfp_your_personal_access_token
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key

OAuth 2.0

// Flux d'autorisation OAuth 2.0
const authUrl = 'https://api.typeform.com/oauth/authorize?' +
new URLSearchParams({
client_id: process.env.TYPEFORM_CLIENT_ID,
redirect_uri: 'https://your-app.com/callback',
scope: 'forms:read responses:read webhooks:write accounts:read',
state: generateState()
});
// Échange du code d'autorisation contre un jeton d'accès
const tokenResponse = await fetch('https://api.typeform.com/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code: authorizationCode,
client_id: process.env.TYPEFORM_CLIENT_ID,
client_secret: process.env.TYPEFORM_CLIENT_SECRET,
redirect_uri: 'https://your-app.com/callback'
})
});

Configuration

Configuration de base

connectors:
typeform:
enabled: true
access_token: "${TYPEFORM_ACCESS_TOKEN}"
forms:
- form_id: "abc123"
list_id: 5
mapping:
email_field: "email"
name_field: "full_name"
- form_id: "xyz789"
list_id: 6
mapping:
email_field: "work_email"
sync:
responses: true
contacts: true
events: true
webhook:
enabled: true
secret: "${TYPEFORM_WEBHOOK_SECRET}"

Mappage de champs

field_mapping:
# Mapper les références de champs Typeform aux attributs Brevo
email: email
name: FIRSTNAME
company: COMPANY
phone: SMS
score: LEAD_SCORE
quiz_result: QUIZ_SCORE
nps_rating: NPS_SCORE
feedback: LAST_FEEDBACK

Endpoints API

EndpointMéthodeDescription
https://api.typeform.com/formsGETLister tous les formulaires
https://api.typeform.com/forms/{form_id}GETRécupérer un formulaire
https://api.typeform.com/formsPOSTCréer un formulaire
https://api.typeform.com/forms/{form_id}PUTMettre à jour un formulaire
https://api.typeform.com/forms/{form_id}/responsesGETRécupérer les réponses
https://api.typeform.com/forms/{form_id}/responsesDELETESupprimer les réponses
https://api.typeform.com/forms/{form_id}/webhooks/{tag}PUTCréer/mettre à jour un webhook
https://api.typeform.com/forms/{form_id}/webhooks/{tag}GETObtenir un webhook
https://api.typeform.com/forms/{form_id}/webhooksGETLister les webhooks

Exemples de code

Initialiser le connecteur

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('typeform', {
accessToken: process.env.TYPEFORM_ACCESS_TOKEN,
forms: ['abc123', 'xyz789']
});

Récupérer les réponses de formulaires

// Récupérer les réponses via l'API Responses
const response = await fetch(
'https://api.typeform.com/forms/abc123/responses?' +
new URLSearchParams({
page_size: 25,
since: '2024-01-01T00:00:00Z',
completed: 'true'
}),
{
headers: {
'Authorization': `Bearer ${process.env.TYPEFORM_ACCESS_TOKEN}`
}
}
);
const data = await response.json();
// Synchroniser chaque réponse vers Brevo
for (const item of data.items) {
const answers = item.answers;
const email = answers.find(a => a.field.ref === 'email')?.email;
if (email) {
await tajo.contacts.sync({
email,
attributes: {
FIRSTNAME: answers.find(a => a.field.ref === 'name')?.text,
LEAD_SCORE: item.calculated?.score || 0
},
listIds: [5]
});
}
}

Configurer les webhooks

// Enregistrer un webhook pour des notifications de réponses en temps réel
await fetch(
'https://api.typeform.com/forms/abc123/webhooks/tajo-sync',
{
method: 'PUT',
headers: {
'Authorization': `Bearer ${process.env.TYPEFORM_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://api.tajo.io/webhooks/typeform',
enabled: true,
secret: process.env.TYPEFORM_WEBHOOK_SECRET
})
}
);

Gérer les événements webhook

app.post('/webhooks/typeform', async (req, res) => {
// Vérifier la signature du webhook
const signature = req.headers['typeform-signature'];
const isValid = verifyTypeformSignature(
req.rawBody, signature, process.env.TYPEFORM_WEBHOOK_SECRET
);
if (!isValid) return res.status(401).send('Unauthorized');
const { form_response } = req.body;
await tajo.connectors.handleWebhook('typeform', {
topic: 'form_response',
payload: form_response
});
res.status(200).send('OK');
});

Limites de taux

EndpointLimite de tauxNotes
API Create2 requêtes/secCréation et mise à jour de formulaires
API Responses2 requêtes/secRécupération de réponses
API Webhooks2 requêtes/secGestion des webhooks
Tous les endpoints120 requêtes/minLimite de taux globale

Pagination des réponses

L’API Responses retourne un maximum de 1 000 réponses par requête. Utilisez les paramètres de curseur before ou after pour la pagination lors de la récupération de grands ensembles de réponses.

Dépannage

ProblèmeCauseSolution
Webhook non reçuWebhook désactivéActivez le webhook dans le tableau de bord Typeform
Réponses manquantesFiltre appliquéVérifiez les paramètres since/until et completed
Erreur d’auth 401Jeton expiréGénérez un nouveau jeton d’accès personnel
Limite de taux 429Trop de requêtesImplémentez une limitation de requêtes
Réponses videsChamps optionnelsGérez les valeurs de réponses null/undefined

Mode debug

connectors:
typeform:
debug: true
log_level: verbose
log_webhooks: true
log_responses: true

Bonnes pratiques

  1. Utilisez les webhooks - Privilégiez les webhooks au polling pour capturer les réponses en temps réel
  2. Validez les signatures - Vérifiez toujours les signatures des webhooks pour la sécurité
  3. Utilisez les champs masqués - Pré-remplissez les données clients connues dans les formulaires
  4. Mappez les références de champs - Utilisez les valeurs ref stables des champs plutôt que les IDs
  5. Gérez les réponses partielles - Tenez compte des questions optionnelles et ignorées
  6. Configurez une logique de retry - Implémentez un traitement webhook idempotent

Sécurité

  • OAuth 2.0 - Authentification basée sur jetons avec périmètres
  • Signatures webhook - Validation de signature HMAC SHA-256
  • HTTPS uniquement - Tous les endpoints API nécessitent TLS
  • Périmètres de jetons - Demandez les périmètres OAuth minimaux requis
  • Gestion des secrets - Stockez les jetons dans des variables d’environnement ou gestionnaires de secrets
  • Conformité RGPD - Utilisez l’API Delete Responses pour les demandes d’effacement de données

Ressources liées

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Assistant AI

Bonjour ! Posez-moi vos questions sur la documentation.