Jämför Bokföring
Teknik

Bokföring i Google Sheets: exportera Fortnox-data 2026

Tre metoder för att få bokföringsdata till Google Sheets: SIE-fil, Fortnox API + Apps Script och no-code via Zapier. Komplett kod ingår.

Av Jämför Bokföring-redaktionen Uppdaterad 2026-04-15

Varför skulle någon vilja ha sin bokföringsdata i Google Sheets? För mig är det tre scenarier som återkommer: du ska ge revisorn en skärpt sammanställning, din styrelse vill ha KPI:er i realtid, eller du bygger ett dashboard där bokföring är en av flera datakällor. I alla tre fallen räcker inte Fortnox-UI.

Den här guiden går igenom tre metoder — från manuell SIE-export till ett automatiserat Google Apps Script som synkar dagligen. Vilken du väljer beror på hur ofta data ska uppdateras och hur mycket kontroll du vill ha.

Varför exportera bokföringsdata?

Konkreta användningsfall:

  • Löpande dashboards — omsättning per månad, kundfordringar per dag, cashflow-prognos
  • Revisionsförberedelse — ge revisorn ett filter- och pivotbart underlag
  • Styrelserapportering — KPI:er som uppdateras per dag utan manuellt jobb
  • Analys utanför Fortnox UI:et — pivot-tabeller, egna formler, kombinera med CRM/e-handelsdata
  • Migrering — om du ska byta bokföringsprogram behöver du få ut datan i strukturerat format

Alla tre metoderna nedan fungerar. Skillnaden är friktion kontra flexibilitet.

Metod 1: SIE-fil (manuell)

SIE är svensk standard för bokföringsexport — alla seriösa svenska bokföringsprogram stödjer SIE 4 (eller senare). Fortnox exporterar via Arkiv → SIE-export.

Så här gör du

  1. I Fortnox: välj Arkiv → Exporter → SIE
  2. Välj räkenskapsår och SIE-typ (SIE 4 rekommenderas)
  3. Ladda ner .se-filen (filändelsen är .se, inte .sie — förvirrande)
  4. Öppna filen i en texteditor — det är plain text med #-prefixade direktiv
  5. Importera till Google Sheets via en parser

SIE-filens struktur:

#FLAGGA 0
#PROGRAM "Fortnox" "1.0"
#FORMAT PC8
#GEN 20260415 "Jämför Bokföring"
#SIETYP 4
#FNAMN "Ditt Bolag AB"
#ORGNR 5560000000
#KPTYP BAS2014
#KONTO 1930 "Bank"
#KONTO 1510 "Kundfordringar"
#VER A 1 20260401 "Faktura #1001"
{
    #TRANS 1510 {} 12500.00
    #TRANS 3010 {} -10000.00
    #TRANS 2611 {} -2500.00
}

Begränsningar: Det är en ögonblicksbild. Vill du ha den uppdaterad får du exportera om varje gång. För ett månatligt revisoruppdrag funkar det utmärkt. För ett dashboard — lämna det.

Parsa SIE i Google Sheets

Google Sheets har ingen inbyggd SIE-parser, men du kan använda Apps Script för att läsa en uppladdad fil:

function importSIE(fileId) {
  const file = DriveApp.getFileById(fileId);
  const content = file.getBlob().getDataAsString('CP437');
  const lines = content.split('\n');

  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  sheet.appendRow(['Verifikat', 'Datum', 'Konto', 'Belopp', 'Text']);

  let currentVer = null;
  let currentDate = null;
  let currentText = null;

  for (const line of lines) {
    if (line.startsWith('#VER')) {
      const m = line.match(/#VER\s+(\S+)\s+(\S+)\s+(\d{8})\s+"([^"]*)"/);
      if (m) {
        currentVer = `${m[1]}-${m[2]}`;
        currentDate = `${m[3].slice(0,4)}-${m[3].slice(4,6)}-${m[3].slice(6,8)}`;
        currentText = m[4];
      }
    } else if (line.startsWith('#TRANS')) {
      const m = line.match(/#TRANS\s+(\d+)\s+\{[^}]*\}\s+([-\d.]+)/);
      if (m) {
        sheet.appendRow([currentVer, currentDate, m[1], parseFloat(m[2]), currentText]);
      }
    }
  }
}

Kör med importSIE('drive-file-id') och du har en läsbar transaktionslista.

Metod 2: API + Google Apps Script (automatiserad)

Det här är metoden jag rekommenderar för dashboard-scenarier. En Apps Script-funktion anropar Fortnox API, drar ner transaktioner/fakturor och skriver till Sheets. Kan schemaläggas via Triggers → Time-driven.

Förutsättningar

  • Ett Fortnox-utvecklarkonto med OAuth2-app registrerad (se Fortnox API-guide)
  • Ett giltigt access_token + refresh_token från Fortnox
  • Ett Google Sheet-dokument

Komplett Google Apps Script

Klistra in det här i Extensions → Apps Script i ditt Google Sheet:

// ---------- Konfiguration ----------
const CLIENT_ID = 'din-client-id';
const CLIENT_SECRET = 'din-client-secret';
const API_BASE = 'https://api.fortnox.se/3';
const OAUTH_URL = 'https://apps.fortnox.se/oauth-v1/token';

// Tokens lagras i Script Properties (säkrare än i koden)
const props = PropertiesService.getScriptProperties();

function getAccessToken() {
  return props.getProperty('fortnox_access_token');
}

function getRefreshToken() {
  return props.getProperty('fortnox_refresh_token');
}

function refreshAccessToken() {
  const refresh = getRefreshToken();
  const auth = Utilities.base64Encode(`${CLIENT_ID}:${CLIENT_SECRET}`);

  const response = UrlFetchApp.fetch(OAUTH_URL, {
    method: 'post',
    headers: { Authorization: `Basic ${auth}` },
    payload: {
      grant_type: 'refresh_token',
      refresh_token: refresh,
    },
    muteHttpExceptions: true,
  });

  const data = JSON.parse(response.getContentText());
  props.setProperty('fortnox_access_token', data.access_token);
  props.setProperty('fortnox_refresh_token', data.refresh_token);
  return data.access_token;
}

function fortnoxGet(path, retry = 0) {
  const token = getAccessToken();
  const response = UrlFetchApp.fetch(`${API_BASE}${path}`, {
    method: 'get',
    headers: {
      Authorization: `Bearer ${token}`,
      Accept: 'application/json',
    },
    muteHttpExceptions: true,
  });

  const code = response.getResponseCode();
  if (code === 401 && retry === 0) {
    refreshAccessToken();
    return fortnoxGet(path, retry + 1);
  }
  if (code === 429) {
    Utilities.sleep(5000);
    return fortnoxGet(path, retry + 1);
  }
  if (code >= 400) {
    throw new Error(`Fortnox-fel ${code}: ${response.getContentText()}`);
  }
  return JSON.parse(response.getContentText());
}

// ---------- Huvudfunktioner ----------
function syncInvoices() {
  const data = fortnoxGet('/invoices?limit=500');
  const invoices = data.Invoices || [];

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Fakturor')
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('Fakturor');

  sheet.clear();
  sheet.appendRow([
    'Dokumentnr', 'Kund', 'Datum', 'Förfallodatum',
    'Belopp', 'Saldo', 'Valuta', 'Status'
  ]);

  const rows = invoices.map(inv => [
    inv.DocumentNumber,
    inv.CustomerName,
    inv.InvoiceDate,
    inv.DueDate,
    parseFloat(inv.Total || 0),
    parseFloat(inv.Balance || 0),
    inv.Currency,
    inv.Balance > 0 ? 'Obetald' : 'Betald',
  ]);

  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, 8).setValues(rows);
  }

  SpreadsheetApp.getActiveSpreadsheet().toast(
    `Synkade ${rows.length} fakturor`,
    'Fortnox sync'
  );
}

function syncCustomers() {
  const data = fortnoxGet('/customers?limit=500');
  const customers = data.Customers || [];

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Kunder')
    || SpreadsheetApp.getActiveSpreadsheet().insertSheet('Kunder');

  sheet.clear();
  sheet.appendRow(['Kundnr', 'Namn', 'Orgnr', 'E-post', 'Telefon']);

  const rows = customers.map(c => [
    c.CustomerNumber,
    c.Name,
    c.OrganisationNumber || '',
    c.Email || '',
    c.Phone || '',
  ]);

  if (rows.length > 0) {
    sheet.getRange(2, 1, rows.length, 5).setValues(rows);
  }
}

function fullSync() {
  syncInvoices();
  syncCustomers();
}

Första körningen

  1. Kör refreshAccessToken() manuellt första gången (efter att du satt initial access_token + refresh_token via Project Settings → Script Properties)
  2. Kör fullSync() och bekräfta att Sheets fylls med data
  3. Ställ in trigger: Triggers → Add Trigger → fullSync → Time-driven → Daily

Nu synkar ditt Google Sheet automatiskt varje dag. Bygg pivot-tabeller, grafer och formler ovanpå.

Metod 3: Zapier eller Make (no-code)

Om du inte vill röra kod alls: Fortnox har officiella connectors i både Zapier och Make (f.d. Integromat).

Zapier

Typisk uppsättning:

  • Trigger: Ny faktura i Fortnox
  • Action: Lägg till rad i Google Sheets

Setup tar 5 minuter via drag-and-drop.

Make

Mer flexibelt än Zapier — kan hantera flera steg och conditional logic. Bra för komplexa flöden typ “om fakturan är över 50 000 SEK, skicka Slack-notis OCH lägg till i Sheets”.

Begränsningar

  • Kostnad: Zapier Pro från ~$30/mån när du går över free tier
  • Latens: 5-15 minuters delay, inte realtid
  • Få fält: No-code-connectors exponerar ofta bara en delmängd av API:et
  • Felsökning: När det går fel är det svårare att förstå varför jämfört med egen kod

För användningsfall där du bara ska flytta tio fakturor/månad: Zapier är fine. Över det: bygg metod 2 istället.

Steg-för-steg: rekommenderat flöde

För de flesta användare med >50 transaktioner/månad:

  1. Registrera Fortnox-utvecklarkonto och OAuth-app (30 min)
  2. Auktorisera din app mot din Fortnox-tenant en gång (10 min)
  3. Spara tokens i Apps Script Properties (5 min)
  4. Kopiera in scriptet ovan och anpassa fälten (15 min)
  5. Schemalägg daglig sync (5 min)
  6. Bygg dashboards ovanpå med Pivot Tables och Charts (valfri tid)

Totalt: ~1 timme uppsättning för permanent synk.

Säkerhet: undvik dataläckage

Några icke-förhandlingsbara punkter:

  • Dela aldrig ditt Google Sheet publikt om det innehåller kunduppgifter, organisationsnummer eller finansiell data. Det klassas som personuppgifter enligt GDPR.
  • Lagra aldrig client_secret eller tokens i själva Sheet-cellerna. Använd Script Properties.
  • Begränsa scopes i Fortnox-appen till minsta nödvändiga — invoice och customer räcker ofta. Undvik bookkeeping om du inte behöver verifikatdata.
  • Revoke-rutin. Om en anställd med tillgång till Sheet slutar — byt API-token.
  • Logga åtkomst. Google Workspace Admin ger dig granulär audit log för Sheet-åtkomst.

För revisors-scenariot är det säkrare att exportera SIE-fil en gång per period (metod 1) än att ge revisorn löpande Sheets-åtkomst.

Om du funderar på att byta bokföringsprogram, se vår guide till att byta bokföringsprogram — SIE-export är huvudverktyget även där.

FAQ

Fungerar det här med Bokio eller Visma istället för Fortnox?

Bokio har ett beta-API med token-auth — mindre anrop/månad men principen är densamma. Visma eEkonomi (som rebrandas till Spiris) har OAuth2-API och fungerar med liknande script. SIE-export finns i alla tre.

Kan jag göra tvåvägs-synk (Sheets → Fortnox)?

Tekniskt ja, men farligt. Det är för lätt att råka skriva över data i Fortnox från en felaktig cell i Sheets. Rekommendation: enkelriktat (Fortnox → Sheets) och skapa/uppdatera fakturor via separata UI-formulär.

Hur mycket data klarar Google Sheets?

10 miljoner celler per dokument. För en tenant med 10 000 fakturor och 20 kolumner = 200 000 celler. Långt under gränsen.

Är det tillåtet enligt bokföringslagen?

Exportera data är inte ett problem. Originalbokföringen ligger kvar i Fortnox (där den måste bevaras i 7 år). Sheets blir en sekundär kopia för analys.

Kan jag använda Excel istället?

Ja — Power Query i Excel kan anropa REST-API:er direkt. Principen är densamma, men syntaxen för autentisering är annorlunda. Apps Script är gratis; Power Query kräver Microsoft 365.

Vad kostar hela setupen?

Noll kronor (om du redan har Fortnox + Google-konto). Apps Script och Sheets är gratis. Fortnox API är gratis. Enda kostnaden är din tid för uppsättningen.


Bokföring i Google Sheets är ett av de enklaste sätten att få kontroll på sin data utanför Fortnox-UI:et. Metod 1 (SIE) är lagom för engångsjobb. Metod 2 (API + Apps Script) är den som faktiskt förändrar hur du jobbar med data. Metod 3 (no-code) är en bra utgångspunkt om du inte skriver kod. Börja smått — synka en sak (fakturor) — och bygg ut därifrån.

Läs vidare