Workflow
Daglig runway → Slack
Recept för n8n eller valfri cron: varje vardag kl 08:00 hämtas KPI-rapporten från accounteds REST-API, runway räknas lokalt från kassan och snittet av de tre senaste hela månadernas nettoutflöde, och en rad med trendpil och färg postas i Slack. Read-only, kräver bara läsbehörighet.
TL;DRRecept för n8n eller valfri cron: varje vardag kl 08:00 hämtas KPI-rapporten från accounteds REST-API, runway räknas lokalt från kassan och snittet av de tre senaste hela månadernas nettoutflöde, och en rad med trendpil och färg postas i Slack. Read-only, kräver bara läsbehörighet.
Vad det här är
Ett recept som du bygger själv i n8n eller en egen cron. Posten pekade tidigare på ett n8n-paket som aldrig publicerades. Stegen nedan går mot accounteds REST-API som det ser ut i dag. Receptet läser bara och skriver ingenting till bokföringen.
Endpoints och fält finns i API-dokumentationen och i
https://app.accounted.se/api/v1/openapi.json.
Vad som händer 08:00
- Schedule-trigger med cron
0 8 * * 1-5(vardagar kl 08:00). GET /api/v1/companies/{companyId}/fiscal-periods: välj räkenskapsåret där dagens datum ligger mellanperiod_startochperiod_end.GET /api/v1/companies/{companyId}/reports/kpi?period_id=…: svaret har bland annatcashPosition(bokfört saldo på 19xx-kontona, eller de konton bolaget valt i nyckeltalsinställningarna),totalRevenue,totalExpenses,periodochmonths[], en rad per månad i räkenskapsåret medincome(klass 3),expenses(klass 4–7) ochnet.GET /api/v1/companies/{companyId}/cash-accounts:balance_updated_atper bankkonto visar hur färskt bankens saldo är.- En Code-nod räknar runway och jämför med gårdagens värde.
- Slack-noden, eller ett POST-anrop till en incoming webhook, postar resultatet.
Alla anrop har headern Authorization: Bearer gnubok_sk_live_….
Beräkningen
months[] börjar på räkenskapsårets första månad och innehåller alla månader
i året, även de som inte har börjat. Ta därför bara hela månader före
innevarande månad:
// n8n Code-nod. "KPI" är namnet på HTTP Request-noden för /reports/kpi.
const kpi = $('KPI').first().json.data
const start = new Date(kpi.period.start)
const now = new Date()
const idx = (now.getFullYear() - start.getFullYear()) * 12 + (now.getMonth() - start.getMonth())
const last3 = kpi.months.slice(0, idx).slice(-3)
// Färre än tre hela månader: hämta förra räkenskapsårets KPI (previous_period_id) och fyll på.
const burn = last3.length
? last3.reduce((sum, m) => sum + (m.expenses - m.income), 0) / last3.length
: null
const runway = burn && burn > 0 ? kpi.cashPosition / burn : null
const store = $getWorkflowStaticData('global')
const prev = store.last ?? null
store.last = { date: now.toISOString().slice(0, 10), cash: kpi.cashPosition, runway }
const color = runway === null ? 'grön' : runway > 12 ? 'grön' : runway > 6 ? 'gul' : runway > 3 ? 'orange' : 'röd'
return [{ json: { cash: kpi.cashPosition, burn, runway, prev, color } }]
runway blir null när intäkterna är större än kostnaderna och ingen kassa
bränns. n8n sparar workflow static data bara vid produktionskörningar;
manuella testkörningar sparar ingenting.
Slack-posten
🟢 Runway: 9,1 månader
Kassa: 1 247 380 kr ↓ 52 080 sedan igår
Burn / mån: 137 600 kr snitt av tre hela månader
Bankens saldo uppdaterat: idag 06:14
Detaljer → app.accounted.se/kpi
Färgerna: grön över 12 månader, gul 6–12, orange 3–6, röd under 3. Trösklarna ligger i Code-noden, ändra dem där.
API-nyckel
Skapa nyckeln i app.accounted.se under Inställningar → API-nycklar och ge den
bara reports:read (fiscal-periods och KPI) och transactions:read
(cash-accounts). En testnyckel (gnubok_sk_test_…) läser samma riktiga data,
så receptet fungerar med båda.
Föredrar du MCP: gnubok_get_kpi_report ger samma underlag med fälten i
snake_case (cash_position, total_revenue, total_expenses, months).
Begränsningar
- Runway räknas på bokfört saldo. Banktransaktioner som inte bokförts än syns inte i
cashPosition. - Burn är periodiserade kostnader (klass 4–7) minus intäkter (klass 3). Avskrivningar ingår fast de inte är utbetalningar, och klass 8 (finansiella poster, skatt) ingår inte. Se siffran som en indikator.
- Receptet räknar inte med kommande in- och utbetalningar, till exempel obetalda kundfakturor eller leverantörsskulder.
- Snapshoten från igår ligger i n8n. Vill du ha längre historik, skriv varje körning till ett kalkylark eller en databas.
OAuth-scopes
- reports:read
- transactions:read
accounted-verktyg
- gnubok_get_kpi_report
Vanliga frågor
- Vad händer om bankkopplingen släpar?
- `GET /cash-accounts` returnerar `balance_updated_at` per bankkonto, alltså när banken senast rapporterade saldot via bankkopplingen. Är den äldre än 24 timmar lägger receptet en rad om det i Slack-posten. Tänk på att runway räknas på det bokförda saldot (`cashPosition`): transaktioner som hämtats men inte bokförts syns inte där än.
- Kan jag följa flera bolag?
- Ja. En API-nyckel når alla bolag där nyckelns användare är medlem. `GET /api/v1/companies` (scope `companies:read`) listar dem. Kör flödet en gång per `companyId` och lägg trösklarna per bolag i Code-noden.
- Hur stänger jag av posten på helger?
- Cron-uttrycket `0 8 * * 1-5` kör bara vardagar. Vill du även ha lördagar, ändra till `0 8 * * 1-6`.
- Vad om jag inte har Slack, funkar Discord eller Teams?
- Ja. Sista steget är ett POST-anrop till en webhook. Byt Slack-noden mot en Discord- eller Teams-nod, eller mot en HTTP Request-nod mot valfri webhook. Resten av flödet är detsamma.
- Skickas något känsligt till Slack?
- Nej. Receptet skickar bara aggregerade tal: kassa, burn och runway. Inga transaktioner, kundnamn eller personnummer.
Senast uppdaterad: 27 september 2026