---
title: "Konektor Supabase"
description: "Panduan integrasi Supabase lengkap untuk menyinkronkan record database, data autentikasi pengguna, penyimpanan file, dan event real-time dengan platform engagement Anda."
url: https://tajo.io/in/docs/connectors/custom/supabase/
markdown: https://tajo.io/in/docs/connectors/custom/supabase.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 Supabase

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 proyek Supabase Anda untuk menyinkronkan record database, data autentikasi pengguna, event penyimpanan file, dan perubahan real-time untuk otomatisasi customer engagement.

## Ikhtisar

| Properti | Nilai |
| --- | --- |
| **Platform** | Supabase |
| **Kategori** | Database & Backend |
| **Kompleksitas setup** | Mudah |
| **Integrasi resmi** | Tidak |
| **Data yang disinkronkan** | Pengguna, tabel, storage, event |
| **Skill yang tersedia** | 11 |
| **Tipe API** | REST (PostgREST) + Realtime WebSocket |
| **Dokumentasi resmi** | [supabase.com/docs](https://supabase.com/docs) |

## Fitur

- **REST API yang dibuat otomatis**, operasi CRUD pada tabel Postgres mana pun via PostgREST, tanpa perlu kode
- **Sinkronisasi pengguna Auth**, sinkronkan pengguna Supabase Auth (email, telepon, login sosial) ke platform engagement Anda
- **Langganan real-time**, dengarkan event INSERT, UPDATE, DELETE pada tabel mana pun secara real-time
- **Row Level Security**, seluruh akses API menghormati kebijakan RLS Postgres untuk data multi-tenant yang aman
- **Integrasi Storage**, lacak unggahan file dan kelola aset di seluruh bucket Storage
- **Edge Functions**, panggil fungsi serverless Deno untuk logika kustom dan webhook
- **Pencarian teks penuh**, manfaatkan kemampuan full-text search Postgres melalui API

## Prasyarat

Sebelum memulai, pastikan Anda memiliki:

1. Sebuah proyek Supabase ([app.supabase.com](https://app.supabase.com/))
2. **API URL** dan **API key** proyek Anda (tersedia di Settings → API)
3. Akun Tajo dengan akses API

API key

Supabase menyediakan dua key: `anon` (publik, menghormati RLS) dan `service_role` (melewati RLS, akses admin). Gunakan `service_role` untuk integrasi sisi server dan `anon` untuk sisi klien.

## Autentikasi

Supabase menggunakan autentikasi API key. Setiap permintaan memerlukan header `apikey` dan secara opsional token bearer `Authorization` untuk akses yang dicakup per pengguna.

```bash
# Using anon key (respects RLS)
curl 'https://<project_ref>.supabase.co/rest/v1/customers' \
  -H "apikey: <SUPABASE_ANON_KEY>" \
  -H "Authorization: Bearer <SUPABASE_ANON_KEY>"

# Using service_role key (bypasses RLS)
curl 'https://<project_ref>.supabase.co/rest/v1/customers' \
  -H "apikey: <SUPABASE_SERVICE_ROLE_KEY>" \
  -H "Authorization: Bearer <SUPABASE_SERVICE_ROLE_KEY>"
```

## Konfigurasi

### Setup dasar

```yaml
connectors:
  supabase:
    enabled: true
    project_url: "https://xyzcompany.supabase.co"
    api_key: "${SUPABASE_SERVICE_ROLE_KEY}"

    # Data sync options
    sync:
      users: true
      tables:
        - customers
        - orders
        - products
      storage: true
      realtime: true

    # Map Supabase Auth users to contacts
    user_mapping:
      email: email
      phone: SMS
      user_metadata.full_name: FIRSTNAME
      created_at: SIGNUP_DATE
```

### Pemetaan field

Petakan kolom tabel Supabase ke atribut platform engagement:

#### Pemetaan pengguna default

| Parameter | Type | Description |
| --- | --- | --- |
| `email` required | string | Email pengguna dari Supabase Auth (identifier unik) |
| `phone` optional | string | Nomor telepon untuk engagement SMS/WhatsApp |
| `user_metadata.full_name` optional | string | Nama tampilan dari metadata pengguna Auth |
| `user_metadata.avatar_url` optional | string | URL gambar profil |
| `created_at` optional | timestamp | Timestamp pembuatan akun |
| `last_sign_in_at` optional | timestamp | Login terakhir untuk penilaian engagement |
| `app_metadata.provider` optional | string | Penyedia Auth (email, google, github, dll.) |
| `confirmed_at` optional | timestamp | Timestamp konfirmasi email |

#### Pemetaan tabel kustom

```yaml
table_mapping:
  customers:
    # Column → Attribute mapping
    email: email
    full_name: FIRSTNAME
    company: COMPANY
    plan: SUBSCRIPTION_PLAN
    mrr: MONTHLY_REVENUE
    created_at: SIGNUP_DATE

  orders:
    # Track as events
    sync_as: events
    event_name: "order_placed"
    properties:
      total: amount
      status: order_status
      items: line_items
```

## Endpoint API

REST API Supabase dibuat otomatis dari skema database Anda di `https://<ref>.supabase.co/rest/v1/`.

| Endpoint | Metode | Deskripsi |
| --- | --- | --- |
| `/rest/v1/{table}` | `GET` | Mengueri baris dengan filter, pengurutan, dan paginasi |
| `/rest/v1/{table}` | `POST` | Menyisipkan baris (mendukung bulk dan upsert) |
| `/rest/v1/{table}` | `PATCH` | Memperbarui baris yang cocok dengan filter |
| `/rest/v1/{table}` | `DELETE` | Menghapus baris yang cocok dengan filter |
| `/rest/v1/rpc/{function}` | `POST` | Memanggil fungsi Postgres |
| `/auth/v1/signup` | `POST` | Membuat pengguna baru |
| `/auth/v1/token?grant_type=password` | `POST` | Masuk dengan password |
| `/auth/v1/user` | `GET` | Mengambil pengguna saat ini |
| `/auth/v1/admin/users` | `GET` | Menampilkan semua pengguna (service\_role) |
| `/storage/v1/object/{bucket}/{path}` | `POST` | Mengunggah file |
| `/storage/v1/object/list/{bucket}` | `POST` | Menampilkan file dalam bucket |
| `/functions/v1/{function_name}` | `POST` | Memanggil Edge Function |

### Operator filter

| Operator | Deskripsi | Contoh |
| --- | --- | --- |
| `eq` | Sama dengan | `?status=eq.active` |
| `neq` | Tidak sama dengan | `?status=neq.deleted` |
| `gt`, `gte` | Lebih besar dari | `?amount=gt.100` |
| `lt`, `lte` | Lebih kecil dari | `?created_at=lt.2024-01-01` |
| `like`, `ilike` | Pencocokan pola | `?name=ilike.%john%` |
| `in` | Ada dalam array | `?status=in.(active,trial)` |
| `is` | Pemeriksaan null | `?deleted_at=is.null` |

## Event

### Event Auth

| Event | Pemicu | Kasus penggunaan |
| --- | --- | --- |
| `user.signed_up` | Registrasi pengguna baru | Rangkaian sambutan |
| `user.signed_in` | Login pengguna | Pelacakan aktivitas |
| `user.updated` | Perubahan profil | Sinkronisasi data |
| `user.deleted` | Penghapusan akun | Alur kerja pembersihan |

### Event database (Realtime)

| Event | Pemicu | Kasus penggunaan |
| --- | --- | --- |
| `INSERT` | Baris baru ditambahkan | Notifikasi pesanan/pelanggan baru |
| `UPDATE` | Baris diubah | Alur kerja perubahan status |
| `DELETE` | Baris dihapus | Deteksi churn |

### Event webhook

| Event | Pemicu | Kasus penggunaan |
| --- | --- | --- |
| `auth.user.created` | Pendaftaran pengguna via webhook | Memicu onboarding |
| `storage.object.created` | File diunggah | Pemrosesan aset |

## Contoh kode

### Inisialisasi konektor

```javascript
import { TajoClient } from '@tajo/sdk';
import { createClient } from '@supabase/supabase-js';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
});

// Connect Supabase project
await tajo.connectors.connect('supabase', {
  projectUrl: process.env.SUPABASE_URL,
  serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
});
```

### Menyinkronkan pengguna ke kontak

```javascript
// Sync all Supabase Auth users as contacts
await tajo.connectors.sync('supabase', {
  type: 'full',
  resources: ['users'],
});

// Incremental sync (new/changed users only)
await tajo.connectors.sync('supabase', {
  type: 'incremental',
  resources: ['users'],
  since: '2024-01-01T00:00:00Z',
});
```

### Mendengarkan perubahan real-time

```javascript
// Subscribe to new orders for engagement triggers
const supabase = createClient(
  process.env.SUPABASE_URL,
  process.env.SUPABASE_SERVICE_ROLE_KEY
);

supabase
  .channel('orders')
  .on('postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'orders' },
    async (payload) => {
      // Forward to Tajo as an event
      await tajo.events.track({
        email: payload.new.customer_email,
        event: 'order_placed',
        properties: {
          order_id: payload.new.id,
          total: payload.new.total,
          items: payload.new.line_items,
        },
      });
    }
  )
  .subscribe();
```

### Kueri dan segmentasi

```javascript
// Query customers by plan for targeted campaigns
const { data: proUsers } = await supabase
  .from('customers')
  .select('email, full_name, plan, mrr')
  .eq('plan', 'pro')
  .gt('mrr', 100)
  .order('mrr', { ascending: false });

// Sync to a Brevo list for campaign targeting
await tajo.lists.addContacts(PRO_LIST_ID, proUsers);
```

## Batas rate

Batas rate API

Batas rate Supabase bergantung pada paket Anda. Paket Free: 500 permintaan/menit. Pro: 1.000 permintaan/detik. Hubungi Supabase untuk batas Enterprise.

| Paket | Batas rate | Koneksi Realtime |
| --- | --- | --- |
| Free | 500 req/menit | 200 bersamaan |
| Pro | 1.000 req/detik | 500 bersamaan |
| Team | 2.000 req/detik | 1.000 bersamaan |
| Enterprise | Kustom | Kustom |

## Pemecahan masalah

### Masalah umum

| Masalah | Penyebab | Solusi |
| --- | --- | --- |
| 401 Unauthorized | API key tidak valid atau kedaluwarsa | Periksa API key di Supabase Dashboard → Settings → API |
| 403 Forbidden | Kebijakan RLS memblokir akses | Gunakan key `service_role` untuk operasi admin, atau periksa kebijakan RLS |
| Tidak ada event realtime | Realtime belum aktif untuk tabel | Aktifkan di Database → Replication → tambahkan tabel ke publication |
| Hasil kueri kosong | RLS menyaring seluruh baris | Pastikan kebijakan RLS mengizinkan role terautentikasi untuk membaca |
| Unggahan Storage gagal | Kebijakan bucket | Pastikan bucket Storage disetel publik atau memiliki kebijakan RLS yang benar |

### Mode debug

```yaml
connectors:
  supabase:
    debug: true
    log_level: verbose
    log_queries: true
    log_realtime: true
```

### Menguji koneksi

```bash
tajo connectors test supabase
# ✓ API connection successful
# ✓ Auth endpoint accessible
# ✓ Tables readable (12 tables found)
# ✓ Storage accessible (3 buckets)
# ✓ Realtime connection established
# ✓ Edge Functions available (4 functions)
```

## Praktik terbaik

1. **Gunakan key service\_role hanya di sisi server**, jangan pernah mengeksposnya dalam kode klien
2. **Aktifkan RLS pada semua tabel**, bahkan dengan service\_role, rancanglah dengan RLS untuk defense in depth
3. **Gunakan Realtime untuk sinkronisasi berbasis event**, lebih efisien daripada polling untuk perubahan
4. **Kelompokkan operasi**, gunakan bulk insert dan filter `in` untuk operasi bervolume tinggi
5. **Petakan metadata pengguna**, simpan field yang relevan untuk engagement di `user_metadata` saat pendaftaran
6. **Gunakan Edge Functions untuk webhook**, proses webhook masuk dengan Supabase Edge Functions untuk penanganan berlatensi rendah

## Keamanan

- **Autentikasi API key**, seluruh permintaan memerlukan API key yang valid
- **Row Level Security (RLS)**, kontrol akses native Postgres per baris
- **Verifikasi JWT**, token Auth berupa JWT bertanda tangan yang diverifikasi pada setiap permintaan
- **SSL/TLS**, seluruh koneksi dienkripsi saat transit
- **SOC 2 Type II**, Supabase telah memenuhi kepatuhan SOC 2
- **Network Restrictions**, allowlist IP opsional pada paket berbayar

## Sumber daya terkait

- [Konektor Shopify](https://tajo.io/in/docs/connectors/ecommerce/shopify)
- [Konektor Stripe](https://tajo.io/in/docs/connectors/ecommerce/stripe)
- [Konektor Auth0](https://tajo.io/in/docs/connectors/custom/auth0)
- [Supabase Official Docs](https://supabase.com/docs)
- [Supabase REST API Guide](https://supabase.com/docs/guides/api)
- [Supabase Auth Guide](https://supabase.com/docs/guides/auth)
