MuninMunin
Log indKom gratis i gang
Home/Journal/Sådan migrerer du væk fra HubSpot.
Engineering · 9 min read

Sådan migrerer du væk fra HubSpot.

Eksporten er den nemme del — HubSpot dokumenterer hver eneste af dem. Det svære er klausulen om automatisk fornyelse, forbindelserne der kun overlever som CSV-kolonner, og de aktiver der aldrig var dine at eksportere. En plan du kan køre, i den rækkefølge kalenderen tvinger frem.

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.
Låget af i marts. Fornyelsen er i oktober.

Næsten alle, der forlader HubSpot, opdager det samme i samme rækkefølge. Først at data kommer rent ud — HubSpot dokumenterer hver eksportvej, og der er flere af dem, end du troede. Dernæst at kontrakten slet ikke kommer rent ud, fordi opsigelse midt i perioden ikke er en ting, og fornyelsesdatoen var for seks uger siden. Migreringen er ikke et teknisk projekt med en fodnote om fakturering. Det er et faktureringsprojekt med en teknisk fodnote, og gør du det i den rækkefølge, tager det en eftermiddag med scripting og én kalenderpåmindelse.

Kan du eksportere alle dine data fra HubSpot?

Næsten det hele, og HubSpot offentliggør kortet. Kontakter, firmaer, aftaler, sager, opkald, opgaver, egne objekter, egenskaber, egenskabshistorik, videnbaseartikler, side- og blog-HTML, filer, HubDB-tabeller, URL-omdirigeringer, formularindsendelser, lister og resultater for markedsføringsmails har alle dokumenterede eksportveje, leveret som CSV, XLS eller XLSX via et downloadlink på mail. HubSpots eget eksportindeks er den autoritative liste — den er mere komplet end nogen tredjeparts migreringsvejledning, denne inklusive.

Det, du får, er et øjebliksbillede af nuværende egenskabsværdier plus forbindelser, ikke et levende system. Den skelnen er hele migreringen. En kontaktrække ankommer med sit Record ID og hver egenskab, du bad om; forbindelsen til firmaet ankommer som en kolonne med den forbundne posts ID og navn. At genopbygge grafen på den anden side er en join, ikke en redningsaktion — men det er en join, du skal skrive.

Hvad er HubSpots eksportgrænser?

De er rundhåndede nok til, at de fleste teams aldrig bemærker dem, og præcise nok til at planlægge omkring. Per september 2026 tillader HubSpot 300 eksporter i et rullende døgn, med tre kørende samtidig og resten i kø. CSV-filer over 2 MB ankommer zippede. Filer deles over 1.000.000 rækker for CSV og XLSX, og over 65.535 rækker for XLS. XLSX stopper ved 16.384 kolonner og XLS ved 256, hvilket er grunden til, at HubSpot anbefaler CSV til brede eksporter — en konto med hundredvis af egne egenskaber rammer kolonneloftet, før den rammer rækkeloftet.

Tallet, der rent faktisk bider, er det mindste: downloadlinks udløber efter 30 dage. Eksportlogfilerne er synlige i tre år, men filerne bag dem er ikke. Eksporterer du i januar og skifter over i marts, eksporterer du to gange.

300
posteksporter per rullende døgn
30 dage
før et downloadlink udløber
1.000
forbundne post-ID'er per forbindelseskolonne, som standard

Hvad overlever ikke eksporten?

Tre kategorier, og kun den tredje er et reelt tab. Struktur der aldrig var data: arbejdsgange eksporteres som et regneark med navne, tilmeldingstal og ændringsdatoer, plus en PNG per arbejdsgang — selve logikken er et billede. Dashboards, rapporter og sekvenser er den samme historie. Adfærd hæftet på HubSpots kørselstid: HubSpot bemærker, at formularer mister deres betalte funktioner, og at gamle CTA'er holder op med at virke, når kontoen deaktiveres, så alt, der er indlejret på et eksternt websted, skal udskiftes, før du slukker, ikke bagefter. Historik med et opbevaringsvindue: handlingslogfiler for arbejdsgange beholder fuld detalje i 180 dage og overordnet detalje i op til to år.

Forbindelserne er den del, folk tager fejl af, fordi de ligner et tab og ikke er det. Som standard inkluderer en eksport op til 1.000 forbundne post-ID'er per forbindelseskolonne, hvilket er fint for kontakter og firmaer og ikke fint for et firma med 3.000 kontakter. I eksportdialogen lader Customize dig sætte Associations included in export til All associated records — kun for CSV. Sæt den, før du eksporterer, ikke efter du finder afkortningen.

  • Eksporteres rentKontakter, firmaer, aftaler, sager, opkald, opgaver, egne objekter, egenskaber og egenskabshistorik, videnbaseartikler, side- og indlægs-HTML, filer, HubDB, omdirigeringer, formularindsendelser, lister, brugere og rettigheder.
  • Eksporteres som en beskrivelseArbejdsgange — et regneark med navne og tal, plus en PNG af hvert flow. Dashboards og rapporter eksporterer deres nuværende resultat, ikke deres definition. Afsæt tid til genopbygning, ikke til migrering.
  • Eksporteres kun gennem API'etIndbakkesamtaler og salgsaktivitet. HubSpot peger dig mod Conversations- og Engagements-API'erne frem for en knap; skriv udtrækket, før du siger op, mens token stadig virker.
  • Holder op med at virke ved deaktiveringIndlejrede formularer mister betalte funktioner, gamle CTA'er holder op med at virke. De bor på sider, du styrer, så udskift dem forud for overgangsdatoen.
  • Har et opbevaringsurHandlingslogfiler for arbejdsgange: fuld detalje i 180 dage, overordnet detalje i to år. Eksportlogfiler er synlige i tre år; downloadlinkene bag dem er ikke.

Tag kalenderen først, på dag ét

HubSpots kundevilkår siger, at du ikke må opsige, før din nuværende periode udløber, og at der ikke gives refusion for forudbetalte eller ubrugte gebyrer. Abonnementer fornys automatisk for det korteste af samme varighed som din forrige periode eller ét år, så at opsige betyder at slå automatisk fornyelse fra 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 tilladt, og HubSpot beder dig tage det op med en repræsentant mindst fem hverdage før fornyelse. Læs opsigelsesartiklen og vilkårene, før du skriver en eneste linje migreringskode.

Hvornår skal du begynde at migrere væk fra HubSpot?

Regn baglæns fra fornyelsesdatoen, ikke frem fra beslutningen. At slå automatisk fornyelse fra kan fortrydes helt frem til ikrafttrædelsesdatoen, så den sikre rækkefølge er: slå den fra først, evaluer derefter, og slå den til igen, hvis du skifter mening. At gøre det i den omvendte rækkefølge — evaluere, beslutte, og så opdage at fornyelsen passerede i uge tre — er måden, et seksugersprojekt bliver til fjorten måneder.

En form, der virker for et team med etårig periode: slå automatisk fornyelse fra på dag ét, kør eksporten og kortlægningen de følgende fjorten dage, og kør derefter begge systemer parallelt, indtil du har set en hel faktureringscyklus med rigtigt arbejde lande i det nye. Du betaler for HubSpot i det vindue alligevel, hvilket gør parallelkørslen gratis. Det er den ene fordel ved en periode, du ikke kan forlade i utide — du kan lige så godt bruge den.

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

To veje, og hvilken du tager afhænger af, om du flytter en liste eller en historik. For kontakter, firmaer og aftaler, som de står i dag, kortlæg CSV'en mod crm_bulk_create_contacts, som tager op til 500 kontakter per kald og fjerner dubletter mod eksisterende e-mail og telefon — og mod frabedelseslisten, så en ny import ikke kan genoplive nogen, der har frabedt sig. For en fuld graf med pipelines, faser, aktiviteter og relationer intakte, byg crm_import-nyttelasten i stedet: den lander poster i afhængighedsrækkefølge og returnerer et idMap fra dine kilde-ID'er til Munins.

Vær klarøjet om arbejdets form. Munins importværktøjer tager Munins eget eksportformat ind, så at komme fra HubSpot betyder, at du skriver kortlægningen selv — der findes ingen leverandørspecifik HubSpot-import at klikke på. Det, der gør det til en formiddag frem for et kvartal, er målets størrelse: syv posttyper på CRM-siden, ikke de flere hundrede egenskaber, en HubSpot-portal samler sammen. Du beslutter én gang, hvilke kolonner der betyder noget, og dem du lader ligge, var dem ingen filtrerede på alligevel. Hvert modul har det samme par — crm_import, kb_import, cms_import, conv_import, outreach_import, analytics_import — og det matchende _export-værktøj, som er den samme dør brugt i den anden retning den dag, du vil forlade os.

pythonmap_contacts.py
import csv

# HubSpot: CRM > Contacts > Export, format CSV,
# Customize > alle egenskaber og forbindelser på posterne.
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 ved 500 per kald.
batches = [contacts[i : i + 500] for i in range(0, len(contacts), 500)]

Mærk importen, behold det gamle ID

To vaner, der gør en skræmmende envejsmigrering til noget, du kan fortryde. Mærk hver importeret post med partiet (hubspot-import-2026-08), så crm_list_contacts({ tag: "..." }) giver dig præcis det sæt tilbage. Og behold HubSpots Record ID i customFields — det er join-nøglen for hver opfølgningsrunde og den eneste måde at afstemme mod kilden et halvt år senere, når nogen spørger, hvorfor et aftalebeløb ser forkert ud.

I hvilken rækkefølge skal posterne ind?

Fremmednøglers rækkefølge, fordi forældrene skal findes, før børnene kan pege på dem. crm_import håndterer det internt — pipelines, så segmenter, så firmaer, så kontakter, så aftaler, så aktiviteter, så relationer — og returnerer et idMap, der forbinder hvert kilde-ID med det ID, det fik på denne server. Træk det kort igennem hvert efterfølgende importkald, så finder afhængige poster deres forældre automatisk.

Opdateringerne er nøglet, så det er sikkert at køre igen: pipelines på slug, segmenter på navn, firmaer på domæne med navn som reserve, kontakter på e-mail. Aftaler, aktiviteter og relationer får friske ID'er hver kørsel, med forældre løst gennem idMap, hvilket er grunden til, at du beholder kortet frem for at lave det igen. Samtaler er det ene modul at køre med omtanke: conv_import er idempotent inden for én migrering via idMap, men beskeder er kun-tilføj og dublettrenses ikke på tværs af separate kørsler. Importér samtaler én gang, behold kortet, og tag et databasebillede først — samme råd som ved enhver anden masseindlæsning.

jsonccrm_import.jsonc
{
  "name": "crm_import",
  "arguments": {
    "records": {
      "pipelines": [
        { "id": "hs-default", "name": "Salg", "slug": "salg",
          "stages": [
            { "id": "appointmentscheduled", "name": "Møde aftalt",
              "position": 0, "winLoss": "open" },
            { "id": "closedwon", "name": "Vundet",
              "position": 5, "winLoss": "won" }
          ] }
      ],
      "companies": [
        { "id": "7301442891", "name": "Acme ApS", "domain": "acme.dk",
          "tags": ["hubspot-import-2026-08"], "customFields": {} }
      ],
      "contacts": [
        { "id": "501993", "name": "Vita Costa", "email": "vita@acme.dk",
          "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'erne i den nyttelast er HubSpots. De skal kun være unikke inde i filen — idMap klarer resten.

Er markedsføringspakken grunden til, at du er der, så bliv

HubSpots markedsføringsautomatisering, dens skabelon- og appmarkedsplads og dens partnerøkosystem er genuint dybe, og intet på denne side erstatter en kampagnemotor med et årti af opsamlede integrationer bag sig. Er det den maskine, der driver din omsætning, er det en nedgradering forklædt som en besparelse at migrere væk fra den. Køb fornyelsen.

Munin er trækket for et andet team: et der vil have CRM, samtaler, videnbase, CMS, udgående kontakt og analyse på én Postgres og én kundepost, prissat fladt i stedet for per plads og per markedsføringskontakt, under en licens der lader dem køre det hele selv. Er grunden til, at du kigger dig om, at regningen vokser, hver gang databasen gør det, så er migreringen ovenfor hele projektet.

Hvordan ser stakken ud på den anden side?

Mindre, og drevet anderledes. De seks moduler deler ét skema, så en kontakt er én række frem for seks synkroniserede kopier, og en sletteanmodning har ét sted at lande. Der er ingen måler per plads og intet niveau for markedsføringskontakter: Munin Cloud Free er 0 € om måneden med 5.000 MCP-kald, 250 kontakter og 100 MB, og selvdrift under MIT er docker compose up uden licensgebyr overhovedet.

Driftsmodellen er den del, der er værd at planlægge efter. Munin eksponerer mere end 200 MCP-værktøjer på ét endepunkt, så det, der erstatter at klikke sig gennem et dashboard, er en MCP-klient — Claude Code, Claude Desktop, ChatGPT, Cursor eller en kører, du skriver selv — der beder om resultatet og viser dig skrivningen, før den sker. Teams, der kommer fra HubSpot og venter en skærm-for-skærm-erstatning, får omstillingen; teams, der kommer fordi de vil have, at CRM'et udfylder sig selv ud fra samtaler, de allerede havde, plejer at være produktive i første uge. Beslut hvilket af dem I er, før du planlægger overgangen, for det ændrer, hvem på teamet der skal være i lokalet.

  • 01Slå automatisk fornyelse fra først. Det kan fortrydes frem til ikrafttrædelsesdatoen; fornyelsesdatoen kan ikke.
  • 02Eksportér med Customize → alle egenskaber og forbindelser, CSV, All associated records. Ikke standardvisningen.
  • 03Skriv API-udtrækkene til indbakkesamtaler og salgsaktivitet, mens token stadig virker.
  • 04Udskift indlejrede formularer og gamle CTA'er på dine egne sider før deaktiveringsdatoen.
  • 05Importér i fremmednøglers rækkefølge, træk idMap igennem, mærk partiet, behold HubSpots Record ID.
  • 06Kør begge systemer i én hel faktureringscyklus. Du betaler for perioden alligevel.
  • 07Eksportér igen tæt på overgangen. Downloadlinkene fra måned ét er udløbet.

Ofte stillede spørgsmål

Hvordan eksporterer jeg alle mine data fra HubSpot? Der er ingen enkelt knap. HubSpot vedligeholder et eksportindeks, der dækker poster, egenskaber, videnbaseartikler, side- og indlægs-HTML, filer, HubDB, formularer, lister og rapportering, hver med sin egen vej. Poster eksporteres fra objektets listevisning via Export; hver fil ankommer som et downloadlink på mail, der udløber efter 30 dage.

Kan jeg opsige HubSpot midt i kontrakten? Nej. HubSpots kundevilkår siger, at du ikke må opsige, før din nuværende periode udløber, og der gives ingen refusion for forudbetalte eller ubrugte gebyrer. Du slår automatisk fornyelse fra i Account & Billing, så abonnementet slutter på sin fornyelsesdato, og derefter falder kontoen ned til HubSpots gratis værktøjer. Nedgraderinger følger samme regel og bør tages op mindst fem hverdage før fornyelse.

Inkluderer HubSpot-eksporter forbindelserne mellem kontakter, firmaer og aftaler? Ja, som kolonner. Hvert forbundet objekt får sin egen kolonne med forbundne post-ID'er og navne, som standard begrænset til 1.000 ID'er per kolonne. At vælge All associated records under Customize i eksportdialogen fjerner grænsen og er kun tilgængeligt for CSV-filer.

Hvad kan jeg ikke eksportere fra HubSpot? Arbejdsgangslogik, dashboards, rapporter og sekvenser — du kan eksportere et regneark, der beskriver dine arbejdsgange, og et PNG-billede af hver af dem, men ikke selve automatiseringen. Indbakkesamtaler og salgsaktivitet kommer ud gennem Conversations- og Engagements-API'erne frem for en knap. Afsæt tid til genopbygning af disse frem for til migrering.

Hvor lang tid tager det at migrere fra HubSpot til Munin? Selve dataarbejdet tager typisk en dag eller to: eksportér, skriv kolonnekortlægningen, kør crm_bulk_create_contacts i partier af 500 eller byg en crm_import-nyttelast, og verificer derefter tallene. Kalenderen er det, der tager længst tid — automatisk fornyelse skal opsiges før din fornyelsesdato, og at køre begge systemer parallelt i én faktureringscyklus er det trin, der fanger det, CSV'en ikke bar med sig.

Findes der et gratis CRM, jeg kan migrere til fra HubSpot? Flere. Munin Cloud Free er 0 € om måneden, EU-hostet, og inkluderer CRM, samtaler, videnbase, CMS, udgående kontakt og analyse; selvdrift under MIT er gratis i enhver skala. Twenty, EspoCRM og SuiteCRM er muligheder, der kun er CRM — sammenligningen licens for licens findes her.

Den korte version

  • HubSpot dokumenterer en eksportvej for næsten alt, og data kommer rent ud. Start med eksportindekset, ikke en tredjepartsvejledning.
  • Opsigelse midt i perioden er ikke tilladt, og der gives ingen refusion for ubrugte gebyrer. Slå automatisk fornyelse fra på dag ét — det kan fortrydes frem til ikrafttrædelsesdatoen.
  • Sæt Customize → alle egenskaber og forbindelser → All associated records, før du eksporterer, ellers afkortes forbindelseskolonnerne ved 1.000 ID'er.
  • Downloadlinks udløber efter 30 dage, så en migrering, der strækker sig over to måneder, betyder at du eksporterer to gange.
  • Arbejdsgange, dashboards og sekvenser eksporteres som beskrivelser, ikke definitioner. Indbakke- og aktivitetsdata kommer gennem Conversations- og Engagements-API'erne.
  • Ind i Munin: kortlæg CSV'en mod crm_bulk_create_contacts i partier af 500, eller byg en crm_import-nyttelast og træk det returnerede idMap igennem. Mærk partiet og behold HubSpots Record ID som join-nøgle.
  • På den anden side: seks moduler på én Postgres, over 200 MCP-værktøjer på ét endepunkt, Cloud Free til 0 € om måneden, og MIT-selvdrift med docker compose up.

Vil du have et sted at lande CSV'en, er Munin Cloud gratis og EU-hostet, og de samme værktøjer, der importerer dine HubSpot-data, vil eksportere dem igen den dag, du vil et andet sted hen.

At migrere væk fra HubSpot er et kalenderproblem i et dataproblems tøj.

Kjell Rune Monsø, stifter.