---
title: "Supabase Connector"
description: "คู่มือการผสานรวม Supabase ฉบับสมบูรณ์สำหรับการซิงค์ database records การยืนยันตัวตนผู้ใช้ file storage และเหตุการณ์แบบเรียลไทม์กับแพลตฟอร์ม engagement ของคุณ"
url: https://tajo.io/th/docs/connectors/custom/supabase/
markdown: https://tajo.io/th/docs/connectors/custom/supabase.md
lang: th-TH
robots: noindex
---

ขอสิทธิ์ใช้งานล่วงหน้า

กรอกชื่อและที่อยู่อีเมลที่ทำงานของคุณ เราจะส่งลิงก์เพื่อยืนยันคำขอเข้าใช้งาน Tajo ทางอีเมล

# Supabase Connector

สถานะตัวเชื่อม: วางแผนไว้ ยังไม่ได้สร้าง ปัจจุบัน Tajo ยังไม่ได้ใช้งานตัวเชื่อมนี้

| ฟิลด์ต้นทาง | ฟิลด์ปลายทาง | ค่าตัวอย่าง |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

เชื่อมต่อ Supabase project ของคุณเพื่อซิงค์ database records ข้อมูลการยืนยันตัวตนผู้ใช้ เหตุการณ์ file storage และการเปลี่ยนแปลงแบบเรียลไทม์สำหรับระบบอัตโนมัติการมีส่วนร่วมกับลูกค้า

## ภาพรวม

| คุณสมบัติ | ค่า |
| --- | --- |
| **แพลตฟอร์ม** | Supabase |
| **หมวดหมู่** | Database & Backend |
| **ความซับซ้อนในการตั้งค่า** | ง่าย |
| **การผสานรวมอย่างเป็นทางการ** | ไม่ |
| **ข้อมูลที่ซิงค์** | ผู้ใช้ Tables Storage เหตุการณ์ |
| **ทักษะที่ใช้ได้** | 11 |
| **ประเภท API** | REST (PostgREST) + Realtime WebSocket |
| **เอกสารทางการ** | [supabase.com/docs](https://supabase.com/docs) |

## ฟีเจอร์

- **REST API ที่สร้างอัตโนมัติ** - การดำเนินการ CRUD บน Postgres table ใดก็ได้ผ่าน PostgREST ไม่ต้องเขียนโค้ด
- **การซิงค์ผู้ใช้ Auth** - ซิงค์ผู้ใช้ Supabase Auth (อีเมล โทรศัพท์ social logins) ไปยังแพลตฟอร์ม engagement ของคุณ
- **Real-time subscriptions** - รับฟังเหตุการณ์ INSERT, UPDATE, DELETE บน table ใดก็ได้แบบเรียลไทม์
- **Row Level Security** - การเข้าถึง API ทั้งหมดเป็นไปตาม Postgres RLS policies สำหรับข้อมูล multi-tenant ที่ปลอดภัย
- **การผสานรวม Storage** - ติดตามการอัปโหลดไฟล์และจัดการ assets ใน Storage buckets
- **Edge Functions** - เรียก serverless Deno functions สำหรับ custom logic และ webhooks
- **Full-text search** - ใช้ความสามารถ full-text search ของ Postgres ผ่าน API

## ข้อกำหนดเบื้องต้น

ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:

1. Supabase project ([app.supabase.com](https://app.supabase.com/))
2. **API URL** และ **API keys** ของ project (พบได้ใน Settings → API)
3. บัญชี Tajo ที่มีสิทธิ์เข้าถึง API

API Keys

Supabase มีสอง keys: `anon` (สาธารณะ เป็นไปตาม RLS) และ `service_role` (ข้ามผ่าน RLS สิทธิ์ admin) ใช้ `service_role` สำหรับการผสานรวมฝั่งเซิร์ฟเวอร์ และ `anon` สำหรับฝั่ง client

## การยืนยันตัวตน

Supabase ใช้การยืนยันตัวตนด้วย API key คำขอทุกรายการต้องใช้ header `apikey` และอาจต้องใช้ Authorization bearer token สำหรับการเข้าถึงในขอบเขตผู้ใช้

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

## การกำหนดค่า

### การตั้งค่าพื้นฐาน

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

### การแมปฟิลด์

แมปคอลัมน์ Supabase table กับแอตทริบิวต์แพลตฟอร์ม engagement:

#### การแมปผู้ใช้ค่าเริ่มต้น

| Parameter | Type | Description |
| --- | --- | --- |
| `email` required | string | อีเมลผู้ใช้จาก Supabase Auth (ตัวระบุที่ไม่ซ้ำกัน) |
| `phone` optional | string | หมายเลขโทรศัพท์สำหรับการ engagement ผ่าน SMS/WhatsApp |
| `user_metadata.full_name` optional | string | ชื่อแสดงจาก Auth user metadata |
| `user_metadata.avatar_url` optional | string | URL รูปโปรไฟล์ |
| `created_at` optional | timestamp | timestamp การสร้างบัญชี |
| `last_sign_in_at` optional | timestamp | การเข้าสู่ระบบครั้งล่าสุดสำหรับการให้คะแนน engagement |
| `app_metadata.provider` optional | string | ผู้ให้บริการ Auth (email, google, github ฯลฯ) |
| `confirmed_at` optional | timestamp | timestamp การยืนยันอีเมล |

#### การแมป Custom Table

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

## API Endpoints

Supabase REST API สร้างอัตโนมัติจาก database schema ของคุณที่ `https://<ref>.supabase.co/rest/v1/`

| Endpoint | เมธอด | คำอธิบาย |
| --- | --- | --- |
| `/rest/v1/{table}` | `GET` | Query rows พร้อม filtering, ordering, pagination |
| `/rest/v1/{table}` | `POST` | แทรก rows (รองรับ bulk และ upsert) |
| `/rest/v1/{table}` | `PATCH` | อัปเดต rows ที่ตรงกับตัวกรอง |
| `/rest/v1/{table}` | `DELETE` | ลบ rows ที่ตรงกับตัวกรอง |
| `/rest/v1/rpc/{function}` | `POST` | เรียก Postgres function |
| `/auth/v1/signup` | `POST` | สร้างผู้ใช้ใหม่ |
| `/auth/v1/token?grant_type=password` | `POST` | ลงชื่อเข้าใช้ด้วยรหัสผ่าน |
| `/auth/v1/user` | `GET` | ดูผู้ใช้ปัจจุบัน |
| `/auth/v1/admin/users` | `GET` | แสดงรายการผู้ใช้ทั้งหมด (service\_role) |
| `/storage/v1/object/{bucket}/{path}` | `POST` | อัปโหลดไฟล์ |
| `/storage/v1/object/list/{bucket}` | `POST` | แสดงรายการไฟล์ใน bucket |
| `/functions/v1/{function_name}` | `POST` | เรียก Edge Function |

### ตัวดำเนินการกรอง

| ตัวดำเนินการ | คำอธิบาย | ตัวอย่าง |
| --- | --- | --- |
| `eq` | เท่ากับ | `?status=eq.active` |
| `neq` | ไม่เท่ากับ | `?status=neq.deleted` |
| `gt`, `gte` | มากกว่า | `?amount=gt.100` |
| `lt`, `lte` | น้อยกว่า | `?created_at=lt.2024-01-01` |
| `like`, `ilike` | จับคู่รูปแบบ | `?name=ilike.%john%` |
| `in` | ใน array | `?status=in.(active,trial)` |
| `is` | ตรวจสอบ null | `?deleted_at=is.null` |

## เหตุการณ์

### เหตุการณ์ Auth

| เหตุการณ์ | ทริกเกอร์ | กรณีใช้งาน |
| --- | --- | --- |
| `user.signed_up` | การลงทะเบียนผู้ใช้ใหม่ | ชุดอีเมลต้อนรับ |
| `user.signed_in` | ผู้ใช้เข้าสู่ระบบ | การติดตามกิจกรรม |
| `user.updated` | การเปลี่ยนแปลงโปรไฟล์ | การซิงค์ข้อมูล |
| `user.deleted` | การลบบัญชี | เวิร์กโฟลว์ cleanup |

### เหตุการณ์ Database (Realtime)

| เหตุการณ์ | ทริกเกอร์ | กรณีใช้งาน |
| --- | --- | --- |
| `INSERT` | เพิ่ม row ใหม่ | การแจ้งเตือนคำสั่งซื้อ/ลูกค้าใหม่ |
| `UPDATE` | แก้ไข row | เวิร์กโฟลว์เปลี่ยนแปลงสถานะ |
| `DELETE` | ลบ row | การตรวจจับ churn |

### เหตุการณ์ Webhook

| เหตุการณ์ | ทริกเกอร์ | กรณีใช้งาน |
| --- | --- | --- |
| `auth.user.created` | User signup ผ่าน webhook | ทริกเกอร์ onboarding |
| `storage.object.created` | อัปโหลดไฟล์ | การประมวลผล asset |

## ตัวอย่างโค้ด

### เริ่มต้น Connector

```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,
});
```

### ซิงค์ผู้ใช้เป็นผู้ติดต่อ

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

### รับฟังการเปลี่ยนแปลงแบบเรียลไทม์

```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();
```

### Query และแบ่งกลุ่ม

```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);
```

## ขีดจำกัดอัตรา

ขีดจำกัดอัตรา API

ขีดจำกัดอัตราของ Supabase ขึ้นอยู่กับแผนของคุณ Free tier: 500 คำขอ/นาที Pro: 1,000 คำขอ/วินาที ติดต่อ Supabase สำหรับขีดจำกัด Enterprise

| แผน | ขีดจำกัดอัตรา | การเชื่อมต่อ Realtime |
| --- | --- | --- |
| Free | 500 คำขอ/นาที | 200 พร้อมกัน |
| Pro | 1,000 คำขอ/วินาที | 500 พร้อมกัน |
| Team | 2,000 คำขอ/วินาที | 1,000 พร้อมกัน |
| Enterprise | กำหนดเอง | กำหนดเอง |

## การแก้ไขปัญหา

### ปัญหาทั่วไป

| ปัญหา | สาเหตุ | วิธีแก้ |
| --- | --- | --- |
| 401 Unauthorized | API key ไม่ถูกต้องหรือหมดอายุ | ตรวจสอบ API keys ใน Supabase Dashboard → Settings → API |
| 403 Forbidden | RLS policy บล็อกการเข้าถึง | ใช้ key `service_role` สำหรับการดำเนินการ admin หรือตรวจสอบ RLS policies |
| ไม่มีเหตุการณ์ realtime | Realtime ไม่ได้เปิดใช้งานสำหรับ table | เปิดใช้งานใน Database → Replication → เพิ่ม table ใน publication |
| ผล query ว่างเปล่า | RLS กรองทุก rows | ตรวจสอบว่า RLS policies อนุญาตให้ role ที่ยืนยันตัวตนอ่านได้ |
| การอัปโหลด storage ล้มเหลว | Bucket policies | ตรวจสอบว่า Storage bucket เป็น public หรือมี RLS policies ที่ถูกต้อง |

### โหมด Debug

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

### ทดสอบการเชื่อมต่อ

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

## แนวทางปฏิบัติที่ดีที่สุด

1. **ใช้ service\_role key ฝั่งเซิร์ฟเวอร์เท่านั้น** - อย่าเปิดเผยในโค้ด client
2. **เปิดใช้งาน RLS บนทุก tables** - แม้แต่กับ service\_role ออกแบบด้วย RLS เพื่อการป้องกันเชิงลึก
3. **ใช้ Realtime สำหรับ event-driven sync** - มีประสิทธิภาพมากกว่าการ polling สำหรับการเปลี่ยนแปลง
4. **Batch operations** - ใช้ bulk inserts และตัวกรอง `in` สำหรับการดำเนินการปริมาณสูง
5. **แมป user metadata** - เก็บฟิลด์ที่เกี่ยวข้องกับ engagement ใน `user_metadata` ระหว่างการลงทะเบียน
6. **ใช้ Edge Functions สำหรับ webhooks** - ประมวลผล incoming webhooks ด้วย Supabase Edge Functions เพื่อการจัดการ latency ต่ำ

## ความปลอดภัย

- **การยืนยันตัวตนด้วย API Key** - คำขอทั้งหมดต้องใช้ API keys ที่ถูกต้อง
- **Row Level Security (RLS)** - การควบคุมการเข้าถึงต่อ row แบบ Postgres-native
- **การตรวจสอบ JWT** - Auth tokens เป็น JWTs ที่ลายเซ็นและตรวจสอบในทุกคำขอ
- **SSL/TLS** - การเชื่อมต่อทั้งหมดเข้ารหัสระหว่างการส่ง
- **SOC 2 Type II** - Supabase สอดคล้องกับ SOC 2
- **Network Restrictions** - IP allowlisting เสริมสำหรับแผนที่ชำระเงิน

## แหล่งข้อมูลที่เกี่ยวข้อง

- [Shopify Connector](https://tajo.io/th/docs/connectors/ecommerce/shopify)
- [Stripe Connector](https://tajo.io/th/docs/connectors/ecommerce/stripe)
- [Auth0 Connector](https://tajo.io/th/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)
