Technical Documentation

Data Handling & Security

Technische Details zu Event-Processing, Token-Encryption, Quota-Accounting und Audit-Trails. Für Agenturen, Unternehmen und technische Entscheider.

Systemprinzipien

Replyra ist auf "minimale Speicherung + nachvollziehbare Aktionen" ausgelegt.

Keine vollständigen Webhook Bodies in der DB.

Dedup by constraint (keine race-prone SELECT-before-INSERT Logik).

Tokens application-layer verschlüsselt; Klartext nur in-memory.

Events, Dedup & Idempotency

Doppelte Antworten werden über DB-enforced Dedup verhindert.

Constraint: UNIQUE(profile_id, event_id, type)

Dedup Marker: type='event_received' (einziger authoritativer Claim)

Flow

1. Router → stabilen event_id berechnen
   (Meta-Felder, sonst deterministischer sha256-Fallback)

2. INSERT INTO activity_logs (…, type='event_received')
   ON CONFLICT DO NOTHING

3. Wenn bereits vorhanden:
   → 200 OK, keine Verarbeitung, kein n8n, keine Reply

Token Encryption

Tokens werden application-layer verschlüsselt gespeichert.

Algorithm: AES-256-GCM

Stored: ciphertext (base64), iv (96-bit), tag (128-bit), key_version

AAD: profile_id (bindet Ciphertext an Profil, verhindert Swapping)

Key Rotation: ENCRYPTION_KEY_Vn + LATEST_ENCRYPTION_KEY_VERSION

Invariante: Plaintext existiert nur in-memory zur Laufzeit (für API Calls). Wird nicht persistiert, nicht geloggt.

Quota Accounting

Abrechnung erfolgt auf Basis der durchgeführten Antworten.

Zähler: stats_replies_today auf Profil-Ebene

Limit Source: DB-authoritative (profiles → app_users.subscription_tier)

Tier Limit Authority: Limits kommen ausschließlich aus der DB. Client-supplied tier/limit Felder werden ignoriert.

Audit Trail

activity_logs dient als Audit Trail.

Log Types

event_received(immutable)
comment_received(incoming comment)
message_received(incoming DM)
n8n_job(processing state)
reply_out(confirmation)

Access, RLS & Service Role

Frontend

RLS enforced: auth.uid() = user_id

Router / Jobs

Service Role (Bypass RLS) für Webhook Processing, Retry, Global Ops

Profile Killswitch: is_active stoppt Verarbeitung auf Router-Ebene. Nutzer können die Automatisierung jederzeit im Dashboard deaktivieren.

Retention

Audit Logs: 30 Tage, danach automatisch gelöscht/purged

Ziel: Nachvollziehbarkeit ohne dauerhafte Datensammlung