Konektor Supabase
Połącz Supabase z Brevo przez Tajo, aby synchronizować zarejestrowanych użytkowników, zdarzenia uwierzytelniania i dane profilu do Brevo, umożliwiając targetowane kampanie marketingowe oparte na zachowaniu użytkowników w aplikacji i zdarzeniach cyklu życia.
Przegląd
| Właściwość | Wartość |
|---|---|
| Platforma | Supabase |
| Kategoria | Backend jako usługa (Niestandardowa) |
| Poziom konfiguracji | Średni |
| Integracja oficjalna | Nie |
| Synchronizowane dane | Użytkownicy, Zdarzenia, Profile, Dane w czasie rzeczywistym |
| Metoda uwierzytelniania | Klucz API usługi / JWT |
Funkcje
- Synchronizacja użytkowników auth - Synchronizuj użytkowników Supabase Auth z kontaktami Brevo
- Wyzwalacze zdarzeń - Wyzwalaj automatyzacje Brevo ze zdarzeń bazy danych Supabase
- Synchronizacja profili - Mapuj niestandardowe tabele profili na atrybuty kontaktów Brevo
- Dane w czasie rzeczywistym - Subskrybuj kanały Supabase Realtime dla aktualizacji natychmiastowych
- Hooks bazodanowe - Używaj webhooków bazodanowych Supabase do obsługi zdarzeń wierszy
- Zapytania PostgREST - Pobieraj i filtruj dane przez automatycznie generowane API REST
Wymagania wstępne
Zanim zaczniesz, upewnij się, że masz:
- Projekt Supabase z włączonymi usługami Auth i Database
- Klucz API usługi (service_role) z ustawień projektu Supabase
- URL projektu Supabase
- Konto Brevo z dostępem do API
- Konto Tajo z uprawnieniami konektora
Uwierzytelnianie
Klucz API usługi
# Available in Supabase Dashboard > Settings > APIexport SUPABASE_URL=https://your-project.supabase.coexport SUPABASE_SERVICE_KEY=your-service-role-keyexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_keyimport { createClient } from '@supabase/supabase-js';
// Use service role key for server-side operationsconst supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_KEY);Bezpieczeństwo klucza usługi
Klucz service_role omija Row Level Security. Nigdy nie ujawniaj go w kodzie po stronie klienta. Używaj tylko w zaufanych środowiskach po stronie serwera.
Konfiguracja
Podstawowa konfiguracja
connectors: supabase: enabled: true url: "${SUPABASE_URL}" service_key: "${SUPABASE_SERVICE_KEY}"
sync: users: true profiles: true events: true schedule: "0 */2 * * *" # Every 2 hours
tables: profiles: "public.profiles" orders: "public.orders"
lists: all_users: 10 active_users: 11 premium_users: 12Mapowanie pól
field_mapping: # Auth user fields email: email created_at: SIGNUP_DATE last_sign_in_at: LAST_LOGIN_DATE email_confirmed_at: EMAIL_VERIFIED_DATE
# Profile table fields first_name: FIRSTNAME last_name: LASTNAME phone: SMS plan: SUBSCRIPTION_PLAN company: COMPANY avatar_url: AVATAR_URLEndpointy API
| Endpoint | Metoda | Opis |
|---|---|---|
{url}/auth/v1/admin/users | GET | Lista użytkowników auth |
{url}/auth/v1/admin/users/{id} | GET | Pobierz użytkownika auth |
{url}/rest/v1/{table} | GET | Zapytanie do tabeli przez PostgREST |
{url}/rest/v1/{table} | POST | Wstaw wiersze do tabeli |
{url}/rest/v1/{table}?id=eq.{id} | PATCH | Aktualizuj wiersz |
{url}/rest/v1/rpc/{function} | POST | Wywołaj funkcję bazy danych |
{url}/realtime/v1/websocket | WS | Kanały Realtime |
Przykłady kodu
Inicjalizacja konektora
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('supabase', { url: process.env.SUPABASE_URL, serviceKey: process.env.SUPABASE_SERVICE_KEY});Synchronizuj użytkowników Auth z Brevo
import { createClient } from '@supabase/supabase-js';
const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_KEY);
// Paginate through all auth userslet page = 1;const perPage = 1000;
while (true) { const { data: { users }, error } = await supabase.auth.admin.listUsers({ page, perPage });
if (error || !users.length) break;
for (const user of users) { await tajo.contacts.sync({ email: user.email, attributes: { SIGNUP_DATE: user.created_at, LAST_LOGIN_DATE: user.last_sign_in_at, EMAIL_VERIFIED_DATE: user.email_confirmed_at }, listIds: [10] }); }
if (users.length < perPage) break; page++;}Subskrybuj zmiany w czasie rzeczywistym
// Listen for new user signups via Supabase Realtimeconst channel = supabase .channel('auth-changes') .on( 'postgres_changes', { event: 'INSERT', schema: 'auth', table: 'users' }, async (payload) => { const newUser = payload.new;
await tajo.contacts.sync({ email: newUser.email, attributes: { SIGNUP_DATE: newUser.created_at }, listIds: [10] }); } ) .subscribe();Używaj webhooków bazodanowych
// Supabase Database Webhooks forward row events to your endpointapp.post('/webhooks/supabase', async (req, res) => { const { type, table, record, old_record } = req.body;
if (table === 'profiles' && type === 'UPDATE') { await tajo.contacts.update(record.email, { attributes: { FIRSTNAME: record.first_name, LASTNAME: record.last_name, SUBSCRIPTION_PLAN: record.plan } }); }
res.status(200).send('OK');});Limity API
| Kategoria | Limit | Uwagi |
|---|---|---|
| Admin Auth API | 30 żądań/min | Listowanie i zarządzanie użytkownikami |
| PostgREST REST API | Zależy od planu | Bazuje na planie Supabase |
| Kanały Realtime | 200 jednoczesnych | Na projekt (plan Pro) |
| Rozmiar odpowiedzi | 1 000 wierszy domyślnie | Użyj Range dla paginacji |
Paginacja PostgREST
Używaj nagłówka Range lub parametrów limit/offset dla paginacji dużych zestawów wyników. Domyślnie PostgREST zwraca maksymalnie 1 000 wierszy.
Rozwiązywanie problemów
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| 401 Unauthorized | Nieprawidłowy klucz usługi | Zweryfikuj service_role key w ustawieniach projektu |
| Puste wyniki | RLS blokuje dostęp | Używaj klucza service_role, nie anon |
| Brakujące profile | Tabela profilu nie istnieje | Utwórz tabelę profili ze wyzwalaczem auth |
| Realtime nie łączy się | Realtime nie włączony | Włącz Realtime dla swojej tabeli w Supabase |
| Opóźnione zdarzenia | Duże obciążenie kolejki | Sprawdź logi Supabase pod kątem opóźnień webhooków |
Tryb debug
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueNajlepsze praktyki
- Twórz tabele profili - Przechowuj dodatkowe dane użytkownika w tabeli
public.profilespołączonej zauth.users - Używaj wyzwalaczy bazy danych - Automatycznie wypełniaj profile przy rejestracji użytkownika
- Synchronizacja przyrostowa - Używaj kolumn
updated_atdo synchronizowania tylko zmienionych rekordów - Subskrybuj zmiany w czasie rzeczywistym - Używaj Realtime dla natychmiastowych aktualizacji zamiast odpytywania
- Obsługuj usunięcia - Śledź zdarzenia
soft deletei aktualizuj statusy kontaktów Brevo - Waliduj e-maile - Synchronizuj tylko użytkowników z potwierdzonymi adresami e-mail
Bezpieczeństwo
- Klucz API usługi - Poświadczenia serwerowe z pełnym dostępem do bazy danych
- JWT - Uwierzytelnianie użytkownika po stronie klienta z wbudowaną obsługą RBAC
- Row Level Security - Wymuszaj polityki dostępu do danych na poziomie bazy danych
- Tylko HTTPS - Wszystkie endpointy wymagają szyfrowania TLS
- Izolacja projektu - Każdy projekt Supabase ma odizolowane zasoby i credentials