← Zurueck zu n8n
💼

Freelancer Workflows

⚠️ Ungeprüft

Automatisiere den Papierkram. Mehr Zeit fuer das was du liebst - deine Arbeit.

⏱️ 30-40 Minuten 📊 Mittel
💡

Fuer wen ist das?

Freelancer, Berater und Solo-Selbststaendige die ihre Administration automatisieren wollen. Von der Zeiterfassung bis zur Rechnung - alles in einem Flow.

⏱️ Workflow 1: Zeiterfassung → Rechnung +

Automatisch Rechnungen aus deiner Zeiterfassung generieren. Ende des Monats: Ein Klick.

Schedule
1. des Monats
Toggl/Clockify
Zeiten abrufen
Aggregate
Pro Kunde
InvoiceShelf
Rechnung

Toggl API - Zeiten des letzten Monats:

HTTP Request an Toggl
yaml
GET https://api.track.toggl.com/reports/api/v2/details
Headers:
  Authorization: Basic BASE64(api_token:api_token)
Query Parameters:
  workspace_id: DEINE_WORKSPACE_ID
  since: __LBRACE2__ $now.minus(__LBRACE__months: 1__RBRACE__).startOf('month').toISODate() __RBRACE2__
  until: __LBRACE2__ $now.minus(__LBRACE__months: 1__RBRACE__).endOf('month').toISODate() __RBRACE2__
  user_agent: n8n-automation

Zeiten pro Kunde aggregieren:

Code Node - Gruppierung
javascript
// Eingehende Zeiteinträge nach Kunde gruppieren
const entries = $input.all();
const byClient = __LBRACE____RBRACE__;

entries.forEach(entry => __LBRACE__
  const client = entry.json.client || 'Ohne Kunde';
  if (!byClient[client]) __LBRACE__
    byClient[client] = __LBRACE__
      client: client,
      totalHours: 0,
      entries: []
    __RBRACE__;
  __RBRACE__
  byClient[client].totalHours += entry.json.dur / 3600000; // ms zu Stunden
  byClient[client].entries.push(__LBRACE__
    description: entry.json.description,
    hours: (entry.json.dur / 3600000).toFixed(2),
    date: entry.json.start
  __RBRACE__);
__RBRACE__);

return Object.values(byClient).map(item => (__LBRACE__ json: item __RBRACE__));

InvoiceShelf Rechnung erstellen:

InvoiceShelf API Request
json
__LBRACE__
  "invoice_number": "__LBRACE2__ $now.format('YYYY-MM') __RBRACE2__-__LBRACE2__ $json.client.substring(0,3).toUpperCase() __RBRACE2__",
  "invoice_date": "__LBRACE2__ $now.toISODate() __RBRACE2__",
  "due_date": "__LBRACE2__ $now.plus(__LBRACE__days: 14__RBRACE__).toISODate() __RBRACE2__",
  "customer_id": "__LBRACE2__ $json.customer_id __RBRACE2__",
  "items": [
    __LBRACE__
      "name": "Dienstleistung __LBRACE2__ $now.minus(__LBRACE__months:1__RBRACE__).format('MMMM YYYY') __RBRACE2__",
      "description": "__LBRACE2__ $json.entries.map(e => e.description).join(', ') __RBRACE2__",
      "quantity": __LBRACE2__ $json.totalHours.toFixed(2) __RBRACE2__,
      "price": 8500
    __RBRACE__
  ],
  "notes": "Zahlbar innerhalb von 14 Tagen."
__RBRACE__

Ergebnis

Am 1. jeden Monats werden automatisch Rechnungen fuer alle Kunden erstellt. Du musst nur noch pruefen und versenden.

📬 Workflow 2: GitHub/GitLab Projekt-Updates +

Bleib informiert ueber Issues und Commits in deinen Kundenprojekten - ohne staendig reinzuschauen.

GitHub Webhook
Issue/PR Event
Switch
Event-Typ
Telegram
Nachricht

GitHub Webhook einrichten:

  1. Repository → Settings → Webhooks → Add webhook
  2. Payload URL: Deine n8n Webhook URL
  3. Content type: application/json
  4. Events: Issues, Pull requests, Push

Switch Node - Nach Event-Typ:

Routing Regeln
javascript
// Switch basierend auf GitHub Event Header
__LBRACE2__ $json.headers['x-github-event'] __RBRACE2__

// Cases:
// - "issues" → Issue Benachrichtigung
// - "pull_request" → PR Benachrichtigung
// - "push" → Commit Benachrichtigung

Telegram Nachrichten:

Issue Nachricht
text
🐛 *Neues Issue*

📁 __LBRACE2__ $json.body.repository.full_name __RBRACE2__
📝 #__LBRACE2__ $json.body.issue.number __RBRACE2__: __LBRACE2__ $json.body.issue.title __RBRACE2__
👤 __LBRACE2__ $json.body.issue.user.login __RBRACE2__

🔗 __LBRACE2__ $json.body.issue.html_url __RBRACE2__
Pull Request Nachricht
text
🔀 *Pull Request __LBRACE2__ $json.body.action __RBRACE2__*

📁 __LBRACE2__ $json.body.repository.full_name __RBRACE2__
📝 #__LBRACE2__ $json.body.pull_request.number __RBRACE2__: __LBRACE2__ $json.body.pull_request.title __RBRACE2__
👤 __LBRACE2__ $json.body.pull_request.user.login __RBRACE2__
🎯 __LBRACE2__ $json.body.pull_request.head.ref __RBRACE2__ -> __LBRACE2__ $json.body.pull_request.base.ref __RBRACE2__

🔗 __LBRACE2__ $json.body.pull_request.html_url __RBRACE2__
📄 Workflow 3: Schneller Angebots-Generator +

Erstelle Angebote in Sekunden per Telegram-Befehl oder Webhook.

Telegram
/angebot Kunde 10h
Parse
Eingabe
Template
PDF erstellen
Email
An mich senden

Telegram Bot Command:

Eingabe-Format
text

/angebot Musterfirma GmbH, Website Redesign, 40h, 85

# Wird geparst zu:
# Kunde: Musterfirma GmbH
# Projekt: Website Redesign
# Stunden: 40
# Stundensatz: 85€

Eingabe parsen (Code Node):

Parser
javascript
const text = $json.message.text.replace('/angebot ', '');
const parts = text.split(',').map(p => p.trim());

return [__LBRACE__
  json: __LBRACE__
    kunde: parts[0],
    projekt: parts[1],
    stunden: parseFloat(parts[2]),
    stundensatz: parseFloat(parts[3]) || 85,
    get summe() __LBRACE__ return this.stunden * this.stundensatz; __RBRACE__,
    datum: new Date().toLocaleDateString('de-DE'),
    gueltig_bis: new Date(Date.now() + 30*24*60*60*1000).toLocaleDateString('de-DE')
  __RBRACE__
__RBRACE__];

HTML Template fuer PDF:

Angebots-Template
html
<!DOCTYPE html>
<html>
<head>
  <style>
    body __LBRACE__ font-family: Arial, sans-serif; max-width: 800px; margin: auto; __RBRACE__
    .header __LBRACE__ text-align: center; border-bottom: 2px solid #333; padding-bottom: 20px; __RBRACE__
    table __LBRACE__ width: 100%; border-collapse: collapse; margin: 20px 0; __RBRACE__
    th, td __LBRACE__ border: 1px solid #ddd; padding: 10px; text-align: left; __RBRACE__
    .total __LBRACE__ font-size: 1.2em; font-weight: bold; text-align: right; __RBRACE__
  </style>
</head>
<body>
  <div class="header">
    <h1>DEIN NAME / FIRMA</h1>
    <p>Angebot vom __LBRACE2__ $json.datum __RBRACE2__</p>
  </div>

  <h2>Angebot fuer __LBRACE2__ $json.kunde __RBRACE2__</h2>
  <p><strong>Projekt:</strong> __LBRACE2__ $json.projekt __RBRACE2__</p>

  <table>
    <thead>
      <tr>
        <th>Beschreibung</th>
        <th>Stunden</th>
        <th>Stundensatz</th>
        <th>Gesamt</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>__LBRACE2__ $json.projekt __RBRACE2__</td>
        <td>__LBRACE2__ $json.stunden __RBRACE2__h</td>
        <td>__LBRACE2__ $json.stundensatz __RBRACE2__ EUR</td>
        <td>__LBRACE2__ $json.summe.toFixed(2) __RBRACE2__ EUR</td>
      </tr>
    </tbody>
  </table>

  <p class="total">Gesamtsumme: __LBRACE2__ $json.summe.toFixed(2) __RBRACE2__ EUR netto</p>

  <p>Gültig bis: __LBRACE2__ $json.gueltig_bis __RBRACE2__</p>
</body>
</html>
💡

PDF Generierung

Nutze den HTML to PDF Node oder einen externen Service wie https://api.html2pdf.app um das HTML in ein PDF umzuwandeln.

Workflow 4: Deadline Reminder +

Automatische Erinnerungen vor Projekt-Deadlines. Nie wieder Abgabetermine vergessen.

Schedule
täglich 9:00
Notion/Airtable
Projekte laden
IF
Deadline nah?
Telegram

Projekte aus Notion laden:

Notion Database Query
yaml
POST https://api.notion.com/v1/databases/DATABASE_ID/query
Headers:
  Authorization: Bearer NOTION_API_KEY
  Notion-Version: 2022-06-28
Body:
  {
    "filter": {
      "property": "Status",
      "select": {
        "does_not_equal": "Abgeschlossen"
      }
    }
  }

Deadlines filtern:

IF Node - Deadline Check
javascript
// Projekte mit Deadline in den nächsten 3 Tagen
const deadline = new Date($json.properties.Deadline.date.start);
const today = new Date();
const daysUntil = Math.ceil((deadline - today) / (1000 * 60 * 60 * 24));

return daysUntil <= 3 && daysUntil >= 0;

Reminder Nachricht:

Telegram Reminder
text
⏰ *Deadline Reminder*

📁 *__LBRACE2__ $json.properties.Name.title[0].plain_text __RBRACE2__*
🏢 Kunde: __LBRACE2__ $json.properties.Kunde.select.name __RBRACE2__
📅 Deadline: __LBRACE2__ $json.properties.Deadline.date.start __RBRACE2__
⏳ Noch: __LBRACE2__ $json.daysUntil __RBRACE2__ Tag(e)

__LBRACE2__ $json.daysUntil < 2 ? '🚨 DRINGEND!' : '⚠️ Bald fällig' __RBRACE2__
💰 Workflow 5: Quartals-Steuerschaetzung +

Behalte deine Steuerruecklagen im Blick. Automatische Berechnung basierend auf deinen Einnahmen.

Schedule
1. Apr/Jul/Okt/Jan
InvoiceShelf
Umsatz Q
Calculate
Steuer
Email

Quartals-Umsatz berechnen:

Code Node - Steuerberechnung
javascript
// Einfache Schätzung für Einkommensteuer + USt
const umsatz = $json.total_revenue;
const betriebsausgaben = $json.total_expenses || umsatz * 0.2; // 20% pauschal
const gewinn = umsatz - betriebsausgaben;

// Grobe Schätzung Einkommensteuer (vereinfacht!)
let einkommensteuer = 0;
if (gewinn > 10908) { // Grundfreibetrag 2024
  einkommensteuer = (gewinn - 10908) * 0.30; // ~30% vereinfacht
}

// Umsatzsteuer (falls nicht Kleinunternehmer)
const umsatzsteuer = umsatz * 0.19;
const vorsteuer = betriebsausgaben * 0.19;
const ustZahllast = umsatzsteuer - vorsteuer;

return [{
  json: {
    quartal: $now.format('Q/YYYY'),
    umsatz: umsatz.toFixed(2),
    gewinn: gewinn.toFixed(2),
    einkommensteuer_ruecklage: einkommensteuer.toFixed(2),
    ust_zahllast: ustZahllast.toFixed(2),
    gesamt_ruecklage: (einkommensteuer + Math.max(0, ustZahllast)).toFixed(2)
  }
}];

Quartals-Report:

Email Bericht
text
📊 *Steuer-Schätzung Q__LBRACE2__ $json.quartal __RBRACE2__*

💰 Umsatz: __LBRACE2__ $json.umsatz __RBRACE2__ EUR
📉 Geschätzter Gewinn: __LBRACE2__ $json.gewinn __RBRACE2__ EUR

💸 *Empfohlene Rücklagen:*
• Einkommensteuer: ~__LBRACE2__ $json.einkommensteuer_ruecklage __RBRACE2__ EUR
• USt-Zahllast: ~__LBRACE2__ $json.ust_zahllast __RBRACE2__ EUR
• *Gesamt: __LBRACE2__ $json.gesamt_ruecklage __RBRACE2__ EUR*

→ Auf separates Konto überweisen!
⚠️

Nur eine Schaetzung!

Diese Berechnung ersetzt keinen Steuerberater! Sie dient nur als grober Anhaltspunkt für deine Rücklagen-Planung.

📅 Workflow 6: Automatisches Verfuegbarkeits-Update +

Aktualisiere automatisch deine Verfuegbarkeit auf deiner Website oder in Freelancer-Portalen.

Schedule
Mo 8:00
Kalender
Auslastung
Calculate
Freie Tage
Website API
Update

Verfuegbarkeit berechnen:

Code Node
javascript
// Kalender-Events der nächsten 4 Wochen analysieren
const events = $input.all();
const workDaysPerWeek = 5;
const weeksAhead = 4;
const totalWorkDays = workDaysPerWeek * weeksAhead;

// Gebuchte Tage zählen (Events mit "Kunde:" oder "Projekt:")
const bookedDays = events.filter(e =>
  e.json.summary?.includes('Kunde:') ||
  e.json.summary?.includes('Projekt:')
).length;

const freeDays = totalWorkDays - bookedDays;
const utilization = Math.round((bookedDays / totalWorkDays) * 100);

let status = 'verfuegbar';
if (utilization > 90) status = 'ausgebucht';
else if (utilization > 70) status = 'begrenzt';

return [__LBRACE__
  json: __LBRACE__
    status,
    freeDays,
    utilization,
    nextFreeSlot: freeDays > 0 ? 'Diese Woche' : 'In 4+ Wochen',
    message: status === 'ausgebucht'
      ? 'Aktuell ausgebucht. Anfragen für später möglich.'
      : freeDays + ' Tage in den nächsten 4 Wochen verfügbar.'
  __RBRACE__
__RBRACE__];

Website aktualisieren:

HTTP Request an eigene API
yaml
# Beispiel: Eigene Website mit einfacher JSON-API
PUT https://deine-website.de/api/availability
Headers:
  Authorization: Bearer API_TOKEN
Body:
__LBRACE__
    "status": "__LBRACE2__ $json.status __RBRACE2__",
    "message": "__LBRACE2__ $json.message __RBRACE2__",
    "updated": "__LBRACE2__ $now.toISO() __RBRACE2__"
__RBRACE__
Workflow 7: Automatisches Feedback nach Projektende +

Nach Projektabschluss automatisch um Feedback und Bewertungen bitten.

Webhook
Projekt done
Wait
3 Tage
Email
Feedback-Bitte

Feedback-Email Template:

Email Template
html
Betreff: Wie war die Zusammenarbeit? - __LBRACE2__ $json.projekt __RBRACE2__

Hallo __LBRACE2__ $json.ansprechpartner __RBRACE2__,

wir haben vor kurzem unser gemeinsames Projekt
"__LBRACE2__ $json.projekt __RBRACE2__" abgeschlossen.

Dein Feedback ist mir wichtig! Wuerdest du dir 2 Minuten Zeit nehmen?

👉 __LBRACE2__ $json.feedback_link __RBRACE2__

Oder hinterlasse eine oeffentliche Bewertung:
• LinkedIn: __LBRACE2__ $json.linkedin_url __RBRACE2__
• Google: __LBRACE2__ $json.google_review_url __RBRACE2__

Vielen Dank und bis zum naechsten Projekt!

__LBRACE2__ $json.mein_name __RBRACE2__
💡

Feedback-Formular

Erstelle ein einfaches Typeform oder Google Form für Feedback. Die Antworten kannst du per Webhook in ein weiteres n8n Workflow leiten.

💡 Tipps fuer Freelancer-Workflows +
📱

Mobile-First denken

Als Freelancer bist du oft unterwegs. Telegram ist perfekt für Benachrichtigungen und schnelle Aktionen.

🔄

Klein anfangen

Automatisiere erst einen Prozess komplett bevor du den nächsten angehst. Qualität vor Quantität.

💾

Workflows exportieren

Speichere deine Workflows als JSON in Git. Bei Server-Problemen kannst du schnell wiederherstellen.

🧮

ROI berechnen

Zeitaufwand für Automation vs. gesparte Zeit. Ein Workflow der 4h braucht aber nur 10min/Monat spart, lohnt sich erst nach 2 Jahren.

Haeufige Fragen

Welche Zeiterfassung funktioniert am besten mit n8n?

Toggl Track und Clockify haben beide gute APIs und sind kostenlos nutzbar. Toggl hat eine etwas bessere API-Dokumentation.

Kann ich auch ohne InvoiceShelf Rechnungen erstellen?

Ja! Alternativen:

  • Lexoffice - Hat eine API, beliebt in DE
  • sevDesk - Ebenfalls mit API
  • HTML to PDF - Eigene Templates als PDF
  • Google Docs API - Template ausfüllen
Wie schuetze ich meine Workflows vor Ausfall?
  • Regelmäßige Backups (siehe Self-Hosting Guide)
  • Error Workflow einrichten der dich bei Fehlern benachrichtigt
  • Workflows als JSON in Git versionieren
  • Wichtige Workflows testen nach n8n Updates
Mein Stundensatz ist variabel - wie handle ich das?

Speichere Stundensätze pro Kunde in einer Tabelle (Airtable/Notion/DB) und frage sie im Workflow ab. So kannst du pro Kunde unterschiedliche Sätze haben.

Freelancer-Workflows einrichten lassen?

Wir bauen dir ein komplettes Automatisierungs-Setup - von Zeiterfassung bis Rechnung.

Beratung anfragen →