accounted
← Registry

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.

WorkflowLive
Byggt avaccounted· TeamSenast uppdaterad: 27 september 2026

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

  1. Schedule-trigger med cron 0 8 * * 1-5 (vardagar kl 08:00).
  2. GET /api/v1/companies/{companyId}/fiscal-periods: välj räkenskapsåret där dagens datum ligger mellan period_start och period_end.
  3. GET /api/v1/companies/{companyId}/reports/kpi?period_id=…: svaret har bland annat cashPosition (bokfört saldo på 19xx-kontona, eller de konton bolaget valt i nyckeltalsinställningarna), totalRevenue, totalExpenses, period och months[], en rad per månad i räkenskapsåret med income (klass 3), expenses (klass 4–7) och net.
  4. GET /api/v1/companies/{companyId}/cash-accounts: balance_updated_at per bankkonto visar hur färskt bankens saldo är.
  5. En Code-nod räknar runway och jämför med gårdagens värde.
  6. 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.
Nästa steg

Klar att testa själv?

Open är gratis. Open source, ingen bindningstid. Importera SIE4 i tio minuter.