Darstellung
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
| Spalte | Typ | Nullable | Default | Beschreibung |
|---|---|---|---|---|
| id | uuid | NOT NULL | gen_random_uuid() | Primaerschlüssel |
| tenant_id | uuid | NOT NULL | — | FK → tenants (ON DELETE CASCADE) |
| user_email | varchar(255) | NOT NULL | — | E-Mail-Adresse des Empfaengers |
| reminder_type | varchar(10) | NOT NULL | — | Typ des Reminders (7d, 3d, 1d) |
| template_name | varchar(100) | NOT NULL | — | Name des verwendeten E-Mail-Templates |
| status | varchar(20) | NULL | 'sent' | Status (sent, error) |
| error_message | text | NULL | — | Fehlermeldung bei status=error |
| sent_at | timestamptz | NULL | CURRENT_TIMESTAMP | Sendezeitpunkt |
| created_at | timestamptz | NULL | CURRENT_TIMESTAMP | Erstellungszeitpunkt |
Indizes
| Index | Typ | Spalte(n) |
|---|---|---|
| onboarding_reminders_pkey | PRIMARY KEY | id |
| idx_onboarding_reminders_sent | btree | sent_at |
| idx_onboarding_reminders_tenant | btree | tenant_id |
| idx_onboarding_reminders_type | btree | reminder_type |
| idx_onboarding_reminders_unique | UNIQUE | (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
| Typ | Ausloeser | Template-Name |
|---|---|---|
7d | 7 Tage vor Trial-Ende | via_trial_reminder_7d |
3d | 3 Tage vor Trial-Ende | via_trial_reminder_3d |
1d | 1 Tag vor Trial-Ende | via_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 = truesubscriptions.status = 'trial'subscriptions.trial_ends_atist 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/logDer Unique-Index auf (tenant_id, reminder_type) stellt sicher, dass jeder Tenant pro Reminder-Typ maximal eine Erinnerung bekommt — auch bei mehrfachem Cron-Lauf.