Rezept: Banking-Cashflow-Dashboard
Bankkonten per FinAPI verbinden, Transaktionen syncen, Live-KPI-Dashboard für die GL.
Geschäftsführung will jeden Morgen sehen: Wie viel Geld ist auf welchen Konten? Was kam gestern rein, was ging raus? Reicht der Cashflow, um die nächsten anstehenden Zahlungen zu decken?
Mit FinAPI + Dashboards baust du das in einem halben Vormittag.
Ziel
- Bankkonten per PSD2 verbunden
- Stündlicher Sync der Transaktionen in die Plattform
- KPI-Dashboard mit Saldo pro Konto, Eingänge/Ausgänge gestern und heute, Trend
- Per Token-Link auf einem Bürodisplay aufrufbar
Voraussetzungen
- PSD2-Online-Banking-Zugang zu den Geschäftskonten
- Workspace mit aktivierter Banking-Integration (Betreiber konfiguriert FinAPI-Account)
1. Konten verbinden
Einmaliger Schritt im Browser:
/manage/bank-accountsöffnen → Neue Verbindung- Bank suchen, Online-Banking-Login (PSD2-Flow direkt bei der Bank)
- Konten auswählen, bestätigen
Damit liegen iban, bank_name, balance, currency in der DB. Bei mehreren Konten: das wichtigste in apis.php als Default hinterlegen.
'apis' => [
'banking' => [
'defaultIban' => 'DE12345678901234567890',
],
],
2. Stündlicher Auto-Sync
scheduled.php:
<?php
return [
'scheduled' => [
'sync_banking' => [
'enabled' => true,
'tool' => 'syncTransactions',
'interval' => '1h',
],
],
];
syncTransactions ist ein Shared Tool — kommt aus der Plattform, du musst nichts selbst bauen.
3. KPI-Aggregation in ein Sheet
Damit das Dashboard live läuft, brauchst du eine Quelle, die in Cache-Frequenz aktuell ist. Variante: ein Tool, das alle paar Minuten ein Google Sheet mit den aktuellen Kennzahlen befüllt.
tools/banking/refreshCashflowKpis.php:
<?php
return [
'tools' => [
'refreshCashflowKpis' => [
'description' => 'Berechnet aktuelle Cashflow-KPIs und schreibt sie in das KPI-Sheet.',
'parameters' => ['type' => 'object', 'properties' => []],
'handler' => function (array $results, array $args, array $ctx): array {
$accounts = $ctx['runTool']('listAccounts', []);
$totalBalance = array_sum(array_column($accounts['accounts'] ?? [], 'balance'));
$today = $ctx['runTool']('getRecentTransactions', ['days' => 1]);
$yesterday = $ctx['runTool']('getRecentTransactions', ['days' => 2]);
$sumIn = function ($txs) {
return array_sum(array_filter(array_column($txs['transactions'] ?? [], 'amount'), fn($a) => $a > 0));
};
$sumOut = function ($txs) {
return abs(array_sum(array_filter(array_column($txs['transactions'] ?? [], 'amount'), fn($a) => $a < 0)));
};
$row = [
'Stand' => date('Y-m-d H:i'),
'Saldo gesamt' => $totalBalance,
'Eingang heute' => $sumIn($today),
'Ausgang heute' => $sumOut($today),
'Eingang gestern' => $sumIn($yesterday) - $sumIn($today),
'Ausgang gestern' => $sumOut($yesterday) - $sumOut($today),
];
return $ctx['runTool']('appendToSheet', [
'sheetId' => 'sheet-id-aus-google-drive',
'row' => array_values($row),
]);
},
],
],
];
Plus Scheduled Task alle 5 Minuten:
'refresh_cashflow_kpis' => [
'enabled' => true,
'tool' => 'refreshCashflowKpis',
'interval' => '5min',
],
4. Dashboard-Konfiguration
dashboards.php:
<?php
return [
'dashboards' => [
'cashflow' => [
'title' => 'Cashflow Live',
'description' => 'Tagesaktueller Stand aller Geschäftskonten',
'type' => 'kpi',
'access' => 'token',
'token' => 'long-random-token-here',
'datasource' => [
'type' => 'google_sheet',
'slug' => 'cashflow-kpis',
'sheetName' => 'Tabellenblatt1',
'cache_ttl' => 60,
'row' => 'last',
],
'tiles' => [
[
'title' => 'Saldo gesamt',
'column' => 'Saldo gesamt',
'format' => 'currency',
'size' => 'large',
'span' => 6,
'compare_mode' => 'neutral',
],
['type' => 'group', 'title' => 'Heute', 'icon' => '📅'],
[
'title' => 'Eingänge',
'column' => 'Eingang heute',
'compare_column' => 'Eingang gestern',
'format' => 'currency',
'size' => 'large',
'span' => 3,
'compare_label' => 'gestern',
'compare_mode' => 'higher_is_better',
],
[
'title' => 'Ausgänge',
'column' => 'Ausgang heute',
'compare_column' => 'Ausgang gestern',
'format' => 'currency',
'size' => 'large',
'span' => 3,
'compare_label' => 'gestern',
'compare_mode' => 'lower_is_better',
],
],
],
],
];
5. Aufrufen
https://taskmonkey.example.com/dashboards/view/cashflow?token=long-random-token-here&tenant=meco
Auf einem Wand-Display im GL-Büro: dauerhaft öffnen, Browser auf Vollbild, fertig.
Erweiterungen
- Pro Konto eine Zeile statt nur Gesamtsumme: Tile-Set verdoppeln
- Anstehende Belastungen aus dem Buchhaltungssystem: Tool, das offene Verbindlichkeiten zieht, plus Tile „Offene Verbindlichkeiten 30 Tage"
- Alarm-Schwelle: Wenn Saldo unter X € fällt, Slack-Notification (Scheduled Task mit
if-Logik) - Liquiditäts-Forecast: 7-Tage-Prognose basierend auf Vergangenheits-Pattern (Modell schreibt Forecast-Spalte)