Connettore Typeform

Collega Typeform a Brevo tramite Tajo per sincronizzare automaticamente le risposte ai form, catturare lead dai form conversazionali e attivare automazioni marketing basate su invii di sondaggi e risultati di quiz.

Panoramica

ProprietàValore
PiattaformaTypeform
CategoriaForms & Surveys (Custom)
Complessità di setupFacile
Integrazione ufficialeNo
Dati sincronizzatiRisposte, Contatti, Eventi, Form
Metodo di autenticazioneOAuth 2.0 / Personal Access Token

Funzionalità

  • Sync risposte in real-time - Cattura automaticamente gli invii dei form tramite webhook
  • Creazione contatti - Crea o aggiorna contatti Brevo dalle risposte ai form
  • Lead scoring - Usa i punteggi dei quiz e i dati dei form per la qualificazione dei lead
  • Hidden Fields - Passa i dati cliente tramite Hidden Fields per form personalizzati
  • Mapping condizionale - Mappa campi form diversi in base alla logica di risposta
  • Supporto multi-form - Collega più typeform a liste Brevo diverse

Prerequisiti

Prima di iniziare, assicurati di avere:

  1. Un account Typeform (piano Basic o superiore per i webhook)
  2. Un Personal Access Token da Typeform Account Settings
  3. Un account Brevo con accesso API
  4. Un account Tajo con permessi sui connettori

Autenticazione

Personal Access Token

Terminal window
# Genera un token su 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

// Flusso di autorizzazione 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()
});
// Scambia l'authorization code per un access token
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'
})
});

Configurazione

Setup di 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}"

Mapping dei campi

field_mapping:
# Mappa i reference dei campi Typeform sugli attributi Brevo
email: email
name: FIRSTNAME
company: COMPANY
phone: SMS
score: LEAD_SCORE
quiz_result: QUIZ_SCORE
nps_rating: NPS_SCORE
feedback: LAST_FEEDBACK

Endpoint API

EndpointMetodoDescrizione
https://api.typeform.com/formsGETElenca tutti i form
https://api.typeform.com/forms/{form_id}GETRecupera un form
https://api.typeform.com/formsPOSTCrea un form
https://api.typeform.com/forms/{form_id}PUTAggiorna un form
https://api.typeform.com/forms/{form_id}/responsesGETRecupera le risposte
https://api.typeform.com/forms/{form_id}/responsesDELETEElimina le risposte
https://api.typeform.com/forms/{form_id}/webhooks/{tag}PUTCrea/aggiorna webhook
https://api.typeform.com/forms/{form_id}/webhooks/{tag}GETOttieni un webhook
https://api.typeform.com/forms/{form_id}/webhooksGETElenca i webhook

Esempi di codice

Inizializzare il connettore

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']
});

Recuperare le risposte ai form

// Recupera le risposte usando la Responses API
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();
// Sincronizza ogni risposta su 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]
});
}
}

Configurare i webhook

// Registra un webhook per notifiche di risposta in real-time
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
})
}
);

Gestire gli eventi webhook

app.post('/webhooks/typeform', async (req, res) => {
// Verifica la firma del 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');
});

Limiti di rate

EndpointRate limitNote
Create API2 richieste/secCreazione e aggiornamento form
Responses API2 richieste/secRecupero risposte
Webhooks API2 richieste/secGestione webhook
Tutti gli endpoint120 richieste/minRate limit globale

Paginazione delle risposte

La Responses API restituisce un massimo di 1.000 risposte per richiesta. Usa i parametri cursor before o after per la paginazione quando recuperi set di risposte grandi.

Risoluzione dei problemi

ProblemaCausaSoluzione
Webhook non ricevutoWebhook disabilitatoAbilita il webhook nella dashboard Typeform
Risposte mancantiFiltro applicatoControlla i parametri since/until e completed
Errore auth 401Token scadutoGenera un nuovo Personal Access Token
Rate limit 429Troppe richiesteImplementa throttling delle richieste
Risposte vuoteCampi opzionaliGestisci valori di risposta null/undefined

Modalità debug

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

Best practice

  1. Usa i webhook - Preferisci i webhook al polling per la cattura delle risposte in real-time
  2. Valida le firme - Verifica sempre le firme dei webhook per sicurezza
  3. Usa gli Hidden Fields - Pre-popola i dati cliente conosciuti nei form
  4. Mappa i reference dei campi - Usa valori ref stabili invece degli ID dei campi
  5. Gestisci le risposte parziali - Tieni conto delle domande opzionali e saltate
  6. Imposta la logica di retry - Implementa l’elaborazione idempotente dei webhook

Sicurezza

  • OAuth 2.0 - Autenticazione basata su token con scope
  • Firme webhook - Validazione firma HMAC SHA-256
  • Solo HTTPS - Tutti gli endpoint API richiedono TLS
  • Scoping del token - Richiedi gli scope OAuth minimi necessari
  • Gestione dei segreti - Memorizza i token in variabili d’ambiente o secret manager
  • Conformità GDPR - Usa la Delete Responses API per richieste di cancellazione dati

Risorse correlate

Subscribe to updates

developer-docs

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

auto-detect
Assistente AI

Ciao! Chiedimi qualsiasi cosa sulla documentazione.