← Dokumentation / Guider
Migrera från ett annat system
Flytta över ett bolags bokföring i ett enda anrop - kontoplan, motparter, ingående balanser eller fullständig historik, öppna fakturor, anläggningstillgångar och lager.
När ett bolag flyttar till Nordlet från ett annat bokföringsprogram börjar inte bokföringen från noll. Importverktyget för historisk bokföring tar allt som det gamla systemet lämnar efter sig och skriver det i ett enda anrop, en enda databastransaktion: om en enda rad misslyckas med en kontroll sparas ingenting. Samma paket kan köras genom en slutpunkt som enbart gör kontroll (check-only), vilken utför alla valideringar och gör en rollback.
POST /v1/migration/books/validate # kontrollerar allt, skriver ingenting
POST /v1/migration/books/import # skriver allt eller ingenting
Webbappen har samma två knappar under Konto → Migrering (klistra in JSON eller ladda upp en fil). API-nyckeln behöver ledger:write samt skrivbehörighet (write scope) för varje sektion som inkluderas (partners:write, catalog:write, sales:write, purchases:write, assets:write, inventory:write). Båda slutpunkterna accepterar anropskroppar på upp till 32 MB.
Brytdatumet
Välj brytdatum (cut-over date): den första dagen som bolaget körs i Nordlet. Allt som sker dessförinnan stannar i det gamla systemet (eller flyttas över som historik, se nedan). Allt från och med den dagen registreras i Nordlet via de vanliga slutpunkterna. Alla belopp i paketet är "per dagen före brytdatumet": den slutliga balansräkningen, de fakturor som fortfarande är obetalda, lagret som finns kvar på hyllan och tillgångarna som finns i anläggningsregistret.
Gör följande i Nordlet innan du importerar:
- Skapa bolaget och tillämpa kontoplanens mall (
ledger/accounts/apply-template) - eller lista de konton du behöver i paketetsaccounts-sektion. - Skapa minst ett lager (
inventory/warehouses/create) om du importerar lager. - Kör paketet genom
migration/books/validatetills det inte rapporterar några fel och du godkänner dess varningar.
Paketet
Varje sektion är valfri; inkludera de som du har data för. Alla referenser mellan sektioner sker med kod (kontokod, motpartskod, artikelkod, anläggningsgruppskod, lagerkod), och en kod kan antingen referera till en post som redan finns i Nordlet eller till en som skapas av en tidigare sektion i samma paket.
{
"cutoverDate": "2026-01-01",
"source": "Rivilė GAMA",
"accounts": [
{ "code": "6210", "name": "Advertising expenses", "type": "expense", "parentCode": "6" }
],
"partners": [
{ "code": "301111222", "name": "UAB Klientas", "vatCode": "LT100001112223", "isCustomer": true },
{ "code": "302222333", "name": "UAB Tiekėjas", "isCustomer": false, "isSupplier": true }
],
"items": [
{ "code": "SKU-1", "name": "Widget", "type": "product", "unit": "vnt", "vatRatePercent": "21" }
],
"assetGroups": [
{ "code": "TRANSP", "name": "Vehicles", "assetAccountCode": "1230", "depreciationAccountCode": "1239",
"defaultUsefulLifeMonths": 60 }
],
"openingBalances": {
"balancingAccountCode": "3410",
"entries": [
{ "accountCode": "2710", "debit": "5000.00" },
{ "accountCode": "2410", "debit": "1500.00" },
{ "accountCode": "2040", "debit": "300.00" },
{ "accountCode": "1230", "debit": "12000.00" },
{ "accountCode": "1239", "credit": "2400.00" },
{ "accountCode": "4430", "credit": "700.00" },
{ "accountCode": "3010", "credit": "10000.00" }
]
},
"openReceivables": [
{ "partnerCode": "301111222", "number": "SF-1050", "issueDate": "2025-12-10", "dueDate": "2026-01-09",
"grossTotal": "1210.00", "vatTotal": "210.00" },
{ "partnerCode": "301111222", "number": "SF-1049", "issueDate": "2025-11-20",
"grossTotal": "500.00", "outstanding": "290.00" }
],
"openPayables": [
{ "partnerCode": "302222333", "documentNumber": "T-77", "documentDate": "2025-12-15", "grossTotal": "700.00" }
],
"fixedAssets": [
{ "groupCode": "TRANSP", "code": "CAR-1", "name": "Delivery van", "acquisitionDate": "2025-01-01",
"acquisitionCost": "12000.00", "accumulatedDepreciation": "2400.00", "depreciatedMonths": 12 }
],
"stock": [
{ "itemCode": "SKU-1", "quantity": "30", "unitCost": "10" }
]
}
Belopp är decimalsträngar, precis som överallt i API:et. source är en fritextetikett som hamnar i beskrivningen för transaktionen med ingående balanser och i anteckningarna för migrerade fakturor.
accounts
Rader för kontoplan: code, name, type (asset, liability, equity, income, expense), valfritt parentCode och isPostable. Konton som redan finns lämnas som de är och räknas som existing. Använd detta när det gamla systemets kontoplan skiljer sig från mallen, eller hoppa över det och tillämpa mallen först.
partners och items
Kunder, leverantörer och artikelregister, sorterade efter code. I Litauen är motpartskoden vanligtvis företagsregistreringsnumret. För privatpersoner används valfri kod som är unik inom bolaget. Befintliga koder hoppas över och uppdateras inte. Artiklar accepterar type (product eller service), unit, barcode, vatRatePercent, salePriceExclVat, purchasePriceExclVat.
openingBalances
Det gamla systemets utgående balansräkning, en rad per konto: accountCode med antingen debit eller credit. Raderna bokförs som en enda verifikation med datumet openingBalances.date (standard är brytdatumet) och verifikationstyp migration_opening. Raderna måste referera till bokföringsmakliga konton.
Verifikationen måste balansera. Om det gamla systemets balansräkning inte gör det - på grund av avrundningar, en vinst som aldrig bokförts mot eget kapital eller ett saknat konto - anger du balancingAccountCode (vanligtvis balanserad vinst/förlust, 3410 i den litauiska mallen) så bokförs differensen där. Svaret rapporterar beloppet som balancingAmount.
Endast en verifikation för ingående balanser får finnas per bolag. En andra import med openingBalances avvisas (409). Korrigeringar i efterhand görs som vanliga manuella verifikationer (ledger/journal/transactions/create); bokförda verifikationer är oföränderliga, så den ursprungliga ligger kvar som den importerades.
journal - fullständig historik i stället för, eller som komplement till, balanser
Om du vill ha det gamla systemets transaktioner i Nordlet (så att rapporter för tidigare perioder fungerar) skickar du dem här: ett objekt per transaktion med date, valfri description och reference, samt entries med accountCode + debit/credit. Varje transaktion måste balansera på egen hand. De bokförs med verifikationstyp migration.
Datum måste ligga före brytdatumet. När paketet även innehåller openingBalances måste historiken vara daterad på eller efter openingBalances.date - det vanliga mönstret är balanser i början av det föregående räkenskapsåret plus det årets transaktioner, med brytdatum den första dagen på det aktuella året. Skicka inte balanser och historik för samma period, eftersom balanserna då skulle räknas dubbelt.
Varje månad som berörs av de ingående balanserna eller historiken måste vara en öppen redovisningsperiod (annars ges 409).
openReceivables och openPayables
Fakturor som fortfarande var obetalda (helt eller delvis) vid brytdatumet. De skapas som utfärdade kundfakturor och registrerade leverantörsfakturor med paidAmount = grossTotal − outstanding, vilket gör att bankavstämning (bank/transactions/match, bank/transactions/suggest-matches), åldersanalysrapporten och betalningswebhooks fungerar på dem precis som på alla andra fakturor.
outstandinghargrossTotalsom standardvärde.vatTotalhar0som standardvärde (momsen härleds).dueDatehar fakturadatumet som standardvärde.currencyhar bolagets fakturavaluta som standardvärde. För alla andra valutor än bolagets basvaluta krävsfxRate- enheter av den valutan per 1 enhet av basvalutau, samma konvention som i resten av API:et - och kursen sparas på fakturan så att senare betalningar beräknar realiserad valutakursdifferens korrekt.- Kundfakturans
numberär det gamla systemets fullständiga nummer och måste vara unikt inom bolaget. Leverantörsfakturor är unika per motpart ochdocumentNumber. - Fakturorna bokförs inte igen: deras fordrings-/skuldsaldo är redan en del av de ingående balanserna. De länkas till verifikationen för ingående balanser, vilket är anledningen till att
openPayableskräveropeningBalancesi samma paket. - Fakturarader importeras inte; fakturan bär endast totalbelopp. Det gamla systemet förblir källan för radinformation och för momsrapporter för perioder före brytdatumet.
Om det gamla systemet spårade kundreskontra utan öppna poster skapar du en faktura per motpart för saldot (till exempel nummer OB-301111222) så att det kan avstämmas.
Nummerserien fortsätter. När ett importerat kundfakturanummer har formen PREFIX-N och dess utfärdandedatum infaller under brytdårets år, sätts nummerserien för det prefixet och året till N + 1 (sänks aldrig). Svaret listar den resulterande numberSeries. För andra fall ställer du in serien själv med reference/series/create ({ documentType: "sale_invoice", prefix, year, startAt }).
assetGroups och fixedAssets
Anläggningstillgångar flyttas över med hittills gjorda avskrivningar: acquisitionCost, salvageValue, accumulatedDepreciation, depreciatedMonths och usefulLifeMonths (eller gruppens standardvärde). Den linjära avskrivningen (assets/depreciation/post) fortsätter från det återstående värdet över de återstående månaderna. Tillgångar vars ackumulerade avskrivning redan motsvarar det avskrivningsbara värdet skapas som fully_depreciated. Ingenting bokförs - anskaffningsvärdet och den ackumulerade avskrivningen är en del av de ingående balanserna.
Grupper identifieras med code och kräver assetAccountCode och depreciationAccountCode (standard för kostnadskonto är 6206).
stock
Lagersaldo per artikel: itemCode, quantity, unitCost (kostnad per enhet i EUR) och valfritt warehouseCode (standard: standardlagret), lotNumber och expiryDate för parti- eller serienummerhanterade artiklar. Varje rad blir en ingående lagerhändelse daterad på brytdatumet med verifikationstyp migration och startar ett FIFO-lagerlager till den kostnaden. Ingenting bokförs - lagervärdet är en del av de ingående balanserna.
Kontroller och varningar
Valideringsslutpunkten misslyckas (422) vid saknade konton, icke bokföringsmakliga konton, ej balanserade transaktioner, okända koder för motpart/artikel/grupp/lager, dubbletter av koder eller nummer i paketet, utestående belopp som överstiger bruttobeloppet, ackumulerad avskrivning som överstiger det avskrivningsbara värdet samt saknade valutakurser. Nummer eller koder som redan finns i Nordlet ger 422/409.
Utöver detta jämför båda slutpunkterna reskontrorna med verifikationsraderna i samma paket och returnerar skillnaderna som warnings (varningar) i stället för fel:
- totalt utestående belopp för
openReceivablesjämfört med saldot på kundfordringskontot (bokföringsregelnsales.receivable, standard är2410); - totalt utestående belopp för
openPayablesjämfört med leverantörsskuldkontot (purchases.payables, standard är4430); - total kostnad för
stockjämfört med lagerkontot (inventory.stock, standard är2040); - per anläggningsgrupp, tillgångarnas anskaffningsvärde jämfört med gruppens anläggningskonto och deras ackumulerade avskrivning jämfört med avskrivningskontot.
En varning innebär att det gamla systemets reskontra och huvudbok inte stämmer överens. Korrigera paketet (eller acceptera skillnaden medvetet) innan du importerar.
Svaret
{
"dryRun": false,
"cutoverDate": "2026-01-01",
"accounts": { "created": 1, "existing": 0 },
"partners": { "created": 2, "existing": 0 },
"items": { "created": 1, "existing": 0 },
"assetGroups": { "created": 1, "existing": 0 },
"openingBalances": { "journalTransactionId": "…", "date": "2026-01-01", "entries": 8,
"debitTotal": "18800.00", "creditTotal": "18800.00", "balancingAmount": "5700.00" },
"journal": { "transactions": 0, "entries": 0 },
"openReceivables": { "created": 2, "outstandingTotal": "1500.00" },
"openPayables": { "created": 1, "outstandingTotal": "700.00" },
"fixedAssets": { "created": 1, "costTotal": "12000.00", "accumulatedDepreciationTotal": "2400.00" },
"stock": { "movements": 1, "costTotal": "300.00" },
"numberSeries": [],
"warnings": []
}
dryRun: true markerar en valideringskörning, varvid journalTransactionId är null. En import registreras i granskningsloggen (audit log) som migration.imported med samma sammanfattning.
Efter importen
- Lås perioderna före brytdatumet (
ledger/periods/lock) så att ingenting bokförs i den migrerade historiken av misstag. - Kontrollera balansräkningen per brytdatumet mot det gamla systemets slutrapporter.
- Fortsätt med det vanliga flödet: utfärda fakturor, importera kontoutdrag, matcha betalningar - de migrerade öppna fakturorna regleras precis som alla andra.
Vad importverktyget inte täcker: fakturarader och momsrapporter för tidigare perioder (behåll dem i det gamla systemet eller dess arkiv), lönelistorik samt andra dokument än fakturor (order, följesedlar, avtal).