Conector Supabase
Conecte seu projeto Supabase para sincronizar registros de banco de dados, dados de autenticação de usuário, eventos de armazenamento de arquivos e alterações em tempo real para automação de engajamento de clientes.
Visão geral
| Propriedade | Valor |
|---|---|
| Plataforma | Supabase |
| Categoria | Banco de Dados e Backend |
| Complexidade de configuração | Fácil |
| Integração oficial | Sim |
| Dados sincronizados | Usuários, Tabelas, Armazenamento, Eventos |
| Skills disponíveis | 11 |
| Tipo de API | REST (PostgREST) + WebSocket Realtime |
| Documentação oficial | supabase.com/docs |
Recursos
- API REST gerada automaticamente, Operações CRUD em qualquer tabela Postgres via PostgREST, sem necessidade de código
- Sincronização de usuários do Auth, Sincronize usuários do Supabase Auth (e-mail, telefone, logins sociais) para sua plataforma de engajamento
- Assinaturas em tempo real, Escute eventos INSERT, UPDATE, DELETE em qualquer tabela em tempo real
- Row Level Security, Todo acesso à API respeita as políticas RLS do Postgres para dados multi-tenant seguros
- Integração com Storage, Rastreie uploads de arquivos e gerencie assets em buckets do Storage
- Edge Functions, Invoque funções serverless em Deno para lógica personalizada e webhooks
- Busca full-text, Aproveite os recursos de busca full-text do Postgres através da API
Pré-requisitos
Antes de começar, certifique-se de ter:
- Um projeto Supabase (app.supabase.com)
- A URL da API e as API keys do seu projeto (em Settings → API)
- Uma conta Tajo com acesso à API
API Keys
O Supabase fornece duas chaves: anon (pública, respeita RLS) e service_role (ignora RLS, acesso admin). Use service_role para integrações do lado do servidor e anon para o lado do cliente.
Autenticação
O Supabase usa autenticação por API key. Cada requisição requer o cabeçalho apikey e, opcionalmente, um bearer token Authorization para acesso com escopo de usuário.
# 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>"Configuração
Configuração básica
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_DATEMapeamento de campos
Mapeie colunas de tabelas do Supabase para atributos da plataforma de engajamento:
Mapeamentos padrão de usuário
| Parameter | Type | Description |
|---|---|---|
email required | string | E-mail do usuário do Supabase Auth (identificador único) |
phone optional | string | Número de telefone para engajamento via SMS/WhatsApp |
user_metadata.full_name optional | string | Nome de exibição do metadata do usuário do Auth |
user_metadata.avatar_url optional | string | URL da imagem de perfil |
created_at optional | timestamp | Timestamp de criação da conta |
last_sign_in_at optional | timestamp | Login mais recente para pontuação de engajamento |
app_metadata.provider optional | string | Provedor de Auth (email, google, github, etc.) |
confirmed_at optional | timestamp | Timestamp de confirmação de e-mail |
Mapeamento personalizado de tabela
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_itemsEndpoints da API
A API REST do Supabase é gerada automaticamente a partir do schema do seu banco de dados em https://<ref>.supabase.co/rest/v1/.
| Endpoint | Método | Descrição |
|---|---|---|
/rest/v1/{table} | GET | Consultar linhas com filtragem, ordenação, paginação |
/rest/v1/{table} | POST | Inserir linhas (suporta inserção em massa e upsert) |
/rest/v1/{table} | PATCH | Atualizar linhas correspondendo aos filtros |
/rest/v1/{table} | DELETE | Excluir linhas correspondendo aos filtros |
/rest/v1/rpc/{function} | POST | Chamar uma função Postgres |
/auth/v1/signup | POST | Criar um novo usuário |
/auth/v1/token?grant_type=password | POST | Entrar com senha |
/auth/v1/user | GET | Obter usuário atual |
/auth/v1/admin/users | GET | Listar todos os usuários (service_role) |
/storage/v1/object/{bucket}/{path} | POST | Fazer upload de arquivo |
/storage/v1/object/list/{bucket} | POST | Listar arquivos no bucket |
/functions/v1/{function_name} | POST | Invocar Edge Function |
Operadores de filtragem
| Operador | Descrição | Exemplo |
|---|---|---|
eq | Igual | ?status=eq.active |
neq | Diferente | ?status=neq.deleted |
gt, gte | Maior que | ?amount=gt.100 |
lt, lte | Menor que | ?created_at=lt.2024-01-01 |
like, ilike | Correspondência de padrão | ?name=ilike.%john% |
in | No array | ?status=in.(active,trial) |
is | Verificação de null | ?deleted_at=is.null |
Eventos
Eventos do Auth
| Evento | Gatilho | Caso de uso |
|---|---|---|
user.signed_up | Novo registro de usuário | Série de boas-vindas |
user.signed_in | Login do usuário | Rastreamento de atividade |
user.updated | Alterações no perfil | Sincronização de dados |
user.deleted | Exclusão de conta | Workflows de limpeza |
Eventos do banco de dados (Realtime)
| Evento | Gatilho | Caso de uso |
|---|---|---|
INSERT | Nova linha adicionada | Notificações de novo pedido/cliente |
UPDATE | Linha modificada | Workflows de mudança de status |
DELETE | Linha removida | Detecção de churn |
Eventos de webhook
| Evento | Gatilho | Caso de uso |
|---|---|---|
auth.user.created | Cadastro de usuário via webhook | Disparar onboarding |
storage.object.created | Arquivo enviado | Processamento de asset |
Exemplos de código
Inicializar o conector
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,});Sincronizar usuários para contatos
// 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',});Escutar alterações em tempo real
// 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();Consultar e segmentar
// 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);Limites de taxa
Limites de taxa da API
Os limites de taxa do Supabase dependem do seu plano. Tier gratuito: 500 requisições/minuto. Pro: 1.000 requisições/segundo. Entre em contato com o Supabase para limites Enterprise.
| Plano | Limite de taxa | Conexões Realtime |
|---|---|---|
| Free | 500 req/min | 200 simultâneas |
| Pro | 1.000 req/seg | 500 simultâneas |
| Team | 2.000 req/seg | 1.000 simultâneas |
| Enterprise | Personalizado | Personalizado |
Solução de problemas
Problemas comuns
| Problema | Causa | Solução |
|---|---|---|
| 401 Unauthorized | API key inválida ou expirada | Verifique as API keys no Supabase Dashboard → Settings → API |
| 403 Forbidden | Política RLS bloqueando acesso | Use a chave service_role para operações admin ou verifique as políticas RLS |
| Sem eventos em tempo real | Realtime não habilitado para a tabela | Habilite em Database → Replication → adicione a tabela à publication |
| Resultados de consulta vazios | RLS filtrando todas as linhas | Verifique se as políticas RLS permitem que a role autenticada leia |
| Falha no upload para Storage | Políticas do bucket | Verifique se o bucket do Storage é público ou tem políticas RLS corretas |
Modo de depuração
connectors: supabase: debug: true log_level: verbose log_queries: true log_realtime: trueTestar conexão
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)Melhores práticas
- Use a chave service_role apenas no servidor, Nunca a exponha em código do cliente
- Habilite RLS em todas as tabelas, Mesmo com service_role, projete com RLS para defesa em profundidade
- Use Realtime para sincronização orientada por eventos, Mais eficiente do que polling para detectar alterações
- Operações em lote, Use inserções em massa e o filtro
inpara operações de alto volume - Mapeie metadata do usuário, Armazene campos relevantes para engajamento em
user_metadatadurante o cadastro - Use Edge Functions para webhooks, Processe webhooks recebidos com Supabase Edge Functions para tratamento de baixa latência
Segurança
- Autenticação por API Key, Todas as requisições requerem API keys válidas
- Row Level Security (RLS), Controle de acesso nativo do Postgres por linha
- Verificação de JWT, Tokens de Auth são JWTs assinados verificados em cada requisição
- SSL/TLS, Todas as conexões criptografadas em trânsito
- SOC 2 Type II, Supabase é compatível com SOC 2
- Restrições de rede, Lista opcional de permissões de IP em planos pagos