Skip to content

Onboarding Reminders

Historisches Dokument

Diese Seite beschreibt das archivierte Sandbox-Trial-Onboarding (Stand bis 2026-04-28). Das Sandbox-Trial wurde am 2026-04-28 deaktiviert. Onboarding läuft heute ausschließlich über Stripe (/register-paid). Inhalt bleibt zur Referenz erhalten.

Sandbox-User mit aktivem Trial bekommen automatisch Erinnerungen per E-Mail, wenn ihr Trial-Zeitraum sich dem Ende nähert. Die Logik läuft über interne API-Endpoints, die von n8n per Cron abgefragt werden.

DB-Schema: onboarding_reminders

SpalteTypNullableDefaultBeschreibung
iduuidNOT NULLgen_random_uuid()Primaerschlüssel
tenant_iduuidNOT NULLFK → tenants (ON DELETE CASCADE)
user_emailvarchar(255)NOT NULLE-Mail-Adresse des Empfaengers
reminder_typevarchar(10)NOT NULLTyp des Reminders (7d, 3d, 1d)
template_namevarchar(100)NOT NULLName des verwendeten E-Mail-Templates
statusvarchar(20)NULL'sent'Status (sent, error)
error_messagetextNULLFehlermeldung bei status=error
sent_attimestamptzNULLCURRENT_TIMESTAMPSendezeitpunkt
created_attimestamptzNULLCURRENT_TIMESTAMPErstellungszeitpunkt

Indizes

IndexTypSpalte(n)
onboarding_reminders_pkeyPRIMARY KEYid
idx_onboarding_reminders_sentbtreesent_at
idx_onboarding_reminders_tenantbtreetenant_id
idx_onboarding_reminders_typebtreereminder_type
idx_onboarding_reminders_uniqueUNIQUE(tenant_id, reminder_type)

reminder_type ist VARCHAR, kein ENUM

Das Feld reminder_type ist varchar(10), kein PostgreSQL ENUM. Neue Typen können ohne Migration hinzugefuegt werden.

Reminder-Typen

TypAusloeserTemplate-Name
7d7 Tage vor Trial-Endevia_trial_reminder_7d
3d3 Tage vor Trial-Endevia_trial_reminder_3d
1d1 Tag vor Trial-Endevia_trial_reminder_1d

Endpoints

Beide Endpoints liegen unter /api/internal/ und sind mit X-Internal-API-Key Header geschuetzt.

GET /api/internal/sandbox-reminders

Gibt Sandbox-User zurück, die heute einen Reminder bekommen sollen. n8n ruft diesen Endpoint taeglich per Cron ab.

Auth: X-Internal-API-Key Header (muss mit process.env.INTERNAL_API_KEY uebereinstimmen)

Filter-Logik:

  • subscription_plans.is_sandbox = true
  • subscriptions.status = 'trial'
  • subscriptions.trial_ends_at ist gesetzt und liegt in der Zukunft
  • Bereits gesendete Reminder werden per onboarding_reminders-Tabelle ausgeschlossen

Response:

json
{
  "success": true,
  "date": "2026-03-24T08:00:00.000Z",
  "reminders": [
    {
      "type": "7d",
      "template": "via_trial_reminder_7d",
      "users": [
        {
          "email": "user@example.com",
          "first_name": "Max",
          "last_name": "Muster",
          "phone": "+43...",
          "company": "Muster GmbH",
          "tenant_id": "uuid",
          "trial_start": "2026-03-10T...",
          "trial_ends_at": "2026-03-31T...",
          "days_elapsed": 14,
          "days_remaining": 7
        }
      ]
    },
    { "type": "3d", "template": "via_trial_reminder_3d", "users": [] },
    { "type": "1d", "template": "via_trial_reminder_1d", "users": [] }
  ],
  "total_due": 1
}

POST /api/internal/sandbox-reminders/log

n8n meldet zurück, dass ein Reminder gesendet wurde. Verhindert Duplikate beim nächsten Cron-Lauf.

Auth: X-Internal-API-Key Header

Request Body:

json
{
  "tenant_id": "uuid",
  "user_email": "user@example.com",
  "reminder_type": "7d",
  "template_name": "via_trial_reminder_7d",
  "status": "sent",
  "error_message": null
}

Pflichtfelder: tenant_id, reminder_type, template_name.

Duplikat-Schutz: ON CONFLICT (tenant_id, reminder_type) IGNORE — wenn für einen Tenant bereits ein Reminder desselben Typs geloggt wurde, wird der Insert stillschweigend uebersprungen.

Response:

json
{
  "success": true
}

n8n Integration

n8n Cron (taeglich) → GET /api/internal/sandbox-reminders

                    Für jeden User in reminders[].users:
                      → E-Mail senden (Brevo Template)
                      → POST /api/internal/sandbox-reminders/log

Der Unique-Index auf (tenant_id, reminder_type) stellt sicher, dass jeder Tenant pro Reminder-Typ maximal eine Erinnerung bekommt — auch bei mehrfachem Cron-Lauf.