Privacy Policy
Your community’s trust matters. This policy outlines how Catcord processes personal data in accordance with the DSGVO.
1. Controller
Controller pursuant to Art. 4(7) DSGVO:
Marcel Heß, operating as Catcord (sole proprietorship)
c/o Adressgeber #1793
An der Alten Ziegelei 38
48157 Münster
Germany
Email: support@catcord.app
2. Purpose of processing
We process Discord account identifiers (Discord user and server IDs), server configuration data, and service metadata to deliver AI-powered translations, reminders, subscriptions, and customer support. Chat-relay message content is handled separately from stored dashboard data.
Operational direct messages are sent only to the Discord server owner and designated Catcord administrators. These notices cover onboarding guidance, quota usage, incident updates, and premium billing changes so responsible staff can take timely action.
3. Legal basis
Processing is based on Art. 6(1)(b) DSGVO for contract fulfillment, Art. 6(1)(c) DSGVO for statutory retention, and Art. 6(1)(f) DSGVO for legitimate interests such as service security, abuse prevention, and service improvement. If optional analytics cookies are introduced, we will rely on Art. 6(1)(a) DSGVO (consent).
4. Data retention
Retention periods are enforced by automated jobs in our production backend. Chat-relay payloads (source text and translated output sent through LangRelay) are processed for delivery and are not persisted by Catcord after dispatch.
Other content categories (for example reminder text and broadcast message text) are stored in dedicated tables and follow the concrete deletion or pseudonymisation rules implemented in `database.py` (`run_personal_data_retention`, `purge_released_servers`).
| Data type | Purpose | Legal basis | Retention period | Deletion / pseudonymisation rule |
|---|---|---|---|---|
| Usage events (`usage_events`) | Quota calculations, abuse detection, operational analytics | Art. 6(1)(b), Art. 6(1)(f) DSGVO | 180 days | Hard deletion when event timestamp is older than cutoff. |
| Notification events (`notification_events`, no chat text) | Cooldown enforcement and duplicate notification prevention | Art. 6(1)(b), Art. 6(1)(f) DSGVO | 180 days | Hard deletion when `sent_at` is older than cutoff. |
| Broadcast notifications (`broadcast_notifications`, includes message text) | Deliver one-to-many operational notices and track send/expiry status | Art. 6(1)(b), Art. 6(1)(f) DSGVO | 90 days (or earlier when expired) | Hard deletion when `created_at` exceeds 90-day cutoff or `expires_at <= now`. |
| Vote events (`vote_events`) | Vote eligibility and anti-abuse tracking | Art. 6(1)(b), Art. 6(1)(f) DSGVO | 180 days | Hard deletion when `created_at` is older than cutoff. |
| Vote claims (`vote_claims`) | Pending vote-to-guild claim workflow | Art. 6(1)(b), Art. 6(1)(f) DSGVO | Up to 30 days or until claim expiry | Hard deletion when `expires_at <= now` or `created_at` exceeds 30-day cutoff. |
| Vote boosts (`vote_boosts`) | Temporary vote-based boost attribution | Art. 6(1)(b), Art. 6(1)(f) DSGVO | Up to 180 days or until boost expiry | Hard deletion when `expires_at <= now` or `created_at` is older than cutoff. |
| Reminder definitions (`reminders`, includes reminder text/headline/channel metadata) | Store and execute recurring reminder messages configured by server admins | Art. 6(1)(b), Art. 6(1)(f) DSGVO | Until deleted by server admins, user account deletion, or server cleanup after 30 days from release | No fixed day-based purge in `run_personal_data_retention`; removed via reminder delete actions, `delete_user_data`, or `purge_released_servers` once `released_at` is older than 30-day cutoff. |
| Billing records (`billing_records`) | Payment evidence, accounting, fraud investigations | Art. 6(1)(b), Art. 6(1)(c), Art. 6(1)(f) DSGVO | 365 days before pseudonymisation | `discord_id` set to `0` and `stripe_reference` cleared once cutoff is reached. |
| User profiles (`users`) | Subscription state, entitlements, support context | Art. 6(1)(b), Art. 6(1)(f) DSGVO | Up to 730 days for dormant accounts | Deletion only if no active plan/packages/server relations remain and `premium_words_reset_at`, `reminders_reset_at`, `subscription_expires_at`, and `export_unlocked_at` are all older than cutoff. |
Chat relay vs stored content
- Chat-relay content (LangRelay): Incoming chat text is translated and forwarded in real time. Catcord does not store relay payloads in its database after dispatch; the resulting messages remain in Discord under your server controls.
- Reminder content: Reminder text/headlines are persisted as reminder definitions so schedules can run. They remain until you delete them, request account deletion, or the related released server is purged after 30 days.
- Broadcast content: Broadcast message text is stored to coordinate queued sends and delivery state. Entries are deleted after 90 days or immediately at expiry, whichever is earlier.
Retention FAQ (plain language)
- Do you store every chat message that gets translated?
- No. Catcord processes relay text for translation delivery but does not keep a permanent Catcord-side copy of those relay payloads.
- Why are reminder texts stored?
- We store reminder text because scheduled reminders must be re-sent later. You can edit or delete reminders at any time; otherwise they are removed with account deletion or released-server cleanup.
- How long are broadcast announcements kept?
- Broadcast notifications (including their message text) are deleted after 90 days, or earlier when their explicit expiry time is reached.
5. Processors and transfers
We use the following processors to deliver Catcord: Discord (authentication and messaging), Stripe (payment processing), OpenAI, IONOS (OpenAI-compatible endpoint hosted in Germany), and DeepL (translation infrastructure), and hosting providers within the European Union. If translation infrastructure or payment processors process data outside the EU/EEA, we rely on adequacy decisions (such as the EU-US Data Privacy Framework) or Standard Contractual Clauses.
6. Data subject rights
You may request access, rectification, erasure, restriction, data portability, or object to processing based on legitimate interests at any time. You may withdraw consent with future effect. Contact support@catcord.app and we will respond within 30 days.
Account exports are available as self-service in the dashboard. After a fresh sign-in confirmation, the export is usually provided immediately via a one-time download token (valid for about 10 minutes). Complex requests still receive a manual response within 30 days.
7. Complaints
You have the right to lodge a complaint with the State Commissioner for Data Protection and Freedom of Information of North Rhine-Westphalia.
8. Updates
We review this policy regularly and update it when our processing changes.
- Version: 2026-02-26
- 2026-02-26: Clarified chat-relay vs stored content categories, added reminder/broadcast retention details, and linked each category to live retention logic in `database.py`.
- 2026-02-25: Retention periods aligned with live code (`run_personal_data_retention`) and published in a per-data-type table.
- Internal operating documentation: /docs/DSAR_RETENTION_OVERVIEW.md