Zum Inhalt springen
CASOON

Mini-Automationen für Freelancer (ohne große Infrastruktur)

Drei copy-paste-ready Skripte: Lead-Auswertung, Content-Clustering, Kundenfeedback – mit der Gemini API

Aktualisiert 3. April 2026
10 Minuten
Mini-Automationen für Freelancer (ohne große Infrastruktur)
#Automatisierung #Gemini #Python #Freelancer

Die wirksamsten Automationen für Freelancer sind nicht die komplexesten – sie erledigen eine konkrete, wiederkehrende Aufgabe zuverlässig, ohne dass man eine Serverinfrastruktur pflegen muss. Dieser Artikel stellt drei direkt einsetzbare Automationen vor: Lead-Auswertung aus eingehenden E-Mails, automatisches Content-Clustering aus Keyword-Listen und strukturierte Zusammenfassung von Kundenfeedback. Alle Beispiele sind als lauffähige Skripte aufgebaut – copy & paste ready, anpassbar auf den eigenen Workflow.

Warum keine Infra?

Ein eigener Server kostet nicht nur Geld. Er kostet Zeit: Updates, Monitoring, Deployments, Fehlersuche. Für Freelancer, die alleine arbeiten oder ein kleines Team haben, ist das ein schlechter Trade-off.

Die Alternative: Python-Skripte, die lokal laufen. Kein Cloud-Hosting, kein Docker, kein CI/CD. Die Gemini API übernimmt die KI-Logik, das Skript erledigt den Rest. Für wiederkehrende Aufgaben kann man sie per cronjob automatisieren – aber selbst manuell ausgeführt sparen sie Stunden.

Der Ansatz hat drei Vorteile:

  • Keine monatlichen Infrastrukturkosten – nur API-Kosten, wenn das Skript läuft
  • Volle Kontrolle – Code liegt lokal, keine Daten bei Drittanbietern außer Google
  • Anpassbar – kein Low-Code-Tool mit starren Grenzen

Vorbereitung: Was du brauchst

Ein Google AI API-Key von aistudio.google.com reicht aus. Das SDK installieren:

pip install google-generativeai python-dotenv

API-Key in einer .env-Datei ablegen:

GEMINI_API_KEY=dein-key-hier

Das Grundgerüst, das alle drei Automationen teilen:

import os
import json
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()

genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

model = genai.GenerativeModel(
    model_name="gemini-2.0-flash",
    generation_config=genai.GenerationConfig(
        response_mime_type="application/json",
        temperature=0.1,
    )
)

gemini-2.0-flash ist für diese Aufgaben die richtige Wahl: schnell, günstig, zuverlässig bei strukturierten Outputs. response_mime_type="application/json" aktiviert den JSON Mode – kein Text davor, kein Text danach, immer valides JSON.

Automation 1: Lead-Auswertung aus E-Mails

Das Problem: Anfragen kommen per E-Mail rein. Manche sind konkret und budgetiert, manche sind vage Anfragen ohne ernsthafte Absicht. Wer täglich fünf bis zehn Anfragen bekommt, verbringt zu viel Zeit mit der Vorauswahl.

Die Lösung: Ein Skript, das den E-Mail-Text nimmt, die Lead-Qualität bewertet und Budget-Hinweise extrahiert.

import os
import json
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

SYSTEM_INSTRUCTION = """
Du bist ein Assistent, der eingehende Kundenanfragen bewertet.

Analysiere die E-Mail und antworte ausschließlich als JSON mit diesen Feldern:
- quality: "hoch", "mittel" oder "niedrig"
- quality_reason: ein Satz, warum diese Bewertung
- budget_hint: geschätztes Budget als String, oder null wenn unklar
- project_type: kurze Beschreibung der Anfrage (max. 10 Wörter)
- urgency: "sofort", "in Kürze" oder "unklar"
- recommended_action: "antworten", "nachfragen" oder "ablehnen"

Kriterien für "hoch": konkretes Projekt, klares Ziel, Budget-Andeutung, seriöse Formulierung.
Kriterien für "niedrig": kein Budget, vage Formulierung, Preisdumping-Signale, keine Kontaktdaten.

Keine Erklärungen außerhalb des JSON.
"""

model = genai.GenerativeModel(
    model_name="gemini-2.0-flash",
    system_instruction=SYSTEM_INSTRUCTION,
    generation_config=genai.GenerationConfig(
        response_mime_type="application/json",
        temperature=0.1,
    )
)

def evaluate_lead(email_text: str) -> dict:
    response = model.generate_content(email_text)
    return json.loads(response.text)

# Beispiel-Nutzung
email = """
Hallo,

ich bin Inhaber einer kleinen Bäckerei und suche jemanden, der unsere Website
neu gestaltet. Wir haben aktuell gar keine Website, möchten aber online
gefunden werden. Budget: ca. 2.000–3.000 Euro.
Können wir uns nächste Woche kurz telefonieren?

Grüße, Thomas Bauer
"""

result = evaluate_lead(email)
print(json.dumps(result, indent=2, ensure_ascii=False))

Beispiel-Output:

{
  "quality": "hoch",
  "quality_reason": "Konkretes Projekt mit klar genanntem Budget und direktem Kontaktwunsch.",
  "budget_hint": "2.000–3.000 Euro",
  "project_type": "Neuerstellung Website für lokale Bäckerei",
  "urgency": "in Kürze",
  "recommended_action": "antworten"
}

Das Skript lässt sich leicht erweitern: E-Mails aus einem IMAP-Ordner lesen, Ergebnisse in eine CSV schreiben, oder direkt in ein Notion-Board exportieren.

Automation 2: Content-Clustering aus Keyword-Listen

Das Problem: Nach einer Keyword-Recherche liegt eine CSV mit 150 bis 300 Keywords vor. Sie thematisch zu gruppieren kostet manuell eine Stunde – und die Gruppenbildung ist trotzdem inkonsistent.

Die Lösung: Gemini liest die Keywords, erkennt thematische Muster und gibt strukturierte Cluster zurück.

import os
import json
import csv
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

SYSTEM_INSTRUCTION = """
Du bist ein SEO-Analyst. Deine Aufgabe ist Content-Clustering.

Du bekommst eine Liste von Keywords. Gruppiere sie in thematische Cluster.

Antworte ausschließlich als JSON mit dieser Struktur:
{
  "clusters": [
    {
      "cluster_name": "Cluster-Titel",
      "main_intent": "informational" | "transactional" | "navigational",
      "keywords": ["keyword1", "keyword2"],
      "suggested_page_title": "Vorschlag für H1 einer Seite zu diesem Cluster"
    }
  ]
}

Regeln:
- Jedes Keyword gehört zu genau einem Cluster
- Cluster-Namen sind kurz und konkret (max. 5 Wörter)
- Mindestens 2, maximal 8 Keywords pro Cluster
- Keine Erklärungen außerhalb des JSON
"""

model = genai.GenerativeModel(
    model_name="gemini-2.0-flash",
    system_instruction=SYSTEM_INSTRUCTION,
    generation_config=genai.GenerationConfig(
        response_mime_type="application/json",
        temperature=0.1,
    )
)

def cluster_keywords(keywords: list[str]) -> dict:
    keyword_list = "\n".join(keywords)
    prompt = f"Clustere diese Keywords:\n\n{keyword_list}"
    response = model.generate_content(prompt)
    return json.loads(response.text)

def load_keywords_from_csv(filepath: str, column: str = "keyword") -> list[str]:
    keywords = []
    with open(filepath, newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            if column in row and row[column].strip():
                keywords.append(row[column].strip())
    return keywords

# Beispiel mit direkter Liste
keywords = [
    "wordpress website erstellen",
    "wordpress kosten",
    "website erstellen lassen preis",
    "webdesign freelancer beauftragen",
    "webdesign freelancer kosten",
    "wordpress vs. webflow",
    "webflow vor- und nachteile",
    "website pflegen lassen",
    "website wartung kosten",
    "wordpress update kosten",
]

result = cluster_keywords(keywords)
print(json.dumps(result, indent=2, ensure_ascii=False))

# Aus CSV laden:
# keywords = load_keywords_from_csv("keywords.csv", column="keyword")
# result = cluster_keywords(keywords)

Beispiel-Output:

{
  "clusters": [
    {
      "cluster_name": "Website erstellen lassen",
      "main_intent": "transactional",
      "keywords": [
        "wordpress website erstellen",
        "website erstellen lassen preis",
        "webdesign freelancer beauftragen",
        "webdesign freelancer kosten"
      ],
      "suggested_page_title": "Website erstellen lassen – Preise & Ablauf"
    },
    {
      "cluster_name": "WordPress vs. Webflow",
      "main_intent": "informational",
      "keywords": [
        "wordpress vs. webflow",
        "webflow vor- und nachteile",
        "wordpress kosten"
      ],
      "suggested_page_title": "WordPress oder Webflow? Der direkte Vergleich"
    },
    {
      "cluster_name": "Website Wartung & Pflege",
      "main_intent": "informational",
      "keywords": [
        "website pflegen lassen",
        "website wartung kosten",
        "wordpress update kosten"
      ],
      "suggested_page_title": "Website-Pflege und Wartung: Was kostet es wirklich?"
    }
  ]
}

Automation 3: Kundenfeedback strukturiert zusammenfassen

Das Problem: Feedback kommt aus unterschiedlichen Quellen – E-Mail, Kontaktformular, manchmal ein kurzes Telefonat, dessen Notizen irgendwo liegen. Themen extrahieren, Stimmung einschätzen, Handlungsempfehlungen ableiten: das kostet Zeit, die besser ins Projekt fließen sollte.

Die Lösung: Alle Feedback-Texte in das Skript geben, strukturiertes JSON zurückbekommen.

import os
import json
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))

SYSTEM_INSTRUCTION = """
Du bist ein Analyst für Kundenfeedback.

Analysiere den Feedback-Text und antworte ausschließlich als JSON:
{
  "overall_sentiment": "positiv" | "neutral" | "negativ" | "gemischt",
  "sentiment_score": Zahl von -1.0 (sehr negativ) bis 1.0 (sehr positiv),
  "main_topics": [
    {
      "topic": "Thema",
      "sentiment": "positiv" | "neutral" | "negativ",
      "quote": "wörtliches Zitat aus dem Feedback, das das Thema belegt"
    }
  ],
  "actionable_items": [
    "Konkrete Handlungsempfehlung 1",
    "Konkrete Handlungsempfehlung 2"
  ],
  "priority": "hoch" | "mittel" | "niedrig",
  "follow_up_required": true oder false
}

Regeln:
- Nur Themen nennen, die tatsächlich im Feedback vorkommen
- Zitate wörtlich aus dem Feedback übernehmen
- Handlungsempfehlungen konkret und umsetzbar formulieren
- Keine Erklärungen außerhalb des JSON
"""

model = genai.GenerativeModel(
    model_name="gemini-2.0-flash",
    system_instruction=SYSTEM_INSTRUCTION,
    generation_config=genai.GenerationConfig(
        response_mime_type="application/json",
        temperature=0.1,
    )
)

def analyze_feedback(feedback_text: str) -> dict:
    response = model.generate_content(feedback_text)
    return json.loads(response.text)

def analyze_multiple(feedbacks: list[str]) -> list[dict]:
    results = []
    for i, text in enumerate(feedbacks):
        print(f"Analysiere Feedback {i + 1}/{len(feedbacks)}...")
        results.append(analyze_feedback(text))
    return results

# Beispiel
feedback = """
Die Zusammenarbeit war insgesamt gut, aber der Launch hat sich um zwei Wochen
verzögert. Das war problematisch, weil wir eine Kampagne darauf ausgerichtet
hatten. Die Website selbst sieht sehr professionell aus und wir bekommen
viel positives Feedback von Kunden. Was ich mir für das nächste Projekt
wünsche: klarere Zwischenstände und frühere Kommunikation bei Verzögerungen.
"""

result = analyze_feedback(feedback)
print(json.dumps(result, indent=2, ensure_ascii=False))

Beispiel-Output:

{
  "overall_sentiment": "gemischt",
  "sentiment_score": 0.3,
  "main_topics": [
    {
      "topic": "Projektverzögerung",
      "sentiment": "negativ",
      "quote": "der Launch hat sich um zwei Wochen verzögert"
    },
    {
      "topic": "Qualität der Website",
      "sentiment": "positiv",
      "quote": "Die Website selbst sieht sehr professionell aus"
    },
    {
      "topic": "Kommunikation bei Verzögerungen",
      "sentiment": "negativ",
      "quote": "klarere Zwischenstände und frühere Kommunikation bei Verzögerungen"
    }
  ],
  "actionable_items": [
    "Proaktiv über Verzögerungen informieren, sobald sie absehbar sind",
    "Wöchentliche Status-Updates für Projekte mit festen Launch-Terminen einführen"
  ],
  "priority": "mittel",
  "follow_up_required": true
}

Wo laufen diese Skripte?

Alle drei Skripte laufen lokal ohne weitere Abhängigkeiten. Für wiederkehrende Aufgaben gibt es mehrere Optionen:

PlattformSetupKostenGeeignet für
Lokal (manuell)KeinsNichtsGelegentliche Auswertungen
macOS/Linux cron1 Zeile in crontabNichtsTägliche/wöchentliche Jobs
GitHub ActionsYAML-DateiKostenlos bis 2.000 Min./MonatRegelmäßige Batch-Verarbeitung
Windows Task SchedulerGUI oder XMLNichtsWindows-Nutzer

Ein einfacher cronjob (macOS/Linux), der das Lead-Skript täglich um 8 Uhr morgens ausführt:

# crontab -e
0 8 * * * /usr/bin/python3 /Users/dein-name/scripts/evaluate_leads.py >> /Users/dein-name/logs/leads.log 2>&1

Für GitHub Actions eine Datei .github/workflows/weekly-feedback.yml:

name: Weekly Feedback Analysis
on:
  schedule:
    - cron: '0 7 * * 1'  # Jeden Montag um 7 Uhr

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - run: pip install google-generativeai python-dotenv
      - run: python scripts/analyze_feedback.py
        env:
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}

Wann sich eine Mini-Automation nicht lohnt

Nicht jede wiederkehrende Aufgabe ist automatisch ein guter Kandidat für ein Skript. Der häufigste Fehler ist, den Begriff “Automation” mit “Zeitgewinn” gleichzusetzen. Das stimmt nur unter bestimmten Bedingungen.

Keine gute Automation ist eine Aufgabe dann, wenn der Input jedes Mal völlig anders aussieht, wenn fast jeder Output manuell umgeschrieben werden muss oder wenn der Vorgang so selten vorkommt, dass sich der Setup-Aufwand nie amortisiert.

Eine einfache Faustregel hilft:

  • Häufigkeit: mindestens mehrmals im Monat
  • Struktur: klarer Input, klarer gewünschter Output
  • Review-Aufwand: Nachbearbeitung bleibt unter etwa 20 bis 30 Prozent
  • Fehlerrisiko: ein schlechter Output verursacht keinen echten Schaden

Wenn einer dieser Punkte nicht erfüllt ist, ist oft der manuelle Weg besser. Dann ist KI eher ein Denkwerkzeug im Playground als Teil eines automatisierten Prozesses.

Einordnung

Was diese drei Skripte gemeinsam haben: Sie lösen ein konkretes, wiederkehrendes Problem. Sie sind nicht generisch. Sie produzieren JSON, das direkt weiterverarbeitet werden kann – in eine Tabelle, ein Projektmanagement-Tool, eine Datenbank.

Das ist der Kern: Nicht „KI im Allgemeinen einsetzen”, sondern eine spezifische Aufgabe definieren, den Output strukturieren, und das Skript einmal schreiben. Danach läuft es.

Die API-Kosten für diese drei Anwendungsfälle sind gering. Gemini Flash verarbeitet 1.000 Token für Bruchteile eines Cents. Ein Skript, das täglich zehn E-Mails auswertet, kostet im Monat weniger als ein Kaffee.

Im nächsten Artikel dieser Serie geht es um einen anderen Anwendungsfall: Gemini für SEO – was wirklich funktioniert, was nicht, und wo eigene Daten den Unterschied machen.