Je migreert naar Odoo zonder historie te verliezen door stamdata en openstaande transacties te importeren, openingsbalansen binnen te brengen in plaats van oude journalen, en de afgesloten historie buiten Odoo leesbaar te houden.
Je verlaat een oud systeem en gaat live op Odoo. Iemand exporteert alles naar spreadsheets, je begint met importeren, en de ellende begint. Producten importeren prima, maar de verkooporders mislukken omdat de klanten er nog niet in staan. Je draait een bestand opnieuw om een typefout te herstellen en nu is er van elk contact een dubbele. Dan vraagt de accountant waar de klantsaldi zijn gebleven, en je beseft dat niemand heeft beslist wat "historie" hier eigenlijk betekent.
Dit is geen Odoo-probleem. Het is een planningsprobleem. Een migratie gaat mis als mensen het behandelen als één grote kopieerklus in plaats van een reeks met afhankelijkheden. Beslis vooraf wat je op dag één echt nodig hebt, importeer het in de juiste volgorde met stabiele koppelingen, en breng saldi in plaats van jaren ruwe grootboekdata. Doe dat en de go-live verloopt rustig. Sla het over en je bent de eerste maand bezig met opruimen.
Waarom het gebeurt
De meeste mislukte migraties delen dezelfde grondoorzaak: geen beslissing over omvang en volgorde voordat het eerste bestand erin gaat.
Twee dingen sturen dit. Ten eerste zijn records in Odoo van elkaar afhankelijk. Een order heeft eerst een klant en een product nodig. Een product heeft eerst zijn categorie nodig. Importeer in de verkeerde volgorde en de koppelingen hebben niets om naar te wijzen. Ten tweede klinkt "migreer de data" als één taak, maar het zijn eigenlijk drie verschillende klussen met verschillende regels: stamdata die je voor altijd houdt, openstaande posten waar je nog mee moet werken, en historie die je misschien alleen hoeft terug te kijken. Behandel ze hetzelfde en je verzuipt in oude data of verliest de cijfers die je accountant nodig heeft.
De oplossing is een plan dat drie vragen beantwoordt voordat iemand een CSV aanraakt: wat te migreren, in welke volgorde, en hoe records gekoppeld blijven over herimports heen.
De oplossing, in genummerde stappen
Splits je data in drie bakken
Sorteer wat je hebt in drie groepen voordat je iets exporteert, want elke groep wordt anders behandeld.
- Stamdata. De dingen die je elke dag opnieuw gebruikt: contacten, producten, productcategorieën, grootboekschema, btw-codes, betalingsvoorwaarden, maateenheden. Dit houd je voor altijd, dus het moet schoon en compleet zijn.
- Openstaande transacties. Werk dat op de go-livedag nog loopt: onbetaalde klantfacturen, onbetaalde leveranciersfacturen, nog niet geleverde verkooporders, nog niet ontvangen inkooporders, voorraad die je fysiek in huis hebt. Hier moet je in Odoo mee kunnen werken, dus die komen over als echte documenten of saldi.
- Historie. Alles wat al is afgesloten: betaalde facturen van drie jaar geleden, geleverde orders, oude journaalposten. Je doet hier zelden iets mee. Je zoekt het alleen op. Dus meestal importeer je het helemaal niet (meer daarover in stap 4).
Schrijf de bakken op en beslis per type of het binnenkomt. De standaard voor afgesloten historie is: "laat het in het oude systeem, houd dat een paar jaar alleen-lezen".
Geef elk record een stabiele External ID
Voeg in elk importbestand helemaal links een kolom toe met de naam id en zet daar voor elke rij een uniek label zonder spaties in, bijvoorbeeld partner_acme_nl of prod_chair_oak. Dit is de External ID van het record, de stabiele teksthandle die Odoo naast het record opslaat.
Deze ene kolom doet twee dingen. Hij laat andere bestanden naar dit record verwijzen (een verkooporder kan partner_acme_nl als klant refereren), en hij maakt de import veilig te herhalen. Importeer hetzelfde bestand opnieuw en Odoo matcht op de External ID en werkt het bestaande record bij in plaats van een tweede aan te maken. Zonder de kolom maakt elke herhaling duplicaten.
Importeer in afhankelijkheidsvolgorde, ouders eerst
Sorteer je bestanden zo dat alles waarnaar verwezen wordt eerder wordt geïmporteerd dan het bestand dat ernaar verwijst. Voor de meeste bedrijven is de volgorde:
- Grootboekschema, btw, betalingsvoorwaarden (vaak al ingericht door de boekhoudlokalisatie, dus controleer vóór de import)
- Productcategorieën, daarna producten
- Contacten en bedrijven
- Openstaande verkooporders en inkooporders
- Openstaande facturen en leveranciersfacturen
- Openingsbalansen (zie stap 4)
- Beginvoorraad-aantallen
Om een koppeling te vullen, geef je de kolom een naam met het achtervoegsel /id en zet je de External ID van de ouder als waarde. Een contact in Nederland krijgt een country_id/id-kolom met base.nl. Een verkooporder krijgt partner_id/id met partner_acme_nl. De /id vertelt Odoo exact op de External ID te matchen in plaats van te gokken op naam. Importeer van boven naar beneden en de fouten "geen overeenkomend record" verschijnen niet, want elke ouder bestaat al.
Breng openingsbalansen binnen, niet het volledige grootboek
Dit is de beslissing die de meeste tijd bespaart en de meeste mensen in de war brengt. Je hoeft geen jaren aan betaalde facturen opnieuw te importeren om een correcte boekhouding in Odoo te hebben. Je hebt de openingsbalansen nodig: waar elke rekening op de overgangsdatum stond.
Maak één openingsboeking in een diverse journaal met je startdatum als datum. Elke grootboekrekening krijgt een regel voor het eindsaldo uit het oude systeem. Voeg debiteuren en crediteuren niet samen: boek één regel per openstaande klantfactuur en per openstaande leveranciersfactuur, elk met de relatie erbij, zodat Odoo de betaling er later tegen kan afstemmen als het geld binnenkomt. Een sluitrekening (vaak Openingsbalans Eigen Vermogen genoemd, of een winstreserve-rekening) vangt het verschil op, zodat de totale debet gelijk is aan de totale credit.
Het resultaat is correcte saldi op elke rekening, elke openstaande factuur live en afstembaar, en geen enkel afgesloten historisch document dat de database vervuilt. De afweging is eerlijk: gedetailleerde historie blijft in het oude systeem, dus houd dat een paar jaar alleen-lezen toegankelijk. In veel landen dekt een standaard audit-export het juridische deel van die historie. In Nederland leveren we per afgesloten jaar een XAF-auditbestand aan; belastingdienst en accountants lezen die rechtstreeks, wat de export een veel goedkoper antwoord maakt dan het migreren van het grootboek ooit is. Voor vrijwel elke mid-marketmigratie is dit de juiste keuze. Volledige grootboekhistorie kopiëren is traag, foutgevoelig en zelden de moeite waard.
Valideer voordat je erop vertrouwt
Een import die zonder fouten draait, is niet hetzelfde als een correcte import. Controleer na elke grote stap aantallen en totalen, geen onderbuikgevoel.
- Stamdata: het aantal rijen in is gelijk aan het aantal records in Odoo. Steekproef tien records op correcte koppelingen (categorie, land, btw).
- Openstaande facturen: het totaal openstaande debiteurensaldo in Odoo is gelijk aan de ouderdomsanalyse debiteuren van het oude systeem op de overgangsdatum. Hetzelfde geldt voor crediteuren.
- Openingsbalansen: de proefbalans in Odoo op de startdatum is gelijk aan de afsluitende proefbalans uit het oude systeem. Sluit het niet, zoek dan het verschil voordat je live gaat.
- Voorraad: het aantal op locatie per product komt overeen met de fysieke telling of het voorraadrapport van het oude systeem.
Geef alleen je akkoord als de totalen kloppen. Die ene afstemming is wat de accountant Odoo vanaf dag één laat vertrouwen.
Het stuk waar mensen over struikelen
Een paar dingen overkomen vrijwel iedereen
Refereer ingebouwde records, importeer ze niet. Landen, valuta's, het bedrijf en vaak ook het grootboekschema en de btw worden met de Odoo-lokalisatie meegeleverd. Ze hebben al External IDs zoals base.nl. Daar verwijs je met /id naar, je laadt ze niet opnieuw. Zet de ontwikkelaarsmodus aan en zoek ze op onder Instellingen > Technisch > Externe identificaties.
Een halfklare ouderimport levert wezen op. Als een contactenbestand een fout geeft bij rij 300 van 1000, bestaan de eerste 299 wel en de rest niet. Het ordersbestand dat naar de ontbrekende 701 verwijst, mislukt dan. Bevestig altijd dat een ouderimport netjes is afgerond voordat je aan de kindimport begint.
Openingsfacturen zijn saldi, geen nieuwe verkopen. Als je openstaande klantfacturen importeert voor het saldo, mogen ze geen levering opnieuw activeren, geen voorraad opnieuw afboeken en geen automatische e-mails afvuren. Breng ze binnen als boekstukken op de overgangsdatum, of als openingsboekingsregels per relatie. Beslis dit samen met je accountant vóór de import, want duizend per ongeluk aangemaakte leveringsorders terugdraaien is geen pretje.
Datums en de boekjaarvergrendeling. Openingsboekingen horen op de overgangsdatum binnen een open periode. Als je het vorige jaar in Odoo al hebt vergrendeld, kun je er niet in boeken. Stel je vergrendeldatums in nadat de openingsboeking erin staat en is afgestemd, niet ervoor.
Schoon de data vooraf op, niet achteraf. Een migratie is hét moment om dode contacten en verouderde producten gratis te schrappen. Opschonen in de spreadsheet vóór de import is tien keer sneller dan achteraf live records opschonen. Sleep geen rommel mee.
Snelle checklist
- Data verdeeld over drie bakken: stamdata, openstaande transacties, historie.
- Een beslissing per type over wat er binnenkomt; afgesloten historie blijft alleen-lezen in het oude systeem.
- Elk bestand heeft een
id-kolom helemaal links met per rij een unieke External ID zonder spaties. - Koppelingen gebruiken het achtervoegsel
/iden verwijzen naar de External ID van een ouder; ingebouwde records worden gerefereerd, niet geïmporteerd. - Bestanden worden geïmporteerd met ouders eerst: rekeningen en btw, categorieën, producten, contacten, openstaande orders, openstaande facturen, openingsbalansen, voorraad.
- Openingsbalansen geboekt als één diverse boeking, één regel per openstaande factuur met de relatie erbij, sluitend gemaakt met een opening-/winstreserve-rekening.
- Totalen na elke stap afgestemd: proefbalans, ouderdomsanalyse debiteuren en crediteuren, voorraad op locatie.
FAQ
Welke data moet ik migreren bij de overstap naar Odoo?
Sorteer het in drie bakken. Migreer stamdata (contacten, producten, categorieën, grootboekschema, btw) omdat je die elke dag gebruikt. Migreer openstaande transacties (onbetaalde facturen, niet-geleverde orders, huidige voorraad) omdat je er nog mee moet werken. Migreer afgesloten historie meestal niet (betaalde facturen, oude journaalposten); houd het oude systeem alleen-lezen om het op te zoeken.
Moet ik al mijn historische facturen in Odoo importeren?
Nee. Voor een correcte boekhouding heb je alleen openingsbalansen op de overgangsdatum en de openstaande (onbetaalde) facturen nodig. Afgesloten, betaalde facturen zijn historie. Ze importeren voegt risico en rommel toe voor weinig nut. Houd het oude systeem een paar jaar alleen-lezen toegankelijk als je detail wilt opzoeken.
In welke volgorde moet ik data in Odoo importeren?
Ouders vóór kinderen. Eerst grootboekschema en btw, dan productcategorieën en producten, dan contacten, dan openstaande orders, dan openstaande facturen, dan openingsbalansen, dan beginvoorraad. Elk record waar een /id-kolom naar verwijst, moet bestaan voordat het bestand dat ernaar verwijst wordt gedraaid.
Hoe importeer ik openingsbalansen in Odoo?
Maak één boeking in een diverse journaal met je startdatum als datum. Voeg per grootboekrekening een regel toe voor het eindsaldo, en voor debiteuren en crediteuren een regel per openstaande factuur met de relatie erbij, zodat het later kan worden afgestemd. Maak de boeking sluitend met een rekening Openingsbalans Eigen Vermogen of winstreserve, zodat de totale debet gelijk is aan de totale credit.
Hoe voorkom ik dubbele records als ik een bestand opnieuw in Odoo importeer?
Voeg helemaal links een id-kolom toe met voor elke rij een unieke External ID. Bij een tweede import matcht Odoo op die External ID en werkt het bestaande record bij in plaats van een nieuw aan te maken. Zonder de id-kolom maakt elke herhaling duplicaten.
Hoe controleer ik of mijn Odoo-migratie correct was?
Stem totalen af, niet je onderbuikgevoel. De proefbalans in Odoo op de startdatum moet gelijk zijn aan de afsluitende proefbalans van het oude systeem. De totalen van openstaande debiteuren en crediteuren moeten overeenkomen met de oude ouderdomsanalyses. De voorraad op locatie per product moet overeenkomen met de fysieke telling. Geef pas je akkoord als de totalen kloppen.