managarten/apps-archived/uload/docs/features/referral/voucher-implementation-approaches.md
Till-JS 61d181fbc2 chore: archive inactive projects to apps-archived/
Move inactive projects out of active workspace:
- bauntown (community website)
- maerchenzauber (AI story generation)
- memoro (voice memo app)
- news (news aggregation)
- nutriphi (nutrition tracking)
- reader (reading app)
- uload (URL shortener)
- wisekeep (AI wisdom extraction)

Update CLAUDE.md documentation:
- Add presi to active projects
- Document archived projects section
- Update workspace configuration

Archived apps can be re-activated by moving back to apps/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 07:03:59 +01:00

501 lines
No EOL
12 KiB
Markdown

# Implementierungsansätze für Voucher-System in uload
## Übersicht
Dieses Dokument analysiert verschiedene technische Ansätze zur Integration eines Voucher/Promo-Code-Systems in die bestehende uload-Architektur. Basierend auf der aktuellen Codebasis werden drei Hauptansätze vorgestellt: Minimal MVP, Integrierte Lösung und Enterprise-Ready System.
## Aktuelle Architektur-Analyse
### Bestehende Komponenten
**Datenbank-Struktur (PocketBase):**
- `links` Collection mit Workspace-Support
- `users` Collection mit Subscription-Status
- `clicks` Collection für Analytics
- `workspaces` Collection für Team-Features
- Bereits vorhandene Tag-System-Architektur
**Frontend-Stack:**
- SvelteKit mit Server-Side-Rendering
- Tailwind CSS für UI
- Form-Actions für Backend-Interaktionen
**Business-Logic:**
- Link-Limits basierend auf Subscription
- Workspace-basierte Link-Organisation
- Bereits implementierte Short-Code-Generierung
## Ansatz 1: Minimal MVP (1-2 Wochen)
### Konzept
Schnelle Integration durch Erweiterung der bestehenden Link-Struktur. Voucher-Codes werden als spezielle Links behandelt.
### Technische Umsetzung
**Datenbank-Erweiterung:**
```
links Collection erweitern:
- voucher_code: string (optional, unique)
- voucher_type: select ['discount', 'feature', 'trial']
- voucher_value: json (z.B. {discount: 30, currency: 'EUR'})
- voucher_valid_until: date
- voucher_max_uses: number
- voucher_current_uses: number
- is_voucher: bool (unterscheidet Voucher von normalen Links)
```
**Implementation:**
1. Neues Feld `voucher_code` in bestehender `links` Collection
2. Voucher-Validation im bestehenden Redirect-Flow (`[...slug]/+page.server.ts`)
3. Einfaches Admin-Interface in `/my/vouchers`
**Vorteile:**
- Minimale Änderungen an bestehender Architektur
- Nutzt vorhandene Link-Analytics
- Schnelle Time-to-Market
- Keine neuen Dependencies
**Nachteile:**
- Vermischung von Links und Vouchers
- Limitierte Voucher-Features
- Schwierig zu skalieren
**Aufwand:**
- Backend: 3-4 Tage
- Frontend: 2-3 Tage
- Testing: 1-2 Tage
## Ansatz 2: Dedizierte Voucher-Collections (2-3 Wochen)
### Konzept
Saubere Trennung durch eigene Datenstrukturen für Vouchers, aber Integration in bestehende Flows.
### Technische Umsetzung
**Neue Collections:**
```
vouchers:
- id: string
- code: string (unique, indexed)
- creator_id: relation -> users
- workspace_id: relation -> workspaces
- type: select ['percentage', 'fixed', 'feature', 'trial']
- value: json
- conditions: json (min_amount, eligible_plans, etc.)
- valid_from: date
- valid_until: date
- max_redemptions: number
- max_redemptions_per_user: number
- metadata: json
voucher_redemptions:
- id: string
- voucher_id: relation -> vouchers
- user_id: relation -> users (optional für anonyme)
- session_id: string
- redeemed_at: datetime
- applied_value: json
- referrer_url: string
- ip_hash: string
- user_agent: string
```
**API-Struktur:**
```
/api/voucher/validate - POST - Prüft Voucher
/api/voucher/redeem - POST - Löst Voucher ein
/api/voucher/stats - GET - Analytics für Creator
```
**Frontend-Routes:**
```
/voucher/[code] - Landing Page mit Voucher
/my/vouchers - Voucher-Management
/my/vouchers/create - Neuer Voucher
/my/vouchers/[id]/analytics - Voucher-Analytics
```
**Integration Points:**
1. Download-Page zeigt Voucher-Code prominent
2. Session-Storage für Voucher-Persistenz
3. Webhook für App-Integration
**Vorteile:**
- Saubere Architektur
- Flexibel erweiterbar
- Unabhängige Voucher-Features
- Bessere Performance durch Separation
**Nachteile:**
- Mehr Entwicklungsaufwand
- Neue Collections zu verwalten
- Komplexere Deployment
**Aufwand:**
- Backend: 5-7 Tage
- Frontend: 4-5 Tage
- Testing: 2-3 Tage
- Integration: 2 Tage
## Ansatz 3: Enterprise-Ready Affiliate System (4-6 Wochen)
### Konzept
Vollständiges Affiliate-Management-System mit Vouchers als Kernkomponente.
### Technische Umsetzung
**Erweiterte Datenstruktur:**
```
affiliates:
- id: string
- user_id: relation -> users
- tier: select ['bronze', 'silver', 'gold', 'platinum']
- commission_rate: number
- lifetime_earnings: number
- current_balance: number
- payout_threshold: number
- payment_details: json (encrypted)
- approved_at: datetime
- suspended_at: datetime
campaigns:
- id: string
- name: string
- affiliate_id: relation -> affiliates
- start_date: datetime
- end_date: datetime
- budget: number
- spent: number
- target_conversions: number
- actual_conversions: number
voucher_templates:
- id: string
- name: string
- code_pattern: string (z.B. "AFFILIATE-{RANDOM}")
- default_value: json
- auto_generate: bool
- requires_approval: bool
conversions:
- id: string
- voucher_redemption_id: relation
- user_id: relation -> users
- event_type: select ['signup', 'purchase', 'subscription']
- event_value: number
- commission_amount: number
- commission_paid: bool
- attributed_to: relation -> affiliates
```
**Advanced Features:**
**Multi-Touch Attribution:**
```typescript
// Tracking mehrerer Touchpoints
interface AttributionChain {
touchpoints: [{
voucher_code: string,
timestamp: Date,
weight: number // Anteil an Conversion
}],
model: 'first_touch' | 'last_touch' | 'linear' | 'time_decay'
}
```
**Fraud Detection:**
```typescript
interface FraudSignals {
velocity_score: number, // Zu viele Redemptions zu schnell
ip_diversity: number, // Verschiedene IPs
device_fingerprint_matches: number,
behavioral_anomalies: string[]
}
```
**Real-Time Dashboard:**
- WebSocket-Updates für Live-Metriken
- Heatmaps für geografische Verteilung
- Conversion-Funnel-Visualization
- A/B-Test-Results
**API-Ecosystem:**
```
/api/v1/affiliates - CRUD für Affiliates
/api/v1/campaigns - Campaign Management
/api/v1/vouchers - Voucher Operations
/api/v1/analytics - Comprehensive Analytics
/api/v1/webhooks - Event Notifications
/api/v1/payouts - Commission Management
```
**Integration-Features:**
- Stripe Connect für automatische Auszahlungen
- Slack/Discord-Notifications
- Zapier-Integration
- CSV-Export für Buchhaltung
- API-SDK für Partner
**Vorteile:**
- Komplett-Lösung für Affiliate-Marketing
- Skaliert auf Enterprise-Level
- Maximale Flexibilität
- Competitive Advantage
**Nachteile:**
- Hoher initialer Aufwand
- Komplexität in Wartung
- Overhead für kleine Teams
- Längere Time-to-Market
**Aufwand:**
- Backend: 15-20 Tage
- Frontend: 10-15 Tage
- Testing: 5-7 Tage
- Documentation: 2-3 Tage
- Integration: 3-5 Tage
## Empfohlene Strategie: Progressiver Ansatz
### Phase 1: Start mit Ansatz 2 (Dedizierte Collections)
**Warum:**
- Balance zwischen Schnelligkeit und Sauberkeit
- Solide Grundlage für Erweiterungen
- Ermöglicht frühe Validierung
**Initiale Features:**
- Basic Voucher CRUD
- Simple Redemption-Flow
- Basis-Analytics
- Manual Affiliate-Onboarding
### Phase 2: Schrittweise Erweiterung
**Nach 1-2 Monaten:**
- Automated Code-Generation
- Tiered Affiliate-System
- Enhanced Analytics
- Email-Integration
**Nach 3-4 Monaten:**
- Commission-Tracking
- Fraud-Detection
- API für Partner
- Advanced Dashboard
### Phase 3: Enterprise Features
**Nach 6+ Monaten:**
- Multi-Touch Attribution
- Automated Payouts
- White-Label Options
- ML-based Optimization
## Technische Requirements
### Backend-Anforderungen
**Neue API-Endpoints:**
```typescript
// Voucher-Validation
POST /api/voucher/validate
Body: { code: string, context?: any }
Response: { valid: boolean, discount?: number, message?: string }
// Voucher-Redemption
POST /api/voucher/redeem
Body: { code: string, session_id: string, user_id?: string }
Response: { success: boolean, applied_value: any }
// Affiliate-Dashboard
GET /api/affiliate/stats
Response: { redemptions: number, earnings: number, ... }
```
**PocketBase-Rules:**
```javascript
// Vouchers Collection Rules
listRule: "@request.auth.id = creator_id || is_public = true"
viewRule: "@request.auth.id = creator_id || code = @request.data.code"
createRule: "@request.auth.id != ''"
updateRule: "@request.auth.id = creator_id"
deleteRule: "@request.auth.id = creator_id"
```
### Frontend-Komponenten
**Neue Komponenten benötigt:**
```
VoucherInput.svelte - Code-Eingabe mit Validation
VoucherBadge.svelte - Visuelle Code-Darstellung
VoucherStats.svelte - Analytics-Dashboard
VoucherCreator.svelte - Code-Generator
AffiliateOnboarding.svelte - Partner-Registration
CommissionOverview.svelte - Earnings-Dashboard
```
### Infrastructure
**Caching-Strategy:**
```typescript
// Redis/In-Memory Cache für häufige Voucher
const voucherCache = new Map<string, VoucherData>();
const CACHE_TTL = 300; // 5 Minuten
// Cache-Warming für populäre Codes
async function warmCache() {
const popularVouchers = await getPopularVouchers();
popularVouchers.forEach(v => voucherCache.set(v.code, v));
}
```
**Rate-Limiting:**
```typescript
// Verhindere Voucher-Brute-Force
const rateLimiter = {
maxAttempts: 10,
windowMs: 60000, // 1 Minute
blockDurationMs: 600000 // 10 Minuten
};
```
## Migration von bestehenden Daten
Falls bereits Referral-Links existieren:
```typescript
// Migration Script
async function migrateReferralLinks() {
const referralLinks = await pb.collection('links')
.getFullList({ filter: 'is_referral = true' });
for (const link of referralLinks) {
await pb.collection('vouchers').create({
code: link.short_code.toUpperCase(),
creator_id: link.user_id,
type: 'percentage',
value: { discount: 20 },
// ... mapping
});
}
}
```
## Testing-Strategie
### Unit-Tests
```typescript
// Voucher-Validation Tests
describe('VoucherValidation', () => {
test('validates expired vouchers', () => {});
test('checks redemption limits', () => {});
test('applies conditions correctly', () => {});
});
```
### Integration-Tests
```typescript
// End-to-End Redemption Flow
describe('VoucherRedemption', () => {
test('complete redemption journey', async () => {
// 1. Create voucher
// 2. Validate voucher
// 3. Redeem voucher
// 4. Check analytics
});
});
```
### Load-Testing
```bash
# K6 Script für Voucher-Endpoints
k6 run --vus 100 --duration 30s voucher-load-test.js
```
## Sicherheitsüberlegungen
### Voucher-Code-Generation
```typescript
// Sichere Code-Generation
function generateSecureCode(prefix: string): string {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
const random = crypto.getRandomValues(new Uint8Array(8));
let code = prefix;
for (const byte of random) {
code += chars[byte % chars.length];
}
return code;
}
```
### SQL-Injection-Prevention
```typescript
// Immer Parameterized Queries
const voucher = await pb.collection('vouchers')
.getFirstListItem(`code = {:code}`, { code: userInput });
// Niemals: `code = "${userInput}"`
```
### Rate-Limiting und Fraud-Detection
```typescript
// Fraud-Signale
const fraudIndicators = {
tooManyRedemptions: redemptions > 10 && timeWindow < 3600,
suspiciousPattern: hasSimilarTimestamps(redemptions),
knownAbuser: blacklist.includes(ipHash)
};
```
## Monitoring und Analytics
### Key Metrics
```typescript
interface VoucherMetrics {
// Performance
redemptionRate: number, // Redemptions / Impressions
conversionValue: number, // Revenue from Voucher Users
// Quality
fraudRate: number, // Fraudulent / Total Redemptions
abuseRate: number, // Multi-Use Attempts / Total
// Business
customerAcquisitionCost: number,
lifetimeValue: number,
returnOnInvestment: number
}
```
### Logging
```typescript
// Strukturiertes Logging
logger.info('voucher_redeemed', {
code: voucher.code,
user_id: user?.id,
session_id: session.id,
value: voucher.value,
timestamp: new Date().toISOString()
});
```
## Zusammenfassung
Für uload empfiehlt sich der **progressive Ansatz mit Start bei Ansatz 2** (Dedizierte Collections):
**Sofort umsetzbar (Woche 1-2):**
- Basis Voucher-System
- Simple Redemption
- Creator-Dashboard
**Kurzfristig erweiterbar (Monat 1-2):**
- Affiliate-Tiers
- Advanced Analytics
- Fraud-Detection
**Langfristig skalierbar (Monat 3+):**
- Full Attribution
- Automated Payouts
- Enterprise Features
Dieser Ansatz bietet die beste Balance zwischen schneller Markteinführung und langfristiger Skalierbarkeit, während er perfekt zur bestehenden uload-Architektur passt.