Supabase Connector
Verbinde dein Supabase-Projekt, um Datenbank-Datensätze, Nutzer:innen-Authentifizierungsdaten, File-Storage-Events und Echtzeit-Änderungen für die Automation deines Customer Engagements zu synchronisieren.
Überblick
| Eigenschaft | Wert |
|---|---|
| Plattform | Supabase |
| Kategorie | Database & Backend |
| Einrichtungsaufwand | Einfach |
| Offizielle Integration | Ja |
| Synchronisierte Daten | Nutzer:innen, Tabellen, Storage, Events |
| Verfügbare Skills | 11 |
| API-Typ | REST (PostgREST) + Realtime WebSocket |
| Offizielle Docs | supabase.com/docs |
Funktionen
- Automatisch generierte REST-API, CRUD-Operationen auf jeder Postgres-Tabelle via PostgREST, kein Code erforderlich
- Auth-User-Synchronisation, Synchronisiere Supabase-Auth-Nutzer:innen (E-Mail, Telefon, Social Logins) mit deiner Engagement-Plattform
- Echtzeit-Subscriptions, Lausche in Echtzeit auf INSERT-, UPDATE-, DELETE-Events auf jeder Tabelle
- Row Level Security, Jeglicher API-Zugriff respektiert Postgres-RLS-Richtlinien für sichere Multi-Tenant-Daten
- Storage-Integration, Tracke File-Uploads und verwalte Assets über Storage Buckets
- Edge Functions, Rufe serverlose Deno-Funktionen für Custom-Logik und Webhooks auf
- Full-Text Search, Nutze die Volltextsuche-Funktionen von Postgres über die API
Voraussetzungen
Bevor du beginnst, stelle sicher, dass du Folgendes hast:
- Ein Supabase-Projekt (app.supabase.com)
- Die API-URL und API-Schlüssel deines Projekts (zu finden unter Settings → API)
- Ein Tajo-Konto mit API-Zugriff
API-Schlüssel
Supabase stellt zwei Schlüssel bereit: anon (öffentlich, respektiert RLS) und service_role (umgeht RLS, Admin-Zugriff). Nutze service_role für serverseitige Integrationen und anon für den Client.
Authentifizierung
Supabase nutzt API-Schlüssel-Authentifizierung. Jede Anfrage erfordert den apikey-Header und optional einen Authorization-Bearer-Token für nutzerspezifischen Zugriff.
# 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>"Konfiguration
Grundeinrichtung
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_DATEFeld-Mapping
Mappe Supabase-Tabellenspalten auf Engagement-Plattform-Attribute:
Standard-Nutzer:innen-Mappings
| Parameter | Type | Description |
|---|---|---|
email required | string | Nutzer:innen-E-Mail aus Supabase Auth (eindeutiger Identifier) |
phone optional | string | Telefonnummer fürs SMS-/WhatsApp-Engagement |
user_metadata.full_name optional | string | Anzeigename aus den Auth-User-Metadaten |
user_metadata.avatar_url optional | string | URL des Profilbilds |
created_at optional | timestamp | Zeitstempel der Account-Erstellung |
last_sign_in_at optional | timestamp | Letzter Login fürs Engagement-Scoring |
app_metadata.provider optional | string | Auth-Provider (email, google, github, etc.) |
confirmed_at optional | timestamp | Zeitstempel der E-Mail-Bestätigung |
Custom-Tabellen-Mapping
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_itemsAPI-Endpoints
Die Supabase-REST-API wird automatisch aus deinem Datenbankschema unter https://<ref>.supabase.co/rest/v1/ generiert.
| Endpoint | Methode | Beschreibung |
|---|---|---|
/rest/v1/{table} | GET | Zeilen mit Filterung, Sortierung, Pagination abfragen |
/rest/v1/{table} | POST | Zeilen einfügen (unterstützt Bulk und Upsert) |
/rest/v1/{table} | PATCH | Zeilen anhand von Filtern aktualisieren |
/rest/v1/{table} | DELETE | Zeilen anhand von Filtern löschen |
/rest/v1/rpc/{function} | POST | Postgres-Funktion aufrufen |
/auth/v1/signup | POST | Neue Nutzer:in anlegen |
/auth/v1/token?grant_type=password | POST | Mit Passwort einloggen |
/auth/v1/user | GET | Aktuelle Nutzer:in abrufen |
/auth/v1/admin/users | GET | Alle Nutzer:innen auflisten (service_role) |
/storage/v1/object/{bucket}/{path} | POST | Datei hochladen |
/storage/v1/object/list/{bucket} | POST | Dateien im Bucket auflisten |
/functions/v1/{function_name} | POST | Edge Function aufrufen |
Filter-Operatoren
| Operator | Beschreibung | Beispiel |
|---|---|---|
eq | Gleich | ?status=eq.active |
neq | Ungleich | ?status=neq.deleted |
gt, gte | Größer als | ?amount=gt.100 |
lt, lte | Kleiner als | ?created_at=lt.2024-01-01 |
like, ilike | Pattern-Match | ?name=ilike.%john% |
in | In Array | ?status=in.(active,trial) |
is | Null-Prüfung | ?deleted_at=is.null |
Events
Auth-Events
| Event | Trigger | Anwendungsfall |
|---|---|---|
user.signed_up | Neue Nutzer:innen-Registrierung | Welcome-Serie |
user.signed_in | Login | Activity-Tracking |
user.updated | Profiländerungen | Daten-Synchronisation |
user.deleted | Accountlöschung | Cleanup-Workflows |
Datenbank-Events (Realtime)
| Event | Trigger | Anwendungsfall |
|---|---|---|
INSERT | Neue Zeile hinzugefügt | Benachrichtigungen zu neuen Bestellungen/Kund:innen |
UPDATE | Zeile geändert | Status-Change-Workflows |
DELETE | Zeile entfernt | Churn-Erkennung |
Webhook-Events
| Event | Trigger | Anwendungsfall |
|---|---|---|
auth.user.created | Nutzer:innen-Signup via Webhook | Onboarding auslösen |
storage.object.created | Datei hochgeladen | Asset-Verarbeitung |
Code-Beispiele
Connector initialisieren
import { TajoClient } from '@tajo/sdk';import { createClient } from '@supabase/supabase-js';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY,});
// Connect Supabase projectawait tajo.connectors.connect('supabase', { projectUrl: process.env.SUPABASE_URL, serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,});Nutzer:innen mit Kontakten synchronisieren
// Sync all Supabase Auth users as contactsawait 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',});Auf Echtzeit-Änderungen lauschen
// Subscribe to new orders for engagement triggersconst 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();Abfragen und segmentieren
// Query customers by plan for targeted campaignsconst { 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 targetingawait tajo.lists.addContacts(PRO_LIST_ID, proUsers);Rate Limits
API-Rate-Limits
Die Rate Limits von Supabase hängen von deinem Tarif ab. Free: 500 Anfragen/Minute. Pro: 1.000 Anfragen/Sekunde. Für Enterprise-Limits wende dich an Supabase.
| Tarif | Rate Limit | Realtime-Verbindungen |
|---|---|---|
| Free | 500 Anfr./Min | 200 gleichzeitig |
| Pro | 1.000 Anfr./Sek | 500 gleichzeitig |
| Team | 2.000 Anfr./Sek | 1.000 gleichzeitig |
| Enterprise | Individuell | Individuell |
Fehlerbehebung
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| 401 Unauthorized | Ungültiger oder abgelaufener API-Schlüssel | API-Schlüssel im Supabase Dashboard → Settings → API prüfen |
| 403 Forbidden | RLS-Richtlinie blockiert Zugriff | service_role-Schlüssel für Admin-Operationen nutzen oder RLS-Richtlinien prüfen |
| Keine Realtime-Events | Realtime nicht für Tabelle aktiviert | Unter Database → Replication → Tabelle zur Publication hinzufügen |
| Leere Query-Ergebnisse | RLS filtert alle Zeilen | Sicherstellen, dass RLS-Richtlinien Lesezugriff für die authentifizierte Rolle erlauben |
| Storage-Upload schlägt fehl | Bucket-Richtlinien | Prüfen, ob Storage-Bucket öffentlich ist oder korrekte RLS-Richtlinien hat |
Debug-Modus
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueVerbindung testen
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)Best Practices
- service_role-Schlüssel nur serverseitig nutzen, Lege ihn nie in Client-Code offen
- RLS auf allen Tabellen aktivieren, Auch mit service_role: Gestalte mit RLS für Defense in Depth
- Realtime für eventgetriebene Synchronisation, Effizienter als Polling auf Änderungen
- Operationen bündeln, Nutze Bulk-Inserts und den
in-Filter für Operationen mit hohem Volumen - User-Metadaten mappen, Speichere engagement-relevante Felder beim Signup in
user_metadata - Edge Functions für Webhooks nutzen, Verarbeite eingehende Webhooks mit Supabase Edge Functions für niedrige Latenz
Sicherheit
- API-Schlüssel-Authentifizierung, Alle Anfragen erfordern gültige API-Schlüssel
- Row Level Security (RLS), Postgres-nativer Zugriffsschutz pro Zeile
- JWT-Verifikation, Auth-Tokens sind signierte JWTs und werden bei jeder Anfrage verifiziert
- SSL/TLS, Alle Verbindungen während der Übertragung verschlüsselt
- SOC 2 Type II, Supabase ist SOC-2-konform
- Network Restrictions, Optionales IP-Allowlisting in kostenpflichtigen Tarifen