Typeform Bağlayıcısı
Form gönderimlerini otomatik olarak senkronize etmek, konuşma tabanlı formlardan müşteri adayı yakalamak ve anket gönderimleri ile test sonuçlarına göre pazarlama otomasyonları tetiklemek için Typeform’u Tajo aracılığıyla Brevo’ya bağlayın.
Genel Bakış
| Özellik | Değer |
|---|---|
| Platform | Typeform |
| Kategori | Formlar ve Anketler (Özel) |
| Kurulum Karmaşıklığı | Kolay |
| Resmi Entegrasyon | Hayır |
| Senkronize Edilen Veri | Yanıtlar, Kişiler, Olaylar, Formlar |
| Kimlik Doğrulama Yöntemi | OAuth 2.0 / Kişisel Erişim Belirteci |
Özellikler
- Gerçek zamanlı yanıt senkronizasyonu - Form gönderimlerini webhook’lar aracılığıyla otomatik olarak yakalayın
- Kişi oluşturma - Form yanıtlarından Brevo kişileri oluşturun veya güncelleyin
- Müşteri adayı puanlaması - Müşteri adayı niteliği için test puanlarını ve form verilerini kullanın
- Gizli Alanlar - Kişiselleştirilmiş formlar için Gizli Alanlar aracılığıyla müşteri verilerini iletin
- Koşullu eşleştirme - Yanıt mantığına göre farklı form alanlarını eşleyin
- Çoklu form desteği - Birden fazla typeform’u farklı Brevo listelerine bağlayın
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
- Bir Typeform hesabı (webhook’lar için Basic plan veya üzeri)
- Typeform Hesap Ayarlarından bir Kişisel Erişim Belirteci
- API erişimi olan bir Brevo hesabı
- Bağlayıcı izinlerine sahip bir Tajo hesabı
Kimlik Doğrulama
Kişisel Erişim Belirteci
# https://admin.typeform.com/account#/section/tokens adresinde bir belirteç oluşturunexport TYPEFORM_ACCESS_TOKEN=tfp_your_personal_access_tokenexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_keyOAuth 2.0
// OAuth 2.0 Yetkilendirme Akışı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() });
// Yetkilendirme kodunu erişim belirtecine dönüştürconst 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' })});Yapılandırma
Temel Kurulum
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}"Alan Eşleştirme
field_mapping: # Typeform alan referanslarını Brevo özniteliklerine eşle email: email name: FIRSTNAME company: COMPANY phone: SMS score: LEAD_SCORE quiz_result: QUIZ_SCORE nps_rating: NPS_SCORE feedback: LAST_FEEDBACKAPI Uç Noktaları
| Uç Nokta | Yöntem | Açıklama |
|---|---|---|
https://api.typeform.com/forms | GET | Tüm formları listele |
https://api.typeform.com/forms/{form_id} | GET | Bir formu al |
https://api.typeform.com/forms | POST | Form oluştur |
https://api.typeform.com/forms/{form_id} | PUT | Formu güncelle |
https://api.typeform.com/forms/{form_id}/responses | GET | Yanıtları al |
https://api.typeform.com/forms/{form_id}/responses | DELETE | Yanıtları sil |
https://api.typeform.com/forms/{form_id}/webhooks/{tag} | PUT | Webhook oluştur/güncelle |
https://api.typeform.com/forms/{form_id}/webhooks/{tag} | GET | Webhook al |
https://api.typeform.com/forms/{form_id}/webhooks | GET | Webhook’ları listele |
Kod Örnekleri
Bağlayıcıyı Başlatma
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']});Form Yanıtlarını Alma
// Responses API'si kullanarak yanıtları getirconst 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();
// Her yanıtı Brevo'ya senkronize etfor (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] }); }}Webhook’ları Ayarlama
// Gerçek zamanlı yanıt bildirimleri için webhook kaydetawait 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 }) });Webhook Olaylarını İşleme
app.post('/webhooks/typeform', async (req, res) => { // Webhook imzasını doğrula 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');});Hız Sınırları
| Uç Nokta | Hız Sınırı | Notlar |
|---|---|---|
| Create API | saniyede 2 istek | Form oluşturma ve güncelleme |
| Responses API | saniyede 2 istek | Yanıt alma |
| Webhooks API | saniyede 2 istek | Webhook yönetimi |
| Tüm uç noktalar | dakikada 120 istek | Genel hız sınırı |
Yanıt Sayfalama
Responses API, istek başına en fazla 1.000 yanıt döndürür. Büyük yanıt kümelerini alırken sayfalama için before veya after imleç parametrelerini kullanın.
Sorun Giderme
| Sorun | Neden | Çözüm |
|---|---|---|
| Webhook alınmıyor | Webhook devre dışı | Typeform panelinde webhook’u etkinleştirin |
| Eksik yanıtlar | Filtre uygulandı | since/until ve completed parametrelerini kontrol edin |
| Kimlik doğrulama hatası 401 | Belirteç süresi dolmuş | Yeni Kişisel Erişim Belirteci oluşturun |
| Hız sınırı 429 | Çok fazla istek | İstek kısıtlaması uygulayın |
| Boş cevaplar | İsteğe bağlı alanlar | Null/undefined cevap değerlerini işleyin |
Hata Ayıklama Modu
connectors: typeform: debug: true log_level: verbose log_webhooks: true log_responses: trueEn İyi Uygulamalar
- Webhook kullanın - Gerçek zamanlı yanıt yakalama için yoklama yerine webhook’ları tercih edin
- İmzaları doğrulayın - Güvenlik için webhook imzalarını her zaman doğrulayın
- Gizli Alanları kullanın - Formlarda bilinen müşteri verilerini önceden doldurun
- Alan referanslarını eşleyin - Alan kimlikleri yerine kararlı alan
refdeğerlerini kullanın - Kısmi yanıtları işleyin - İsteğe bağlı ve atlanmış soruları göz önünde bulundurun
- Yeniden deneme mantığı ayarlayın - İdempotent webhook işleme uygulayın
Güvenlik
- OAuth 2.0 - Kapsamlı belirteç tabanlı kimlik doğrulama
- Webhook imzaları - SHA-256 HMAC imza doğrulama
- Yalnızca HTTPS - Tüm API uç noktaları TLS gerektirir
- Belirteç kapsamlama - Minimum gerekli OAuth kapsamlarını talep edin
- Gizli anahtar yönetimi - Belirteçleri ortam değişkenlerinde veya gizli anahtar yöneticilerinde saklayın
- GDPR uyumluluğu - Veri silme istekleri için Delete Responses API’sini kullanın