---
title: "Konektor Airtable"
description: "Panduan integrasi Airtable lengkap untuk menyinkronkan bases, tables, dan records dengan contacts serta lists Brevo melalui Tajo."
url: https://tajo.io/in/docs/connectors/custom/airtable/
markdown: https://tajo.io/in/docs/connectors/custom/airtable.md
lang: id-ID
robots: noindex
---

Ajukan akses awal

Masukkan nama depan dan alamat email kerja Anda. Kami akan mengirim tautan untuk mengonfirmasi permintaan akses Tajo.

# Konektor Airtable

Status konektor: Direncanakan Belum dibangun. Tajo belum menjalankan konektor ini.

| Field sumber | Field tujuan | Nilai contoh |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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:

1. Akun Airtable (paket Free atau di atasnya)
2. Personal Access Token atau aplikasi OAuth yang sudah dikonfigurasi
3. Akses ke bases dan tables yang ingin Anda sinkronkan
4. Akun Brevo dengan akses API
5. Akun Tajo dengan langganan aktif

## Autentikasi

Airtable mendukung Personal Access Token dan OAuth 2.0.

### Opsi 1: Personal Access Token (direkomendasikan)

1. Buka [airtable.com/create/tokens](https://airtable.com/create/tokens)
2. Klik **Create new token**
3. Beri nama “Tajo Integration”
4. Tambahkan scope:

```
data.records:read
data.records:write
data.recordComments:read
schema.bases:read
webhook:manage
```

5. Tambahkan akses ke bases tertentu atau ke semua bases
6. Klik **Create token**

### Opsi 2: OAuth 2.0

Untuk integrasi multi-pengguna, gunakan alur OAuth 2.0:

1. Daftarkan integrasi Anda di [airtable.com/create/oauth](https://airtable.com/create/oauth)
2. Konfigurasikan redirect URI: `https://app.tajo.io/callbacks/airtable`
3. 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

```bash
tajo connectors install airtable \
  --token $AIRTABLE_TOKEN
```

## Konfigurasi

### Penyiapan dasar

```yaml
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:

```yaml
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_DATE
```

### Sync berbasis view

```yaml
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: true
```

## Endpoint 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

```javascript
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

```javascript
// Sync an Airtable table to a Brevo list
await 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

```javascript
// Airtable webhooks notify of changes; fetch details with cursor
app.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

```javascript
// Create an Airtable record when a Brevo contact converts
tajo.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

```yaml
connectors:
  airtable:
    debug: true
    log_level: verbose
    log_api_calls: true
```

### Uji koneksi

```bash
tajo connectors test airtable
# ✓ API authentication successful
# ✓ Base access verified
# ✓ Table schema readable
# ✓ Record listing operational
# ✓ Webhook registration available
```

## Praktik terbaik

1. **Batasi token ke bases tertentu** - Jangan berikan akses ke semua bases kecuali memang diperlukan
2. **Gunakan view untuk sync terfilter** - Sinkronkan view tertentu alih-alih seluruh table untuk mengurangi volume data
3. **Kelompokkan operasi record** - Gabungkan pembuatan dan pembaruan dalam batch berisi 10
4. **Tangani paginasi** - Airtable mengembalikan 100 records per halaman; lakukan iterasi dengan `offset`
5. **Gunakan webhook untuk real-time** - Daftarkan webhook alih-alih melakukan polling perubahan
6. **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

## Sumber daya terkait

- [Konektor Notion](https://tajo.io/in/docs/connectors/custom/notion)
- [Konektor GitHub](https://tajo.io/in/docs/connectors/custom/github)
- [Skill Customer Sync](https://tajo.io/in/docs/skills/data-sync/customer-sync)
- [Brevo Contacts API](https://tajo.io/in/docs/contact-management)
