MuninMunin
Logg innKom i gang gratis
Home/Journal/Slik migrerer du bort fra HubSpot.
Engineering · 9 min read

Slik migrerer du bort fra HubSpot.

Eksporten er den enkle delen — HubSpot dokumenterer hver eneste av dem. De vanskelige delene er klausulen om automatisk fornyelse, koblingene som bare overlever som CSV-kolonner, og ressursene som aldri var dine å eksportere. En plan du kan kjøre, i den rekkefølgen kalenderen tvinger fram.

Overhead view of a dark desk at night: a cobalt blue document crate with its lid set aside and plain papers half lifted out, beside a keyboard, mug and coiled cable.
Lokket av i mars. Fornyelsen er i oktober.

Nesten alle som forlater HubSpot, oppdager det samme i samme rekkefølge. Først at dataene kommer rent ut — HubSpot dokumenterer hver eksportvei, og det er flere av dem enn du trodde. Deretter at kontrakten slett ikke kommer rent ut, fordi oppsigelse midt i perioden ikke er en ting, og fornyelsesdatoen var for seks uker siden. Migreringen er ikke et teknisk prosjekt med en fotnote om fakturering. Det er et faktureringsprosjekt med en teknisk fotnote, og gjør du det i den rekkefølgen, tar det en ettermiddag med skripting og én kalenderpåminnelse.

Kan du eksportere alle dataene dine fra HubSpot?

Nesten alt, og HubSpot publiserer kartet. Kontakter, firmaer, salg, saker, samtaler, oppgaver, egendefinerte objekter, egenskaper, egenskapshistorikk, kunnskapsbaseartikler, side- og blogg-HTML, filer, HubDB-tabeller, URL-omdirigeringer, skjemainnsendinger, lister og resultater for markedsføringse-post har alle dokumenterte eksportveier, levert som CSV, XLS eller XLSX via en nedlastingslenke på e-post. HubSpots egen eksportindeks er den autoritative lista — den er mer komplett enn noen tredjeparts migreringsveiledning, denne inkludert.

Det du får, er et øyeblikksbilde av nåværende egenskapsverdier pluss koblinger, ikke et levende system. Det skillet er hele migreringen. En kontaktrad ankommer med sin Record ID og hver egenskap du ba om; koblingen til firmaet ankommer som en kolonne med den koblede postens ID og navn. Å bygge grafen opp igjen på den andre siden er en join, ikke en redningsaksjon — men det er en join du må skrive.

Hva er HubSpots eksportgrenser?

De er romslige nok til at de fleste team aldri merker dem, og presise nok til å planlegge rundt. Per september 2026 tillater HubSpot 300 eksporter i et rullerende døgn, med tre som kjører samtidig og resten i kø. CSV-filer over 2 MB ankommer zippet. Filer deles over 1 000 000 rader for CSV og XLSX, og over 65 535 rader for XLS. XLSX stopper på 16 384 kolonner og XLS på 256, som er grunnen til at HubSpot anbefaler CSV for brede eksporter — en konto med hundrevis av egendefinerte egenskaper treffer kolonnetaket før den treffer radtaket.

Tallet som faktisk biter, er det minste: nedlastingslenker utløper etter 30 dager. Eksportloggene er synlige i tre år, men filene bak dem er ikke det. Eksporterer du i januar og bytter over i mars, eksporterer du to ganger.

300
posteksporter per rullerende døgn
30 dager
før en nedlastingslenke utløper
1000
koblede post-ID-er per koblingskolonne, som standard

Hva overlever ikke eksporten?

Tre kategorier, og bare den tredje er et reelt tap. Struktur som aldri var data: arbeidsflyter eksporteres som et regneark med navn, påmeldingstall og endringsdatoer, pluss en PNG per arbeidsflyt — selve logikken er et bilde. Dashbord, rapporter og sekvenser er den samme historien. Atferd festet til HubSpots kjøretid: HubSpot bemerker at skjemaer mister sine betalte funksjoner og at gamle CTA-er slutter å virke når kontoen deaktiveres, så alt som er bygd inn på et eksternt nettsted, må erstattes før du slår av, ikke etter. Historikk med et oppbevaringsvindu: handlingslogger for arbeidsflyter beholder full detalj i 180 dager og overordnet detalj i opptil to år.

Koblinger er den delen folk tar feil av, fordi de ser ut som et tap og ikke er det. Som standard inkluderer en eksport opptil 1000 koblede post-ID-er per koblingskolonne, som holder for kontakter og firmaer og ikke holder for et firma med 3000 kontakter. I eksportdialogen lar Customize deg sette Associations included in export til All associated records — bare for CSV. Sett den før du eksporterer, ikke etter at du finner avkuttingen.

  • Eksporteres rentKontakter, firmaer, salg, saker, samtaler, oppgaver, egendefinerte objekter, egenskaper og egenskapshistorikk, kunnskapsbaseartikler, side- og innlegg-HTML, filer, HubDB, omdirigeringer, skjemainnsendinger, lister, brukere og tillatelser.
  • Eksporteres som en beskrivelseArbeidsflyter — et regneark med navn og tall, pluss en PNG av hver flyt. Dashbord og rapporter eksporterer sitt nåværende resultat, ikke sin definisjon. Sett av tid til gjenoppbygging, ikke til migrering.
  • Eksporteres bare gjennom API-etInnbokssamtaler og salgsaktivitet. HubSpot peker deg mot Conversations- og Engagements-API-ene framfor en knapp; skriv uttrekket før du sier opp, mens tokenet fortsatt virker.
  • Slutter å virke ved deaktiveringInnebygde skjemaer mister betalte funksjoner, gamle CTA-er slutter å virke. Disse bor på sider du styrer, så erstatt dem i forkant av overgangsdatoen.
  • Har en oppbevaringsklokkeHandlingslogger for arbeidsflyter: full detalj i 180 dager, overordnet detalj i to år. Eksportlogger er synlige i tre år; nedlastingslenkene bak dem er det ikke.

Ta kalenderen først, på dag én

HubSpots kundevilkår sier at du ikke kan si opp før inneværende periode er over, og at det ikke gis refusjon for forhåndsbetalte eller ubrukte gebyrer. Abonnementer fornyes automatisk for det korteste av samme varighet som forrige periode eller ett år, så å si opp betyr å slå av automatisk fornyelse i Account & Billing → Subscriptions → Cancel auto-renewal — en handling for Super Admin eller faktureringsadministrator — før fornyelsesdatoen. Nedgraderinger er det samme: nedgradering midt i perioden er ikke tillatt, og HubSpot ber deg ta det opp med en representant minst fem virkedager før fornyelse. Les oppsigelsesartikkelen og vilkårene før du skriver en eneste linje migreringskode.

Når bør du starte migreringen bort fra HubSpot?

Regn bakover fra fornyelsesdatoen, ikke framover fra beslutningen. Å slå av automatisk fornyelse kan reverseres helt fram til ikrafttredelsesdatoen, så den trygge rekkefølgen er: slå den av først, vurder deretter, og slå den på igjen hvis du ombestemmer deg. Å gjøre det i motsatt rekkefølge — vurdere, bestemme, og så oppdage at fornyelsen passerte i uke tre — er slik et seksukersprosjekt blir på fjorten måneder.

En form som fungerer for et team med ettårsperiode: slå av automatisk fornyelse på dag én, kjør eksporten og kartleggingen de neste to ukene, og kjør så begge systemene parallelt til du har sett en hel faktureringssyklus med reelt arbeid lande i det nye. Du betaler for HubSpot i det vinduet uansett, som gjør parallellkjøringen gratis. Det er den ene fordelen med en periode du ikke kan gå ut av tidlig — du kan like gjerne bruke den.

Hvordan får du HubSpot-data inn i Munin?

To veier, og hvilken du tar, avhenger av om du flytter en liste eller en historikk. For kontakter, firmaer og salg slik de står i dag, kartlegg CSV-en mot crm_bulk_create_contacts, som tar opptil 500 kontakter per kall og dedupliserer mot eksisterende e-post og telefon — og mot reservasjonslista, så en ny import ikke kan gjenopplive noen som har reservert seg. For en full graf med pipeliner, faser, aktiviteter og relasjoner intakt, bygg crm_import-nyttelasten i stedet: den lander poster i avhengighetsrekkefølge og returnerer et idMap fra kilde-ID-ene dine til Munins.

Vær klarøyd om formen på arbeidet. Munins importverktøy tar inn Munins eget eksportformat, så å komme fra HubSpot betyr at du skriver kartleggingen selv — det finnes ingen leverandørspesifikk HubSpot-import å klikke på. Det som gjør det til en formiddag framfor et kvartal, er størrelsen på målet: sju posttyper på CRM-siden, ikke de flere hundre egenskapene en HubSpot-portal samler på. Du bestemmer én gang hvilke kolonner som betyr noe, og de du lar ligge, var de ingen filtrerte på uansett. Hver modul har det samme paret — crm_import, kb_import, cms_import, conv_import, outreach_import, analytics_import — og det matchende _export-verktøyet, som er den samme døra brukt i motsatt retning den dagen du vil forlate oss.

pythonmap_contacts.py
import csv

# HubSpot: CRM > Contacts > Export, format CSV,
# Customize > alle egenskaper og koblinger på postene.
rows = list(csv.DictReader(open("hubspot-crm-exports-all-contacts.csv")))

contacts = [
    {
        "name": f"{r['First Name']} {r['Last Name']}".strip(),
        "email": r["Email"] or None,
        "phone": r["Phone Number"] or None,
        "title": r["Job Title"] or None,
        "tags": ["hubspot-import-2026-08"],
        "customFields": {"hubspotRecordId": r["Record ID"]},
    }
    for r in rows
]

# crm_bulk_create_contacts stopper på 500 per kall.
batches = [contacts[i : i + 500] for i in range(0, len(contacts), 500)]

Merk importen, behold den gamle ID-en

To vaner som gjør en skummel enveismigrering til noe du kan angre. Merk hver importert post med partiet (hubspot-import-2026-08), slik at crm_list_contacts({ tag: "..." }) gir deg nøyaktig det settet tilbake. Og behold HubSpots Record ID i customFields — den er nøkkelen for hver oppfølgingsrunde, og den eneste måten å avstemme mot kilden på et halvt år senere når noen spør hvorfor et salgsbeløp ser feil ut.

Hvilken rekkefølge må postene inn i?

Fremmednøkkelrekkefølge, fordi foreldrene må finnes før barna kan peke på dem. crm_import håndterer dette internt — pipeliner, så segmenter, så firmaer, så kontakter, så salg, så aktiviteter, så relasjoner — og returnerer et idMap som kobler hver kilde-ID til ID-en den fikk på denne serveren. Send det kartet med i hvert påfølgende importkall, og avhengige poster finner foreldrene sine automatisk.

Oppdateringene er nøklet slik at det er trygt å kjøre på nytt: pipeliner på slug, segmenter på navn, firmaer på domene med navn som reserve, kontakter på e-post. Salg, aktiviteter og relasjoner får ferske ID-er hver kjøring, med foreldre løst gjennom idMap-et, som er grunnen til at du beholder kartet framfor å lage det på nytt. Samtaler er den ene modulen å kjøre med omtanke: conv_import er idempotent innenfor én migrering via idMap, men meldinger er kun-tilføy og dedupliseres ikke på tvers av separate kjøringer. Importer samtaler én gang, behold kartet, og ta et databasebilde først — samme råd som ved enhver annen masseinnlasting.

jsonccrm_import.jsonc
{
  "name": "crm_import",
  "arguments": {
    "records": {
      "pipelines": [
        { "id": "hs-default", "name": "Salg", "slug": "salg",
          "stages": [
            { "id": "appointmentscheduled", "name": "Møte avtalt",
              "position": 0, "winLoss": "open" },
            { "id": "closedwon", "name": "Vunnet",
              "position": 5, "winLoss": "won" }
          ] }
      ],
      "companies": [
        { "id": "7301442891", "name": "Acme AS", "domain": "acme.no",
          "tags": ["hubspot-import-2026-08"], "customFields": {} }
      ],
      "contacts": [
        { "id": "501993", "name": "Vita Costa", "email": "vita@acme.no",
          "companyId": "7301442891", "tags": ["hubspot-import-2026-08"],
          "customFields": { "hubspotRecordId": "501993" } }
      ],
      "deals": [
        { "id": "18442310", "name": "Acme — fornyelse", "pipelineId": "hs-default",
          "stageId": "appointmentscheduled", "primaryContactId": "501993",
          "companyId": "7301442891", "amountCents": 1200000, "currency": "EUR" }
      ],
      "segments": [], "activities": [], "relationships": []
    }
  }
}
ID-ene i den nyttelasten er HubSpots. De trenger bare å være unike inne i fila — idMap-et gjør resten.

Er markedsføringspakken grunnen til at du er der, så bli

HubSpots markedsføringsautomatisering, mal- og appmarkedsplassen og partnerøkosystemet er genuint dype, og ingenting på denne siden erstatter en kampanjemotor med et tiår med oppsamlede integrasjoner bak seg. Er det den maskinen som driver omsetningen din, er det å migrere bort fra den en nedgradering forkledd som en besparelse. Kjøp fornyelsen.

Munin er trekket for et annet team: ett som vil ha CRM, samtaler, kunnskapsbase, CMS, utgående kontakt og analyse på én Postgres og én kundepost, priset flatt i stedet for per sete og per markedsføringskontakt, under en lisens som lar dem kjøre hele greia selv. Er grunnen til at du ser deg om, at regningen vokser hver gang databasen gjør det, så er migreringen ovenfor hele prosjektet.

Hvordan ser stabelen ut på den andre siden?

Mindre, og drevet annerledes. De seks modulene deler ett skjema, så en kontakt er én rad framfor seks synkroniserte kopier, og en sletteforespørsel har ett sted å lande. Det finnes ingen måler per sete og ingen nivå for markedsføringskontakter: Munin Cloud Free er 0 € i måneden med 5000 MCP-kall, 250 kontakter og 100 MB, og selvdrift under MIT er docker compose up uten lisensavgift i det hele tatt.

Driftsmodellen er den delen det er verdt å planlegge for. Munin eksponerer mer enn 200 MCP-verktøy på ett endepunkt, så det som erstatter å klikke seg gjennom et dashbord, er en MCP-klient — Claude Code, Claude Desktop, ChatGPT, Cursor eller en kjører du skriver selv — som ber om resultatet og viser deg skrivingen før den skjer. Team som kommer fra HubSpot og venter en skjerm-for-skjerm-erstatning, får omstillingen; team som kommer fordi de vil at CRM-et skal fylle seg selv ut fra samtaler de allerede hadde, pleier å være produktive i første uke. Bestem hvilken av dem dere er før du planlegger overgangen, for det endrer hvem på teamet som må være i rommet.

  • 01Slå av automatisk fornyelse først. Det kan reverseres fram til ikrafttredelsesdatoen; fornyelsesdatoen kan ikke.
  • 02Eksporter med Customize → alle egenskaper og koblinger, CSV, All associated records. Ikke standardvisningen.
  • 03Skriv API-uttrekkene for innbokssamtaler og salgsaktivitet mens tokenet fortsatt virker.
  • 04Erstatt innebygde skjemaer og gamle CTA-er på dine egne sider før deaktiveringsdatoen.
  • 05Importer i fremmednøkkelrekkefølge, send idMap-et med, merk partiet, behold HubSpots Record ID.
  • 06Kjør begge systemene i én hel faktureringssyklus. Du betaler for perioden uansett.
  • 07Eksporter på nytt nær overgangen. Nedlastingslenkene fra måned én har utløpt.

Ofte stilte spørsmål

Hvordan eksporterer jeg alle dataene mine fra HubSpot? Det finnes ingen enkelt knapp. HubSpot vedlikeholder en eksportindeks som dekker poster, egenskaper, kunnskapsbaseartikler, side- og innlegg-HTML, filer, HubDB, skjemaer, lister og rapportering, hver med sin egen vei. Poster eksporteres fra objektets listevisning via Export; hver fil ankommer som en nedlastingslenke på e-post som utløper etter 30 dager.

Kan jeg si opp HubSpot midt i kontrakten? Nei. HubSpots kundevilkår sier at du ikke kan si opp før inneværende periode er over, og det gis ingen refusjon for forhåndsbetalte eller ubrukte gebyrer. Du slår av automatisk fornyelse i Account & Billing slik at abonnementet ender på fornyelsesdatoen, og deretter faller kontoen ned til HubSpots gratisverktøy. Nedgraderinger følger samme regel og bør tas opp minst fem virkedager før fornyelse.

Inkluderer HubSpot-eksporter koblingene mellom kontakter, firmaer og salg? Ja, som kolonner. Hvert koblet objekt får sin egen kolonne med koblede post-ID-er og navn, som standard begrenset til 1000 ID-er per kolonne. Å velge All associated records under Customize i eksportdialogen fjerner grensen, og er bare tilgjengelig for CSV-filer.

Hva kan jeg ikke eksportere fra HubSpot? Arbeidsflytlogikk, dashbord, rapporter og sekvenser — du kan eksportere et regneark som beskriver arbeidsflytene dine og et PNG-bilde av hver av dem, men ikke selve automatiseringen. Innbokssamtaler og salgsaktivitet kommer ut gjennom Conversations- og Engagements-API-ene framfor en knapp. Sett av tid til gjenoppbygging av disse framfor til migrering.

Hvor lang tid tar det å migrere fra HubSpot til Munin? Selve dataarbeidet tar typisk en dag eller to: eksporter, skriv kolonnekartleggingen, kjør crm_bulk_create_contacts i partier på 500 eller bygg en crm_import-nyttelast, og verifiser så tallene. Kalenderen er det som tar lengst tid — automatisk fornyelse må sies opp før fornyelsesdatoen din, og å kjøre begge systemene parallelt i én faktureringssyklus er steget som fanger opp det CSV-en ikke bar med seg.

Finnes det et gratis CRM jeg kan migrere til fra HubSpot? Flere. Munin Cloud Free er 0 € i måneden, EU-hostet, og inkluderer CRM, samtaler, kunnskapsbase, CMS, utgående kontakt og analyse; selvdrift under MIT er gratis i enhver skala. Twenty, EspoCRM og SuiteCRM er alternativer som bare er CRM — sammenlikningen lisens for lisens ligger her.

Kortversjonen

  • HubSpot dokumenterer en eksportvei for nesten alt, og dataene kommer rent ut. Start med eksportindeksen, ikke en tredjeparts veiledning.
  • Oppsigelse midt i perioden er ikke tillatt, og det gis ingen refusjon for ubrukte gebyrer. Slå av automatisk fornyelse på dag én — det kan reverseres fram til ikrafttredelsesdatoen.
  • Sett Customize → alle egenskaper og koblinger → All associated records før du eksporterer, ellers kuttes koblingskolonnene ved 1000 ID-er.
  • Nedlastingslenker utløper etter 30 dager, så en migrering som spenner over to måneder betyr at du eksporterer to ganger.
  • Arbeidsflyter, dashbord og sekvenser eksporteres som beskrivelser, ikke definisjoner. Innboks- og aktivitetsdata kommer gjennom Conversations- og Engagements-API-ene.
  • Inn i Munin: kartlegg CSV-en mot crm_bulk_create_contacts i partier på 500, eller bygg en crm_import-nyttelast og send det returnerte idMap-et med. Merk partiet og behold HubSpots Record ID som koblingsnøkkel.
  • På den andre siden: seks moduler på én Postgres, over 200 MCP-verktøy på ett endepunkt, Cloud Free til 0 € i måneden, og MIT-selvdrift med docker compose up.

Vil du ha et sted å lande CSV-en, er Munin Cloud gratis og EU-hostet, og de samme verktøyene som importerer HubSpot-dataene dine, vil eksportere dem igjen den dagen du vil et annet sted.

Å migrere bort fra HubSpot er et kalenderproblem i et dataproblems klær.

Kjell Rune Monsø, gründer.