MuninMunin
Logga inKom igång gratis
Home/Journal/Så migrerar du från HubSpot.
Engineering · 9 min read

Så migrerar du från HubSpot.

Exporten är den enkla delen — HubSpot dokumenterar varenda en av dem. Det svåra är klausulen om automatisk förnyelse, kopplingarna som bara överlever som CSV-kolumner, och tillgångarna som aldrig var dina att exportera. En plan du kan köra, i den ordning kalendern tvingar 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.
Locket av i mars. Förnyelsen är i oktober.

Nästan alla som lämnar HubSpot upptäcker samma sak i samma ordning. Först att data kommer ut rent — HubSpot dokumenterar varje exportväg, och de är fler än du trodde. Sedan att kontraktet inte alls kommer ut rent, eftersom uppsägning mitt i perioden inte är en sak och förnyelsedatumet var för sex veckor sedan. Migreringen är inte ett tekniskt projekt med en fotnot om fakturering. Det är ett faktureringsprojekt med en teknisk fotnot, och gör du det i den ordningen tar det en eftermiddag med skript och en kalenderpåminnelse.

Kan du exportera alla dina data från HubSpot?

Nästan allt, och HubSpot publicerar kartan. Kontakter, företag, affärer, ärenden, samtal, uppgifter, egna objekt, egenskaper, egenskapshistorik, kunskapsbasartiklar, sid- och blogg-HTML, filer, HubDB-tabeller, URL-omdirigeringar, formulärsvar, listor och resultat för marknadsmejl har alla dokumenterade exportvägar, levererade som CSV, XLS eller XLSX via en nedladdningslänk i mejl. HubSpots egen exportindex är den auktoritativa listan — den är mer komplett än någon tredjepartsguide för migrering, den här inkluderad.

Det du får är en ögonblicksbild av nuvarande egenskapsvärden plus kopplingar, inte ett levande system. Den skillnaden är hela migreringen. En kontaktrad anländer med sitt Record ID och varje egenskap du bad om; kopplingen till företaget anländer som en kolumn med den kopplade postens ID och namn. Att bygga upp grafen igen på andra sidan är en join, inte en räddningsaktion — men det är en join du måste skriva.

Vilka är HubSpots exportgränser?

De är generösa nog att de flesta team aldrig märker dem, och precisa nog att planera runt. Per september 2026 tillåter HubSpot 300 exporter under ett rullande dygn, med tre som körs samtidigt och resten i kö. CSV-filer över 2 MB anländer zippade. Filer delas över 1 000 000 rader för CSV och XLSX, och över 65 535 rader för XLS. XLSX stannar vid 16 384 kolumner och XLS vid 256, vilket är skälet till att HubSpot rekommenderar CSV för breda exporter — ett konto med hundratals egna egenskaper når kolumntaket innan det når radtaket.

Siffran som faktiskt biter är den minsta: nedladdningslänkar går ut efter 30 dagar. Exportloggarna syns i tre år, men filerna bakom dem gör det inte. Exporterar du i januari och byter över i mars exporterar du två gånger.

300
postexporter per rullande dygn
30 dagar
innan en nedladdningslänk går ut
1000
kopplade post-ID:n per kopplingskolumn, som standard

Vad överlever inte exporten?

Tre kategorier, och bara den tredje är en verklig förlust. Struktur som aldrig var data: arbetsflöden exporteras som ett kalkylblad med namn, antal anmälda och ändringsdatum, plus en PNG per arbetsflöde — själva logiken är en bild. Instrumentpaneler, rapporter och sekvenser är samma historia. Beteende fäst vid HubSpots körtid: HubSpot noterar att formulär tappar sina betalda funktioner och att gamla CTA:er slutar fungera när kontot avaktiveras, så allt som är inbäddat på en extern webbplats måste ersättas innan du stänger av, inte efter. Historik med ett lagringsfönster: åtgärdsloggar för arbetsflöden behåller full detalj i 180 dagar och övergripande detalj i upp till två år.

Kopplingarna är den del folk har fel om, eftersom de ser ut som en förlust och inte är det. Som standard inkluderar en export upp till 1000 kopplade post-ID:n per kopplingskolumn, vilket räcker för kontakter och företag och inte räcker för ett företag med 3000 kontakter. I exportdialogen låter Customize dig sätta Associations included in export till All associated records — endast för CSV. Ställ in det innan du exporterar, inte efter att du hittat avkapningen.

  • Exporteras rentKontakter, företag, affärer, ärenden, samtal, uppgifter, egna objekt, egenskaper och egenskapshistorik, kunskapsbasartiklar, sid- och inläggs-HTML, filer, HubDB, omdirigeringar, formulärsvar, listor, användare och behörigheter.
  • Exporteras som en beskrivningArbetsflöden — ett kalkylblad med namn och antal, plus en PNG av varje flöde. Instrumentpaneler och rapporter exporterar sitt nuvarande utfall, inte sin definition. Budgetera tid för återuppbyggnad, inte för migrering.
  • Exporteras bara genom API:etInkorgssamtal och säljaktivitet. HubSpot pekar dig mot Conversations- och Engagements-API:erna i stället för en knapp; skriv uttaget innan du säger upp, medan token fortfarande fungerar.
  • Slutar fungera vid avaktiveringInbäddade formulär tappar betalda funktioner, gamla CTA:er slutar fungera. De bor på sidor du styr, så ersätt dem i förväg av övergångsdatumet.
  • Har en lagringsklockaÅtgärdsloggar för arbetsflöden: full detalj i 180 dagar, övergripande detalj i två år. Exportloggar syns i tre år; nedladdningslänkarna bakom dem gör det inte.

Ta kalendern först, dag ett

HubSpots kundvillkor säger att du inte får säga upp innan din nuvarande period löpt ut och att ingen återbetalning ges för förskottsbetalda eller oanvända avgifter. Prenumerationer förnyas automatiskt för det kortaste av samma längd som din föregående period eller ett år, så att säga upp betyder att stänga av automatisk förnyelse i Account & Billing → Subscriptions → Cancel auto-renewal — en åtgärd för Super Admin eller faktureringsadministratör — innan förnyelsedatumet. Nedgraderingar är detsamma: nedgradering mitt i perioden är inte tillåten, och HubSpot ber dig ta upp det med en representant minst fem arbetsdagar före förnyelse. Läs uppsägningsartikeln och villkoren innan du skriver en enda rad migreringskod.

När bör du börja migrera från HubSpot?

Räkna bakåt från förnyelsedatumet, inte framåt från beslutet. Att stänga av automatisk förnyelse går att ångra ända fram till ikraftträdandedatumet, så den säkra ordningen är: stäng av den först, utvärdera sedan, och slå på den igen om du ändrar dig. Att göra det i omvänd ordning — utvärdera, besluta, och sedan upptäcka att förnyelsen passerade vecka tre — är hur ett sexveckorsprojekt blir fjorton månader långt.

En form som fungerar för ett team med ettårsperiod: stäng av automatisk förnyelse dag ett, kör exporten och mappningen de följande två veckorna, och kör sedan båda systemen parallellt tills du har sett en hel faktureringscykel av verkligt arbete landa i det nya. Du betalar för HubSpot under det fönstret ändå, vilket gör parallellkörningen gratis. Det är den enda fördelen med en period du inte kan lämna i förtid — du kan lika gärna använda den.

Hur får du in HubSpot-data i Munin?

Två vägar, och vilken du tar beror på om du flyttar en lista eller en historik. För kontakter, företag och affärer som de står i dag, mappa CSV:n mot crm_bulk_create_contacts, som tar upp till 500 kontakter per anrop och dubblettrensar mot befintlig e-post och telefon — och mot spärrlistan, så att en ny import inte kan återuppliva någon som avregistrerat sig. För en full graf med pipelines, faser, aktiviteter och relationer intakta, bygg crm_import-nyttolasten i stället: den landar poster i beroendeordning och returnerar en idMap från dina käll-ID:n till Munins.

Var klarögd om arbetets form. Munins importverktyg tar in Munins eget exportformat, så att komma från HubSpot betyder att du skriver mappningen själv — det finns ingen leverantörsspecifik HubSpot-import att klicka på. Det som gör det till en förmiddag i stället för ett kvartal är målets storlek: sju posttyper på CRM-sidan, inte de flera hundra egenskaper en HubSpot-portal samlar på sig. Du bestämmer en gång vilka kolumner som betyder något, och de du lämnar kvar var de ingen filtrerade på ändå. Varje modul har samma par — crm_import, kb_import, cms_import, conv_import, outreach_import, analytics_import — och det matchande _export-verktyget, som är samma dörr använd i andra riktningen den dag du vill lämna oss.

pythonmap_contacts.py
import csv

# HubSpot: CRM > Contacts > Export, format CSV,
# Customize > alla egenskaper och kopplingar på posterna.
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 stannar vid 500 per anrop.
batches = [contacts[i : i + 500] for i in range(0, len(contacts), 500)]

Märk importen, behåll det gamla ID:t

Två vanor som gör en skrämmande enkelriktad migrering till något du kan ångra. Märk varje importerad post med partiet (hubspot-import-2026-08) så att crm_list_contacts({ tag: "..." }) ger dig exakt den mängden tillbaka. Och behåll HubSpots Record ID i customFields — det är join-nyckeln för varje uppföljningsvarv, och enda sättet att stämma av mot källan ett halvår senare när någon frågar varför ett affärsbelopp ser fel ut.

I vilken ordning måste posterna in?

Främmandenyckelordning, eftersom föräldrarna måste finnas innan barnen kan peka på dem. crm_import sköter det internt — pipelines, sedan segment, sedan företag, sedan kontakter, sedan affärer, sedan aktiviteter, sedan relationer — och returnerar en idMap som kopplar varje käll-ID till det ID det fick på den här servern. Trä den kartan genom varje efterföljande importanrop, så hittar beroende poster sina föräldrar automatiskt.

Uppdateringarna är nycklade så att det är säkert att köra om: pipelines på slug, segment på namn, företag på domän med namn som reserv, kontakter på e-post. Affärer, aktiviteter och relationer får färska ID:n varje körning, med föräldrar lösta genom idMap, vilket är skälet till att du behåller kartan i stället för att göra en ny. Samtal är den enda modulen att köra med eftertänksamhet: conv_import är idempotent inom en migrering via idMap, men meddelanden är endast tilläggande och dubblettrensas inte mellan separata körningar. Importera samtal en gång, behåll kartan, och ta en databasbild först — samma råd som vid varje annan massinläsning.

jsonccrm_import.jsonc
{
  "name": "crm_import",
  "arguments": {
    "records": {
      "pipelines": [
        { "id": "hs-default", "name": "Försäljning", "slug": "forsaljning",
          "stages": [
            { "id": "appointmentscheduled", "name": "Möte bokat",
              "position": 0, "winLoss": "open" },
            { "id": "closedwon", "name": "Vunnen",
              "position": 5, "winLoss": "won" }
          ] }
      ],
      "companies": [
        { "id": "7301442891", "name": "Acme AB", "domain": "acme.se",
          "tags": ["hubspot-import-2026-08"], "customFields": {} }
      ],
      "contacts": [
        { "id": "501993", "name": "Vita Costa", "email": "vita@acme.se",
          "companyId": "7301442891", "tags": ["hubspot-import-2026-08"],
          "customFields": { "hubspotRecordId": "501993" } }
      ],
      "deals": [
        { "id": "18442310", "name": "Acme — förnyelse", "pipelineId": "hs-default",
          "stageId": "appointmentscheduled", "primaryContactId": "501993",
          "companyId": "7301442891", "amountCents": 1200000, "currency": "EUR" }
      ],
      "segments": [], "activities": [], "relationships": []
    }
  }
}
ID:na i den nyttolasten är HubSpots. De behöver bara vara unika inuti filen — idMap gör resten.

Är marknadssviten skälet till att du är där, så stanna

HubSpots marknadsautomation, dess mall- och appmarknadsplats och dess partnerekosystem är genuint djupa, och inget på den här sidan ersätter en kampanjmotor med ett decennium av samlade integrationer bakom sig. Är det den maskinen som driver din omsättning är det en nedgradering förklädd till en besparing att migrera bort. Köp förnyelsen.

Munin är draget för ett annat team: ett som vill ha CRM, samtal, kunskapsbas, CMS, utgående kontakt och analys på en Postgres och en kundpost, prissatt platt i stället för per plats och per marknadskontakt, under en licens som låter dem köra alltihop själva. Är skälet till att du ser dig om att räkningen växer varje gång databasen gör det, så är migreringen ovan hela projektet.

Hur ser stacken ut på andra sidan?

Mindre, och driven annorlunda. De sex modulerna delar ett schema, så en kontakt är en rad i stället för sex synkroniserade kopior, och en raderingsbegäran har ett ställe att landa. Det finns ingen mätare per plats och ingen nivå för marknadskontakter: Munin Cloud Free är 0 € i månaden med 5000 MCP-anrop, 250 kontakter och 100 MB, och självdrift under MIT är docker compose up utan licensavgift alls.

Driftsmodellen är den del som är värd att planera för. Munin exponerar mer än 200 MCP-verktyg på en ändpunkt, så det som ersätter att klicka sig genom en instrumentpanel är en MCP-klient — Claude Code, Claude Desktop, ChatGPT, Cursor eller en körare du skriver själv — som ber om utfallet och visar dig skrivningen innan den sker. Team som kommer från HubSpot och väntar sig en skärm-för-skärm-ersättning får omställningen; team som kommer för att de vill att CRM:et ska fylla i sig självt från samtal de redan hade brukar vara produktiva första veckan. Bestäm vilket av dem ni är innan du planerar övergången, för det ändrar vem i teamet som behöver vara i rummet.

  • 01Stäng av automatisk förnyelse först. Det går att ångra fram till ikraftträdandedatumet; förnyelsedatumet gör det inte.
  • 02Exportera med Customize → alla egenskaper och kopplingar, CSV, All associated records. Inte standardvyn.
  • 03Skriv API-uttagen för inkorgssamtal och säljaktivitet medan token fortfarande fungerar.
  • 04Ersätt inbäddade formulär och gamla CTA:er på dina egna sidor före avaktiveringsdatumet.
  • 05Importera i främmandenyckelordning, trä idMap genom, märk partiet, behåll HubSpots Record ID.
  • 06Kör båda systemen i en hel faktureringscykel. Du betalar för perioden ändå.
  • 07Exportera om nära övergången. Nedladdningslänkarna från månad ett har gått ut.

Vanliga frågor

Hur exporterar jag alla mina data från HubSpot? Det finns ingen enda knapp. HubSpot underhåller ett exportindex som täcker poster, egenskaper, kunskapsbasartiklar, sid- och inläggs-HTML, filer, HubDB, formulär, listor och rapportering, var och en med sin egen väg. Poster exporteras från objektets listvy via Export; varje fil anländer som en nedladdningslänk i mejl som går ut efter 30 dagar.

Kan jag säga upp HubSpot mitt i kontraktet? Nej. HubSpots kundvillkor säger att du inte får säga upp innan din nuvarande period löpt ut, och ingen återbetalning ges för förskottsbetalda eller oanvända avgifter. Du stänger av automatisk förnyelse i Account & Billing så att prenumerationen slutar på sitt förnyelsedatum, och därefter faller kontot ned till HubSpots gratisverktyg. Nedgraderingar följer samma regel och bör tas upp minst fem arbetsdagar före förnyelse.

Inkluderar HubSpot-exporter kopplingarna mellan kontakter, företag och affärer? Ja, som kolumner. Varje kopplat objekt får sin egen kolumn med kopplade post-ID:n och namn, som standard begränsat till 1000 ID:n per kolumn. Att välja All associated records under Customize i exportdialogen tar bort gränsen, och är bara tillgängligt för CSV-filer.

Vad kan jag inte exportera från HubSpot? Arbetsflödeslogik, instrumentpaneler, rapporter och sekvenser — du kan exportera ett kalkylblad som beskriver dina arbetsflöden och en PNG-bild av vart och ett, men inte själva automationen. Inkorgssamtal och säljaktivitet kommer ut genom Conversations- och Engagements-API:erna i stället för en knapp. Budgetera tid för återuppbyggnad av dessa i stället för migrering.

Hur lång tid tar det att migrera från HubSpot till Munin? Själva dataarbetet tar typiskt en dag eller två: exportera, skriv kolumnmappningen, kör crm_bulk_create_contacts i partier om 500 eller bygg en crm_import-nyttolast, och verifiera sedan antalen. Kalendern är det som tar längst tid — automatisk förnyelse måste sägas upp före ditt förnyelsedatum, och att köra båda systemen parallellt i en faktureringscykel är steget som fångar det CSV:n inte bar med sig.

Finns det ett gratis CRM jag kan migrera till från HubSpot? Flera. Munin Cloud Free är 0 € i månaden, EU-hostat, och inkluderar CRM, samtal, kunskapsbas, CMS, utgående kontakt och analys; självdrift under MIT är gratis i vilken skala som helst. Twenty, EspoCRM och SuiteCRM är alternativ som bara är CRM — jämförelsen licens för licens finns här.

Kortversionen

  • HubSpot dokumenterar en exportväg för nästan allt, och data kommer ut rent. Börja med exportindexet, inte en tredjepartsguide.
  • Uppsägning mitt i perioden är inte tillåten och ingen återbetalning ges för oanvända avgifter. Stäng av automatisk förnyelse dag ett — det går att ångra fram till ikraftträdandedatumet.
  • Ställ in Customize → alla egenskaper och kopplingar → All associated records innan du exporterar, annars kapas kopplingskolumnerna vid 1000 ID:n.
  • Nedladdningslänkar går ut efter 30 dagar, så en migrering som sträcker sig över två månader betyder att du exporterar två gånger.
  • Arbetsflöden, instrumentpaneler och sekvenser exporteras som beskrivningar, inte definitioner. Inkorgs- och aktivitetsdata kommer genom Conversations- och Engagements-API:erna.
  • In i Munin: mappa CSV:n mot crm_bulk_create_contacts i partier om 500, eller bygg en crm_import-nyttolast och trä den returnerade idMap genom. Märk partiet och behåll HubSpots Record ID som join-nyckel.
  • På andra sidan: sex moduler på en Postgres, över 200 MCP-verktyg på en ändpunkt, Cloud Free för 0 € i månaden, och MIT-självdrift med docker compose up.

Vill du ha någonstans att landa CSV:n är Munin Cloud gratis och EU-hostat, och samma verktyg som importerar dina HubSpot-data kommer att exportera dem igen den dag du vill någon annanstans.

Att migrera från HubSpot är ett kalenderproblem i ett dataproblems kläder.

Kjell Rune Monsø, grundare.