---
title: "Supabase Connector"
description: "Komplet guide til Supabase-integration til synkronisering af databaseposter, brugerautentifikation, fillagring og realtidshændelser med din engagementplatform."
url: https://tajo.io/dk/docs/connectors/custom/supabase/
markdown: https://tajo.io/dk/docs/connectors/custom/supabase.md
lang: da-DK
robots: noindex
---

Bed om tidlig adgang til Tajo

Indtast dit fornavn og din arbejds-e-mailadresse. Vi sender dig et link til at bekræfte din anmodning om adgang til Tajo.

# Supabase Connector

Connectorstatus: Planlagt Ikke bygget endnu. Tajo kører ikke denne connector i dag.

| Kildefelt | Destinationsfelt | Eksempelværdi |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Forbind dit Supabase-projekt for at synkronisere databaseposter, autentifikationsdata, fillagringshændelser og realtidsændringer til automatisering af kundeengagement.

## Oversigt

| Egenskab | Værdi |
| --- | --- |
| **Platform** | Supabase |
| **Kategori** | Database og backend |
| **Opsætningskompleksitet** | Let |
| **Officiel integration** | Nej |
| **Synkroniserede data** | Brugere, tabeller, lagring, hændelser |
| **Tilgængelige skills** | 11 |
| **API-type** | REST (PostgREST) + Realtime WebSocket |
| **Officiel dokumentation** | [supabase.com/docs](https://supabase.com/docs) |

## Funktioner

- **Auto-genereret REST API**, CRUD-operationer på enhver Postgres-tabel via PostgREST, uden kode
- **Auth-brugersynkronisering**, Synkronisér Supabase Auth-brugere (e-mail, telefon, sociale logins) til din engagementplatform
- **Realtidsabonnementer**, Lyt til INSERT-, UPDATE-, DELETE-hændelser på enhver tabel i realtid
- **Row Level Security**, Al API-adgang respekterer Postgres RLS-politikker for sikre multi-tenant-data
- **Lagrings-integration**, Spor filuploads og administrér assets på tværs af Storage-buckets
- **Edge Functions**, Aktivér serverløse Deno-funktioner til brugerdefineret logik og webhooks
- **Fuldtekstsøgning**, Udnyt Postgres’ fuldtekstsøgningsfunktioner via API’et

## Forudsætninger

Før du begynder, skal du sikre dig, at du har:

1. Et Supabase-projekt ([app.supabase.com](https://app.supabase.com/))
2. Dit projekts **API-URL** og **API-nøgler** (findes under Settings → API)
3. En Tajo-konto med API-adgang

API-nøgler

Supabase leverer to nøgler: `anon` (offentlig, respekterer RLS) og `service_role` (omgår RLS, administratoradgang). Brug `service_role` til serverside-integrationer og `anon` til klientside.

## Autentifikation

Supabase bruger API-nøgle-autentifikation. Hver forespørgsel kræver headeren `apikey` og valgfrit en `Authorization`-bearer-token til brugerscoped adgang.

```bash
# 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

### Grundlæggende opsætning

```yaml
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_DATE
```

### Feltmapping

Knyt Supabase-tabelkolonner til engagementplatformens attributter:

#### Standardmappings for brugere

| Parameter | Type | Description |
| --- | --- | --- |
| `email` required | string | Bruger-e-mail fra Supabase Auth (unik identifikator) |
| `phone` optional | string | Telefonnummer til SMS-/WhatsApp-engagement |
| `user_metadata.full_name` optional | string | Visningsnavn fra Auth-brugermetadata |
| `user_metadata.avatar_url` optional | string | URL til profilbillede |
| `created_at` optional | timestamp | Tidsstempel for kontooprettelse |
| `last_sign_in_at` optional | timestamp | Seneste login til engagementscoring |
| `app_metadata.provider` optional | string | Autentifikationsudbyder (email, google, github m.fl.) |
| `confirmed_at` optional | timestamp | Tidsstempel for e-mailbekræftelse |

#### Brugerdefineret tabelmapping

```yaml
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_items
```

## API-endpoints

Supabase REST API genereres automatisk fra dit databaseskema på `https://<ref>.supabase.co/rest/v1/`.

| Endpoint | Metode | Beskrivelse |
| --- | --- | --- |
| `/rest/v1/{table}` | `GET` | Forespørg rækker med filtrering, sortering, paginering |
| `/rest/v1/{table}` | `POST` | Indsæt rækker (understøtter bulk og upsert) |
| `/rest/v1/{table}` | `PATCH` | Opdatér rækker, der matcher filtre |
| `/rest/v1/{table}` | `DELETE` | Slet rækker, der matcher filtre |
| `/rest/v1/rpc/{function}` | `POST` | Kald en Postgres-funktion |
| `/auth/v1/signup` | `POST` | Opret en ny bruger |
| `/auth/v1/token?grant_type=password` | `POST` | Log ind med adgangskode |
| `/auth/v1/user` | `GET` | Hent aktuel bruger |
| `/auth/v1/admin/users` | `GET` | Vis alle brugere (service\_role) |
| `/storage/v1/object/{bucket}/{path}` | `POST` | Upload fil |
| `/storage/v1/object/list/{bucket}` | `POST` | Vis filer i bucket |
| `/functions/v1/{function_name}` | `POST` | Aktivér Edge Function |

### Filtreringsoperatorer

| Operator | Beskrivelse | Eksempel |
| --- | --- | --- |
| `eq` | Lig med | `?status=eq.active` |
| `neq` | Ikke lig med | `?status=neq.deleted` |
| `gt`, `gte` | Større end | `?amount=gt.100` |
| `lt`, `lte` | Mindre end | `?created_at=lt.2024-01-01` |
| `like`, `ilike` | Mønstermatch | `?name=ilike.%john%` |
| `in` | I array | `?status=in.(active,trial)` |
| `is` | Null-tjek | `?deleted_at=is.null` |

## Hændelser

### Auth-hændelser

| Hændelse | Trigger | Anvendelse |
| --- | --- | --- |
| `user.signed_up` | Ny brugerregistrering | Velkomstserie |
| `user.signed_in` | Brugerlogin | Aktivitetstracking |
| `user.updated` | Profilændringer | Datasynkronisering |
| `user.deleted` | Kontosletning | Oprydnings-workflows |

### Databasehændelser (Realtime)

| Hændelse | Trigger | Anvendelse |
| --- | --- | --- |
| `INSERT` | Ny række tilføjet | Notifikationer om ny ordre/kunde |
| `UPDATE` | Række ændret | Workflows ved statusændring |
| `DELETE` | Række fjernet | Churn-detektion |

### Webhook-hændelser

| Hændelse | Trigger | Anvendelse |
| --- | --- | --- |
| `auth.user.created` | Brugertilmelding via webhook | Udløs onboarding |
| `storage.object.created` | Fil uploadet | Asset-behandling |

## Kodeeksempler

### Initialisér konnektor

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

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

// Connect Supabase project
await tajo.connectors.connect('supabase', {
  projectUrl: process.env.SUPABASE_URL,
  serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY,
});
```

### Synkronisér brugere til kontakter

```javascript
// Sync all Supabase Auth users as contacts
await 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',
});
```

### Lyt til realtidsændringer

```javascript
// Subscribe to new orders for engagement triggers
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) => {
      // 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();
```

### Forespørg og segmentér

```javascript
// Query customers by plan for targeted campaigns
const { 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 targeting
await tajo.lists.addContacts(PRO_LIST_ID, proUsers);
```

## Ratebegrænsninger

API-ratebegrænsninger

Supabase-ratebegrænsninger afhænger af din plan. Free tier: 500 forespørgsler/minut. Pro: 1.000 forespørgsler/sekund. Kontakt Supabase for Enterprise-grænser.

| Plan | Ratebegrænsning | Realtime-forbindelser |
| --- | --- | --- |
| Free | 500 req/min | 200 samtidige |
| Pro | 1.000 req/sek | 500 samtidige |
| Team | 2.000 req/sek | 1.000 samtidige |
| Enterprise | Tilpasset | Tilpasset |

## Fejlfinding

### Almindelige problemer

| Problem | Årsag | Løsning |
| --- | --- | --- |
| 401 Unauthorized | Ugyldig eller udløbet API-nøgle | Tjek API-nøgler i Supabase Dashboard → Settings → API |
| 403 Forbidden | RLS-politik blokerer adgang | Brug `service_role`-nøgle til administratoroperationer, eller tjek RLS-politikker |
| Ingen realtime-hændelser | Realtime ikke aktiveret for tabel | Aktivér i Database → Replication → tilføj tabel til publication |
| Tomme query-resultater | RLS filtrerer alle rækker | Verificér, at RLS-politikker tillader den autentificerede rolle at læse |
| Storage-upload fejler | Bucket-politikker | Tjek, at Storage-bucket er sat til offentlig eller har korrekte RLS-politikker |

### Fejlfindingstilstand

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

### Test forbindelse

```bash
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

1. **Brug kun service\_role-nøglen på serverside**, Eksponér den aldrig i klientkode
2. **Aktivér RLS på alle tabeller**, Selv med service\_role bør du designe med RLS for defense in depth
3. **Brug Realtime til hændelsesdrevet synkronisering**, Mere effektivt end polling for ændringer
4. **Batch-operationer**, Brug bulk-inserts og `in`-filteret til operationer med højt volumen
5. **Map brugermetadata**, Gem engagementrelevante felter i `user_metadata` under tilmelding
6. **Brug Edge Functions til webhooks**, Behandl indgående webhooks med Supabase Edge Functions for lav latens

## Sikkerhed

- **API-nøgle-autentifikation**, Alle forespørgsler kræver gyldige API-nøgler
- **Row Level Security (RLS)**, Postgres-native adgangskontrol per række
- **JWT-verifikation**, Auth-tokens er signerede JWT’er, der verificeres ved hver forespørgsel
- **SSL/TLS**, Alle forbindelser krypteres under overførsel
- **SOC 2 Type II**, Supabase er SOC 2-compliant
- **Netværksrestriktioner**, Valgfri IP-allowlisting på betalte planer

## Relaterede ressourcer

- [Shopify Connector](https://tajo.io/dk/docs/connectors/ecommerce/shopify)
- [Stripe Connector](https://tajo.io/dk/docs/connectors/ecommerce/stripe)
- [Auth0 Connector](https://tajo.io/dk/docs/connectors/custom/auth0)
- [Supabase officiel dokumentation](https://supabase.com/docs)
- [Supabase REST API-guide](https://supabase.com/docs/guides/api)
- [Supabase Auth-guide](https://supabase.com/docs/guides/auth)
