Teams: - GET /v1/teams/{id}/analytics (admin) — per-card visits/qr/saves/clicks across members, sortable (whitelisted columns); …/analytics.csv exports RFC-4180 CSV - Central template library (migration 0004 team_templates): POST|DELETE /v1/teams/{id}/templates[/{templateId}] (admin), GET (member) GDPR (§18.3): - GET /v1/account/export — full JSON dump via Postgres json_agg (no password hash) - DELETE /v1/account — hard delete, FK cascade removes all owned data 107 backend tests; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
- Migration 0003: teams + team_memberships (owner/admin/member, seat_limit) - POST /v1/teams (Team-tier gated), GET /v1/teams/{id}, GET|POST /v1/teams/{id}/members, DELETE …/members/{userId} - Add-by-email (existing accounts), seat-cap enforcement (402), role-based authorization (admin to mutate; non-members get 404; owner unremovable) - Invite notification email; Tier::can_own_team() 100 backend tests; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>