---
title: "Supabase コネクタ"
description: "データベースレコード、ユーザー認証、ファイルストレージ、リアルタイムイベントをエンゲージメントプラットフォームと同期するための完全な Supabase 統合ガイド。"
url: https://tajo.io/jp/docs/connectors/custom/supabase/
markdown: https://tajo.io/jp/docs/connectors/custom/supabase.md
lang: ja-JP
robots: noindex
---

先行利用を申し込む

お名前と会社のメールアドレスを入力してください。Tajoへのアクセス申請を確認するためのリンクをメールでお送りします。

# Supabase コネクタ

コネクターのステータス: 予定 まだ構築されていません。Tajo は現在このコネクターを実行していません。

| 送信元フィールド | 送信先フィールド | サンプル値 |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Supabase プロジェクトを接続して、データベースレコード、ユーザー認証データ、ファイルストレージイベント、リアルタイム変更を同期し、顧客エンゲージメント自動化を実現します。

## 概要

| プロパティ | 値 |
| --- | --- |
| **プラットフォーム** | Supabase |
| **カテゴリ** | データベースとバックエンド |
| **セットアップの複雑さ** | 簡単 |
| **公式統合** | いいえ |
| **同期データ** | ユーザー、テーブル、ストレージ、イベント |
| **利用可能なスキル** | 11 |
| **API タイプ** | REST(PostgREST)+ Realtime WebSocket |
| **公式ドキュメント** | [supabase.com/docs](https://supabase.com/docs) |

## 機能

- **自動生成 REST API**, PostgREST 経由で任意の Postgres テーブルに対する CRUD 操作、コード不要
- **認証ユーザー同期**, Supabase Auth ユーザー(メール、電話、ソーシャルログイン)をエンゲージメントプラットフォームに同期
- **リアルタイムサブスクリプション**, 任意のテーブルに対する INSERT、UPDATE、DELETE イベントをリアルタイムで受信
- **Row Level Security**, すべての API アクセスは Postgres RLS ポリシーを遵守し、安全なマルチテナントデータを実現
- **ストレージ統合**, ファイルアップロードをトラッキングし、ストレージバケット全体でアセットを管理
- **Edge Functions**, カスタムロジックと Webhook 用にサーバーレス Deno 関数を呼び出し
- **全文検索**, API 経由で Postgres の全文検索機能を活用

## 前提条件

開始する前に、以下を準備してください。

1. Supabase プロジェクト([app.supabase.com](https://app.supabase.com/))
2. プロジェクトの **API URL** と **API キー**(Settings → API にあります)
3. API アクセス可能な Tajo アカウント

API キー

Supabase は 2 つのキーを提供します: `anon`(パブリック、RLS を遵守)と `service_role`(RLS をバイパス、管理者アクセス)。サーバーサイド統合には `service_role` を、クライアントサイドには `anon` を使用してください。

## 認証

Supabase は API キー認証を使用します。すべてのリクエストには `apikey` ヘッダーが必要で、ユーザースコープのアクセス用にオプションで `Authorization` ベアラートークンも必要です。

```bash
# anon キーを使用(RLS を遵守)
curl 'https://<project_ref>.supabase.co/rest/v1/customers' \
  -H "apikey: <SUPABASE_ANON_KEY>" \
  -H "Authorization: Bearer <SUPABASE_ANON_KEY>"

# service_role キーを使用(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}"

    # データ同期オプション
    sync:
      users: true
      tables:
        - customers
        - orders
        - products
      storage: true
      realtime: true

    # Supabase Auth ユーザーを連絡先にマッピング
    user_mapping:
      email: email
      phone: SMS
      user_metadata.full_name: FIRSTNAME
      created_at: SIGNUP_DATE
```

### フィールドマッピング

Supabase テーブルの列をエンゲージメントプラットフォームの属性にマッピングします。

#### デフォルトユーザーマッピング

| Parameter | Type | Description |
| --- | --- | --- |
| `email` required | string | Supabase Auth からのユーザーメール(一意識別子) |
| `phone` optional | string | SMS/WhatsApp エンゲージメント用の電話番号 |
| `user_metadata.full_name` optional | string | Auth ユーザーメタデータからの表示名 |
| `user_metadata.avatar_url` optional | string | プロフィール画像の URL |
| `created_at` optional | timestamp | アカウント作成タイムスタンプ |
| `last_sign_in_at` optional | timestamp | エンゲージメントスコアリング用の最新ログイン |
| `app_metadata.provider` optional | string | 認証プロバイダー(email、google、github など) |
| `confirmed_at` optional | timestamp | メール確認タイムスタンプ |

#### カスタムテーブルマッピング

```yaml
table_mapping:
  customers:
    # 列 → 属性マッピング
    email: email
    full_name: FIRSTNAME
    company: COMPANY
    plan: SUBSCRIPTION_PLAN
    mrr: MONTHLY_REVENUE
    created_at: SIGNUP_DATE

  orders:
    # イベントとしてトラッキング
    sync_as: events
    event_name: "order_placed"
    properties:
      total: amount
      status: order_status
      items: line_items
```

## API エンドポイント

Supabase REST API はデータベーススキーマから `https://<ref>.supabase.co/rest/v1/` で自動生成されます。

| エンドポイント | メソッド | 説明 |
| --- | --- | --- |
| `/rest/v1/{table}` | `GET` | フィルタリング、並べ替え、ページネーション付きで行をクエリ |
| `/rest/v1/{table}` | `POST` | 行を挿入(バルクとアップサートをサポート) |
| `/rest/v1/{table}` | `PATCH` | フィルタに一致する行を更新 |
| `/rest/v1/{table}` | `DELETE` | フィルタに一致する行を削除 |
| `/rest/v1/rpc/{function}` | `POST` | Postgres 関数を呼び出し |
| `/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` | バケット内のファイルを一覧取得 |
| `/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` | 配列内 | `?status=in.(active,trial)` |
| `is` | Null チェック | `?deleted_at=is.null` |

## イベント

### 認証イベント

| イベント | トリガー | ユースケース |
| --- | --- | --- |
| `user.signed_up` | 新規ユーザー登録 | ウェルカムシリーズ |
| `user.signed_in` | ユーザーログイン | アクティビティトラッキング |
| `user.updated` | プロファイル変更 | データ同期 |
| `user.deleted` | アカウント削除 | クリーンアップワークフロー |

### データベースイベント(Realtime)

| イベント | トリガー | ユースケース |
| --- | --- | --- |
| `INSERT` | 新しい行が追加 | 新規注文/顧客通知 |
| `UPDATE` | 行が変更 | ステータス変更ワークフロー |
| `DELETE` | 行が削除 | チャーン検出 |

### Webhook イベント

| イベント | トリガー | ユースケース |
| --- | --- | --- |
| `auth.user.created` | Webhook 経由のユーザーサインアップ | オンボーディングをトリガー |
| `storage.object.created` | ファイルアップロード | アセット処理 |

## コード例

### コネクタの初期化

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

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

// Supabase プロジェクトを接続
await tajo.connectors.connect('supabase', {
  projectUrl: process.env.SUPABASE_URL,
  serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
});
```

### ユーザーを連絡先に同期

```javascript
// すべての Supabase Auth ユーザーを連絡先として同期
await tajo.connectors.sync('supabase', {
  type: 'full',
  resources: ['users'],
});

// 増分同期(新規/変更されたユーザーのみ)
await tajo.connectors.sync('supabase', {
  type: 'incremental',
  resources: ['users'],
  since: '2024-01-01T00:00:00Z',
});
```

### リアルタイム変更を受信

```javascript
// エンゲージメントトリガー用に新規注文を購読
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) => {
      // Tajo にイベントとして転送
      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();
```

### クエリとセグメント

```javascript
// ターゲットキャンペーン用にプランで顧客をクエリ
const { data: proUsers } = await supabase
  .from('customers')
  .select('email, full_name, plan, mrr')
  .eq('plan', 'pro')
  .gt('mrr', 100)
  .order('mrr', { ascending: false });

// キャンペーンターゲティング用に Brevo リストに同期
await tajo.lists.addContacts(PRO_LIST_ID, proUsers);
```

## レート制限

API レート制限

Supabase のレート制限はプランに依存します。無料ティア: 500 リクエスト/分。Pro: 1,000 リクエスト/秒。Enterprise 制限については Supabase にお問い合わせください。

| プラン | レート制限 | Realtime 接続 |
| --- | --- | --- |
| Free | 500 req/分 | 同時 200 |
| Pro | 1,000 req/秒 | 同時 500 |
| Team | 2,000 req/秒 | 同時 1,000 |
| Enterprise | カスタム | カスタム |

## トラブルシューティング

### 一般的な問題

| 問題 | 原因 | 解決策 |
| --- | --- | --- |
| 401 Unauthorized | API キーが無効または期限切れ | Supabase Dashboard → Settings → API で API キーを確認 |
| 403 Forbidden | RLS ポリシーがアクセスをブロック | 管理操作には `service_role` キーを使用するか、RLS ポリシーを確認 |
| リアルタイムイベントなし | テーブルに Realtime が有効化されていない | Database → Replication → テーブルをパブリケーションに追加 |
| クエリ結果が空 | RLS がすべての行をフィルタリング | 認証されたロールが読み取り可能か RLS ポリシーを確認 |
| ストレージアップロード失敗 | バケットポリシー | ストレージバケットがパブリックか、正しい RLS ポリシーを持っているか確認 |

### デバッグモード

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

### 接続テスト

```bash
tajo connectors test supabase
# ✓ API 接続成功
# ✓ Auth エンドポイントにアクセス可能
# ✓ テーブル読み取り可能(12 個のテーブルが見つかりました)
# ✓ ストレージにアクセス可能(3 個のバケット)
# ✓ Realtime 接続確立
# ✓ Edge Functions 利用可能(4 個の関数)
```

## ベストプラクティス

1. **service\_role キーはサーバーサイドのみで使用する**, クライアントコードに公開しないでください
2. **すべてのテーブルで RLS を有効化する**, service\_role を使う場合でも、多層防御のため RLS を設計する
3. **イベント駆動の同期には Realtime を使用する**, 変更のポーリングよりも効率的
4. **操作をバッチ処理する**, 大量の操作にはバルク挿入と `in` フィルタを使用
5. **ユーザーメタデータをマッピングする**, サインアップ時にエンゲージメント関連フィールドを `user_metadata` に保存
6. **Webhook には Edge Functions を使用する**, 低レイテンシ処理のため Supabase Edge Functions で受信 Webhook を処理

## セキュリティ

- **API キー認証**, すべてのリクエストに有効な API キーが必要
- **Row Level Security (RLS)**, 行ごとの Postgres ネイティブアクセス制御
- **JWT 検証**, Auth トークンは署名付き JWT で、すべてのリクエストで検証
- **SSL/TLS**, すべての接続が転送中に暗号化
- **SOC 2 Type II**, Supabase は SOC 2 準拠
- **ネットワーク制限**, 有料プランでオプションの IP 許可リスト

## 関連リソース

- [Shopify コネクタ](https://tajo.io/jp/docs/connectors/ecommerce/shopify)
- [Stripe コネクタ](https://tajo.io/jp/docs/connectors/ecommerce/stripe)
- [Auth0 コネクタ](https://tajo.io/jp/docs/connectors/custom/auth0)
- [Supabase 公式ドキュメント](https://supabase.com/docs)
- [Supabase REST API ガイド](https://supabase.com/docs/guides/api)
- [Supabase Auth ガイド](https://supabase.com/docs/guides/auth)
