Supabase-connector
Verbind je Supabase-project om databaserecords, gebruikersauthenticatiedata, file storage-events en realtime wijzigingen te synchroniseren voor automatisering van klantbetrokkenheid.
Overzicht
| Eigenschap | Waarde |
|---|---|
| Platform | Supabase |
| Categorie | Database & Backend |
| Setupcomplexiteit | Eenvoudig |
| Officiële integratie | Ja |
| Gesynchroniseerde data | Gebruikers, Tabellen, Storage, Events |
| Beschikbare skills | 11 |
| API-type | REST (PostgREST) + Realtime WebSocket |
| Officiële docs | supabase.com/docs |
Functies
- Auto-gegenereerde REST API, CRUD-operaties op elke Postgres-tabel via PostgREST, geen code nodig
- Auth-gebruikersynchronisatie, Synchroniseer Supabase Auth-gebruikers (email, telefoon, social logins) naar je engagementplatform
- Realtime subscriptions, Luister realtime naar INSERT-, UPDATE- en DELETE-events op elke tabel
- Row Level Security, Alle API-toegang respecteert Postgres RLS-policies voor veilige multi-tenant data
- Storage-integratie, Volg file uploads en beheer assets in Storage-buckets
- Edge Functions, Roep serverless Deno-functies aan voor custom logic en webhooks
- Full-text search, Maak gebruik van Postgres full-text search via de API
Vereisten
Voordat je begint, zorg dat je beschikt over:
- Een Supabase-project (app.supabase.com)
- De API URL en API keys van je project (te vinden in Settings → API)
- Een Tajo-account met API-toegang
API Keys
Supabase biedt twee keys: anon (publiek, respecteert RLS) en service_role (omzeilt RLS, admin-toegang). Gebruik service_role voor server-side integraties en anon voor client-side.
Authenticatie
Supabase gebruikt API key-authenticatie. Elke request vereist de apikey-header en optioneel een Authorization bearer token voor user-scoped toegang.
# 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>"Configuratie
Basisinstelling
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_DATEVeldmapping
Map Supabase-tabelkolommen naar attributen van het engagementplatform:
Standaard gebruikersmappings
| Parameter | Type | Description |
|---|---|---|
email required | string | Gebruikers-e-mail uit Supabase Auth (unieke identifier) |
phone optional | string | Telefoonnummer voor SMS/WhatsApp-engagement |
user_metadata.full_name optional | string | Displaynaam uit Auth user metadata |
user_metadata.avatar_url optional | string | URL van profielafbeelding |
created_at optional | timestamp | Tijdstempel van account-aanmaak |
last_sign_in_at optional | timestamp | Meest recente login voor engagement-scoring |
app_metadata.provider optional | string | Auth-provider (email, google, github, etc.) |
confirmed_at optional | timestamp | Tijdstempel van e-mailbevestiging |
Custom tabelmapping
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
De Supabase REST API wordt automatisch gegenereerd vanuit je databaseschema op https://<ref>.supabase.co/rest/v1/.
| Endpoint | Method | Beschrijving |
|---|---|---|
/rest/v1/{table} | GET | Rijen queryen met filtering, ordering, paginering |
/rest/v1/{table} | POST | Rijen invoegen (ondersteunt bulk en upsert) |
/rest/v1/{table} | PATCH | Rijen bijwerken die aan filters voldoen |
/rest/v1/{table} | DELETE | Rijen verwijderen die aan filters voldoen |
/rest/v1/rpc/{function} | POST | Een Postgres-functie aanroepen |
/auth/v1/signup | POST | Een nieuwe gebruiker aanmaken |
/auth/v1/token?grant_type=password | POST | Inloggen met wachtwoord |
/auth/v1/user | GET | Huidige gebruiker ophalen |
/auth/v1/admin/users | GET | Alle gebruikers opvragen (service_role) |
/storage/v1/object/{bucket}/{path} | POST | Bestand uploaden |
/storage/v1/object/list/{bucket} | POST | Bestanden in bucket opvragen |
/functions/v1/{function_name} | POST | Edge Function aanroepen |
Filteringsoperatoren
| Operator | Beschrijving | Voorbeeld |
|---|---|---|
eq | Gelijk aan | ?status=eq.active |
neq | Niet gelijk aan | ?status=neq.deleted |
gt, gte | Groter dan | ?amount=gt.100 |
lt, lte | Kleiner dan | ?created_at=lt.2024-01-01 |
like, ilike | Pattern match | ?name=ilike.%john% |
in | In array | ?status=in.(active,trial) |
is | Null check | ?deleted_at=is.null |
Events
Auth-events
| Event | Trigger | Use case |
|---|---|---|
user.signed_up | Nieuwe gebruikersregistratie | Welkomstreeks |
user.signed_in | Gebruikerslogin | Activiteitstracking |
user.updated | Profielwijzigingen | Datasynchronisatie |
user.deleted | Account verwijderd | Cleanup-workflows |
Database-events (Realtime)
| Event | Trigger | Use case |
|---|---|---|
INSERT | Nieuwe rij toegevoegd | Notificaties voor nieuwe order/klant |
UPDATE | Rij gewijzigd | Workflows voor statuswijziging |
DELETE | Rij verwijderd | Churn-detectie |
Webhook-events
| Event | Trigger | Use case |
|---|---|---|
auth.user.created | Gebruikersregistratie via webhook | Onboarding triggeren |
storage.object.created | Bestand geüpload | Asset-verwerking |
Codevoorbeelden
Connector initialiseren
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,});Gebruikers synchroniseren naar contacten
// 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',});Realtime wijzigingen beluisteren
// 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();Queryen en segmenteren
// 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
Supabase-rate limits hangen af van je plan. Free tier: 500 requests/minuut. Pro: 1.000 requests/seconde. Neem contact op met Supabase voor Enterprise-limieten.
| Plan | Rate Limit | Realtime-verbindingen |
|---|---|---|
| Free | 500 req/min | 200 gelijktijdig |
| Pro | 1.000 req/s | 500 gelijktijdig |
| Team | 2.000 req/s | 1.000 gelijktijdig |
| Enterprise | Custom | Custom |
Probleemoplossing
Veelvoorkomende problemen
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| 401 Unauthorized | Ongeldige of verlopen API key | Controleer API keys in Supabase Dashboard → Settings → API |
| 403 Forbidden | RLS-policy blokkeert toegang | Gebruik service_role-key voor admin-operaties of controleer RLS-policies |
| Geen realtime events | Realtime niet ingeschakeld voor tabel | Schakel in via Database → Replication → tabel toevoegen aan publication |
| Lege query-resultaten | RLS filtert alle rijen weg | Verifieer dat RLS-policies de geauthenticeerde rol leestoegang geven |
| Storage-upload mislukt | Bucket-policies | Controleer of Storage-bucket publiek is of correcte RLS-policies heeft |
Debugmodus
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueVerbinding 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
- Gebruik service_role-key alleen server-side, Stel deze nooit bloot in client-code
- Schakel RLS in op alle tabellen, Ontwerp ook met service_role volgens RLS voor defense in depth
- Gebruik Realtime voor event-gedreven sync, Efficiënter dan pollen voor wijzigingen
- Batch-operaties, Gebruik bulk inserts en de
in-filter voor operaties met hoog volume - Map user metadata, Sla engagement-relevante velden op in
user_metadatatijdens signup - Gebruik Edge Functions voor webhooks, Verwerk binnenkomende webhooks met Supabase Edge Functions voor lage latency
Beveiliging
- API key-authenticatie, Alle requests vereisen geldige API keys
- Row Level Security (RLS), Postgres-native toegangscontrole per rij
- JWT-verificatie, Auth-tokens zijn gesigneerde JWT’s, geverifieerd bij elke request
- SSL/TLS, Alle verbindingen versleuteld tijdens transport
- SOC 2 Type II, Supabase is SOC 2-compliant
- Netwerkrestricties, Optionele IP-allowlisting op betaalde plannen