Twenty CRM self-hosted: Salesforce-Alternative für KMU
Was dieser Artikel behandelt
- Was Twenty ist: modernes Open-Source-CRM, „Salesforce für Entwickler”.
- Docker-Setup und erste Konfiguration.
- Datenmodell: Companies, People, Opportunities, Workflows.
- REST/GraphQL-API für Integrationen.
- KI-Anbindung: Lead-Scoring und Follow-ups mit Ollama.
Einleitung
Twenty ist das jüngste ernstzunehmende Open-Source-CRM, explizit als „Entwickler-freundliche Salesforce-Alternative” gebaut. React-Frontend, NestJS-Backend, Postgres darunter. Modernes UI, saubere API, aktiv entwickelt.
Für kleine und mittlere Unternehmen, die Kundendaten selbst hosten wollen (DSGVO!), ist Twenty die pragmatischste Wahl: deutlich schlanker als Salesforce/SuiteCRM, aber vollwertig für Vertrieb.
Typische Anwendungsszenarien
- Vertrieb-Pipeline: Deals, Stages, Aktivitäten, klassisches CRM.
- Lead-Management: Leads aus Website-Formularen → Twenty → KI qualifiziert.
- Kunden-360: Alle Interaktionen pro Kunde an einem Ort.
- KI-gestützte Follow-ups: Ollama schreibt Follow-up-Entwürfe zu offenen Deals.
- Newsletter-Export: Segmente exportieren für Mail-Workflows.
Installation: Docker
services:
twenty:
image: twentycrm/twenty:latest
ports:
- "127.0.0.1:3000:3000"
environment:
- PG_DATABASE_URL=postgres://twenty:geheim@db:5432/twenty
- SERVER_URL=https://crm.deine-domain.de
- FRONT_URL=https://crm.deine-domain.de
- ACCESS_TOKEN_SECRET=langer-zufaelliger-string
- LOGIN_TOKEN_SECRET=langer-zufaelliger-string-2
- REFRESH_TOKEN_SECRET=langer-zufaelliger-string-3
- FILE_STORAGE_TYPE=local
volumes: [twenty_data:/app/packages/twenty-server/.local-storage]
depends_on: [db]
restart: always
db:
image: postgres:16
environment:
POSTGRES_USER: twenty
POSTGRES_PASSWORD: geheim
POSTGRES_DB: twenty
volumes: [pg_data:/var/lib/postgresql/data]
restart: always
volumes:
twenty_data:
pg_data:
Nach dem Start: http://localhost:3000 → Sign-up → ersten Workspace anlegen.
Datenmodell
- Companies: Firmen
- People: Kontaktpersonen (verlinkt zu Companies)
- Opportunities: Deals mit Stage-Pipeline (Kanban!)
- Tasks/Notes: Aktivitäten
- Custom Objects: Eigene Objekt-Typen definieren
Das Modell ist bewusst Salesforce-ähnlich: Migration und Gedankenübertragung einfach.
API für Integrationen
Twenty hat REST UND GraphQL. API-Key in Settings → APIs:
# Companies listen
curl -H "Authorization: Bearer DEIN_API_KEY" \
"https://crm.deine-domain.de/rest/companies"
# Person anlegen
curl -X POST -H "Authorization: Bearer DEIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":{"firstName":"Max","lastName":"Mustermann"},
"emails":{"primaryEmail":"max@firma.de"}}' \
"https://crm.deine-domain.de/rest/people"
KI-Integration: Lead-Scoring und Follow-ups
import requests
import ollama
TWENTY = "https://crm.deine-domain.de"
HEADERS = {"Authorization": "Bearer DEIN_API_KEY"}
client = ollama.Client(host="http://ollama:11434")
# Offene Opportunities ohne Aktivität seit 7 Tagen
deals = requests.get(f"{TWENTY}/rest/opportunities",
headers=HEADERS).json()["data"]
for deal in deals["opportunities"]:
prompt = f"""Deal: {deal['name']}
Stage: {deal['stage']}
Betrag: {deal.get('amount',{}).get('amountMicros',0)/1e6}€
Letzte Aktivität: {deal.get('updatedAt')}
Schreibe einen kurzen, freundlichen Follow-up-E-Mail-Entwurf (3-4 Sätze)."""
draft = client.chat(model="llama3.1:8b",
messages=[{"role":"user","content":prompt}])["message"]["content"]
# Als Task/Note an den Deal hängen
requests.post(f"{TWENTY}/rest/notes", headers=HEADERS, json={
"title": "KI-Follow-up-Vorschlag",
"body": draft,
"targets": [{"opportunityId": deal["id"]}],
})
n8n-Integration
Twenty hat Webhooks (Settings → Webhooks → bei Objekt-Events HTTP-Call). Typischer Flow:
Twenty-Webhook: neuer Lead
│
▼
Ollama: Lead-Daten anreichern (Branche schätzen, Priorität)
│
▼
Twenty-API: Felder aktualisieren + Task für Vertrieb anlegen
│
▼
Wenn Score > X → Slack/Telegram-Alert an Sales
Sicherheit
- Secrets: Die drei Token-Secrets in
.envmüssen lang und zufällig sein. - HTTPS: Reverse Proxy (Caddy): CRM enthält sensible Kundendaten.
- API-Keys: Pro Integration eigenen Key, in Twenty revokierbar.
- DSGVO: On-premise = keine AVV mit US-Anbieter nötig, großer Pluspunkt gegenüber Salesforce/HubSpot.
Twenty vs. Alternativen
| CRM | Stärke | Schwäche |
|---|---|---|
| Twenty | Modernes UI, Open Source, dev-freundlich | Jung, weniger Features als SuiteCRM |
| SuiteCRM | Reif, mächtig | Altes UI, schwerfällig |
| HubSpot | Marketing-Integration | Cloud, teuer, Daten bei US-Anbieter |
| Salesforce | Branchenstandard | Teuer, komplex, Cloud |
| NocoDB | Leichter als CRM | Kein echtes CRM-Modell |
Weiterführende Links
- IRC-Coding.de: Programmier-Tutorials: GraphQL, REST-APIs.
- NocoDB: Für leichtere Daten-Hubs.
- Chatwoot: Kundenservice-Pendant.
- n8n: Workflow-Automatisierung.
- Docker: Container-Grundlagen.
Key Takeaways:
- Twenty = modernes Open-Source-CRM, „entwicklerfreundliches Salesforce”.
- Docker + Postgres, saubere REST/GraphQL-API, Kanban-Pipeline.
- On-premise → DSGVO-freundlich ohne AVV.
- KI-Integration: Lead-Scoring, Follow-up-Entwürfe, Daten-Anreicherung.
- Für KMU der beste Open-Source-CRM-Einstieg.
FAQ
Ist Twenty produktionsreif?
Kann ich aus Salesforce/HubSpot migrieren?
E-Mail-Integration?
Eigene Felder/Objekte?
Ressourcen?
Mobile App?
Quellen und weiterführende Literatur
- Twenty: GitHub.
- Twenty Docs: Dokumentation.
- IRC-Coding.de: Programmier-Tutorials.


