Freelancer Workflows
⚠️ UngeprüftAutomatisiere den Papierkram. Mehr Zeit fuer das was du liebst - deine Arbeit.
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:
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:
// 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:
__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:
- Repository → Settings → Webhooks → Add webhook
- Payload URL: Deine n8n Webhook URL
- Content type:
application/json - Events: Issues, Pull requests, Push
Switch Node - Nach Event-Typ:
// 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:
🐛 *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 __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:
/angebot Musterfirma GmbH, Website Redesign, 40h, 85
# Wird geparst zu:
# Kunde: Musterfirma GmbH
# Projekt: Website Redesign
# Stunden: 40
# Stundensatz: 85€
Eingabe parsen (Code Node):
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:
<!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:
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:
// 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:
⏰ *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:
// 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:
📊 *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:
// 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:
# 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:
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.
Weitere Workflows
Freelancer-Workflows einrichten lassen?
Wir bauen dir ein komplettes Automatisierungs-Setup - von Zeiterfassung bis Rechnung.
Beratung anfragen →