Konektor Airtable
Hubungkan bases Airtable Anda ke Brevo untuk sinkronisasi CRM, pengelolaan katalog produk, dan alur kerja marketing otomatis yang ditenagai data terstruktur melalui Tajo.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Airtable |
| Kategori | Kustom |
| Kompleksitas penyiapan | Mudah |
| Integrasi resmi | Tidak |
| Data yang disinkronkan | Records, Tables, Users |
| Tipe API | REST API |
| Autentikasi | Personal Access Token / OAuth 2.0 |
| Base URL | https://api.airtable.com/v0/ |
Fitur
- Sync table ke list - Sinkronkan records table Airtable langsung ke contact list Brevo
- Jembatan katalog produk - Gunakan tables Airtable sebagai katalog produk untuk rekomendasi email
- Sinkronisasi CRM - Sync dua arah antara CRM Airtable dan contacts Brevo
- Event pengiriman form - Teruskan pengiriman form Airtable sebagai event Brevo
- Pemfilteran berbasis view - Sinkronkan view Airtable tertentu ke list Brevo yang ditargetkan
- Otomatisasi webhook - Picu kampanye Brevo saat records Airtable berubah
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun Airtable (paket Free atau di atasnya)
- Personal Access Token atau aplikasi OAuth yang sudah dikonfigurasi
- Akses ke bases dan tables yang ingin Anda sinkronkan
- Akun Brevo dengan akses API
- Akun Tajo dengan langganan aktif
Autentikasi
Airtable mendukung Personal Access Token dan OAuth 2.0.
Opsi 1: Personal Access Token (direkomendasikan)
- Buka airtable.com/create/tokens
- Klik Create new token
- Beri nama “Tajo Integration”
- Tambahkan scope:
data.records:readdata.records:writedata.recordComments:readschema.bases:readwebhook:manage- Tambahkan akses ke bases tertentu atau ke semua bases
- Klik Create token
Opsi 2: OAuth 2.0
Untuk integrasi multi-pengguna, gunakan alur OAuth 2.0:
- Daftarkan integrasi Anda di airtable.com/create/oauth
- Konfigurasikan redirect URI:
https://app.tajo.io/callbacks/airtable - Minta scope yang sama seperti di atas
Pembatasan cakupan token
Personal Access Token dapat dibatasi ke bases tertentu. Demi keamanan, berikan akses hanya ke bases yang dibutuhkan integrasi Anda, bukan memilih “All current and future bases.”
Menghubungkan ke Tajo
tajo connectors install airtable \ --token $AIRTABLE_TOKENKonfigurasi
Penyiapan dasar
connectors: airtable: enabled: true
sync: records: true comments: false
tables: - base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "Active Customers" sync_to_list: 28 - base_id: "appXXXXXXXXXXXXXX" table_name: "Products" sync_as: "catalog"Pemetaan field
Petakan field Airtable ke atribut contact Brevo:
field_mapping: # Airtable field -> Brevo attribute Name: FIRSTNAME Email: email Phone: SMS Company: COMPANY Status: LEAD_STATUS Revenue: TOTAL_REVENUE "Last Contact": LAST_CONTACT_DATE Tags: TAGS Notes: NOTES "Created Time": SIGNUP_DATESync berbasis view
views: - base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "High Value" sync_to_list: 29 filter_by_view: true
- base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "Churned" sync_to_list: 30 filter_by_view: trueEndpoint API
Tajo terintegrasi dengan endpoint Airtable Web API berikut:
| Endpoint | Method | Tujuan |
|---|---|---|
/v0/{baseId}/{tableIdOrName} | GET | Menampilkan records dalam sebuah table |
/v0/{baseId}/{tableIdOrName} | POST | Membuat records |
/v0/{baseId}/{tableIdOrName} | PATCH | Memperbarui records |
/v0/{baseId}/{tableIdOrName} | DELETE | Menghapus records |
/v0/{baseId}/{tableIdOrName}/{recordId} | GET | Mengambil satu record |
/v0/meta/bases | GET | Menampilkan bases yang dapat diakses |
/v0/meta/bases/{baseId}/tables | GET | Menampilkan tables dalam sebuah base |
/v0/{baseId}/{tableIdOrName}/listRecordComments | GET | Menampilkan komentar record |
/v0/bases/{baseId}/webhooks | POST | Membuat webhook |
/v0/bases/{baseId}/webhooks | GET | Menampilkan webhook |
Contoh kode
Inisialisasi konektor
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('airtable', { token: process.env.AIRTABLE_TOKEN});Sinkronkan table ke Brevo
// Sync an Airtable table to a Brevo listawait tajo.connectors.sync('airtable', { type: 'full', resources: ['records'], baseId: 'appXXXXXXXXXXXXXX', tableName: 'Customers', view: 'Active Customers', targetList: 28});
const status = await tajo.connectors.status('airtable');console.log(status);// {// connected: true,// lastSync: '2024-03-15T15:00:00Z',// recordsSynced: 2340,// tablesMonitored: 2,// basesConnected: 1// }Menangani webhook
// Airtable webhooks notify of changes; fetch details with cursorapp.post('/webhooks/airtable', async (req, res) => { const { base, webhook, timestamp } = req.body;
// Fetch changed records using webhook cursor const changes = await tajo.connectors.getWebhookPayloads('airtable', { baseId: base.id, webhookId: webhook.id, cursor: timestamp });
for (const change of changes) { await tajo.connectors.handleEvent('airtable', { type: change.actionType, payload: change }); }
res.status(200).send('OK');});Membuat record dari Brevo
// Create an Airtable record when a Brevo contact convertstajo.events.on('contact.attribute_updated', async (event) => { if (event.attribute === 'LIFECYCLE_STAGE' && event.value === 'customer') { await tajo.connectors.create('airtable', { baseId: 'appXXXXXXXXXXXXXX', tableName: 'Customers', fields: { Name: event.contact.name, Email: event.contact.email, Status: 'Customer', 'Converted Date': new Date().toISOString().split('T')[0] } }); }});Batas rate
Airtable menerapkan rate limit per base:
| Jenis batas | Nilai |
|---|---|
| Rate limit API | 5 request per detik per base |
| Records per request | maksimal 100 records (list), maksimal 10 records (create/update) |
| Payload webhook | 50 payload per panggilan listWebhookPayloads |
| Ukuran request | Payload maksimal ~2MB |
Operasi batch
Airtable mengizinkan pembuatan atau pembaruan hingga 10 records per request. Tajo otomatis mengelompokkan operasi yang lebih besar menjadi beberapa request sambil tetap menghormati rate limit.
Pemecahan masalah
Masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | Token tidak valid atau kedaluwarsa | Buat ulang Personal Access Token |
| 403 Forbidden | Token tidak memiliki akses ke base | Tambahkan base tersebut ke scope token Anda |
| 404 Not Found | ID base atau table tidak valid | Verifikasi base ID dan nama table |
| 422 Invalid Request | Tipe field tidak cocok | Periksa apakah tipe field Airtable sesuai dengan data Anda |
| Rate limit terlampaui | Lebih dari 5 req/dtk per base | Kurangi frekuensi sync atau jadwalkan sync antar-base secara bergiliran |
Mode debug
connectors: airtable: debug: true log_level: verbose log_api_calls: trueUji koneksi
tajo connectors test airtable# ✓ API authentication successful# ✓ Base access verified# ✓ Table schema readable# ✓ Record listing operational# ✓ Webhook registration availablePraktik terbaik
- Batasi token ke bases tertentu - Jangan berikan akses ke semua bases kecuali memang diperlukan
- Gunakan view untuk sync terfilter - Sinkronkan view tertentu alih-alih seluruh table untuk mengurangi volume data
- Kelompokkan operasi record - Gabungkan pembuatan dan pembaruan dalam batch berisi 10
- Tangani paginasi - Airtable mengembalikan 100 records per halaman; lakukan iterasi dengan
offset - Gunakan webhook untuk real-time - Daftarkan webhook alih-alih melakukan polling perubahan
- Petakan tipe field secara tepat - Cocokkan tipe field Airtable (select, number, date) dengan tipe atribut Brevo
Keamanan
- Personal Access Tokens - Dibatasi ke bases dan operasi tertentu
- OAuth 2.0 - Alur otorisasi aman dengan refresh token
- HTTPS Only - Semua komunikasi API dienkripsi melalui TLS 1.2+
- Base-Level Access Control - Token dibatasi ke masing-masing base
- Encrypted Storage - Token dienkripsi saat disimpan di Tajo
- Webhook HMAC Verification - Verifikasi keaslian notifikasi webhook