CSV-importer till HubSpot känns enkla – tills de inte är det. En enda mismatch i rubriken ”Phone number”, en dold hs_-egenskap, och plötsligt formaterar du om en fil som du redan har ”fixat” två gånger.
Customer Success Managers fastnar i liststädning i stället för att hjälpa kunder. En person inom marketing ops känner av det vid kampanjlanseringar, och en dataadministratör får skulden när poster hamnar i fel fält. Den här automatiseringen för HubSpot CSV imports kapar den röriga delen till ett repeterbart körningstillfälle.
Du sätter upp ett n8n-workflow som validerar rubriker, bygger en korrekt fältmappning direkt från HubSpot, importerar datan och loggar sedan vad som hände i Google Sheets så att QA går snabbt och blir tydligt.
Så här fungerar automatiseringen
Här är hela workflowet du kommer att sätta upp:
n8n Workflow Template: HubSpot + Google Sheets: felfria CSV-importer
flowchart LR
subgraph sg0["File upload form Flow"]
direction LR
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>File upload form"]
n10@{ icon: "mdi:cog", form: "rounded", label: "To get the first line of file", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set the real fields", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Get the fields from the sheet", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge fields and data"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Check if all fields from inp.."]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If all fields are defined", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Creates the correspondance t.."]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Form to set the correponding.."]
n18@{ icon: "mdi:cog", form: "rounded", label: "Get the content of file", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split all records to import", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define properties", pos: "b", h: 48 }
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Uploads to Hubspot"]
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Form response"]
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Set the values for each field"]
n25["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Set the values for each field1"]
n9 --> n10
n9 --> n18
n20 --> n21
n21 --> n22
n11 --> n13
n13 --> n12
n18 --> n13
n15 --> n24
n15 --> n16
n19 --> n20
n12 --> n14
n24 --> n19
n10 --> n11
n25 --> n19
n16 --> n17
n14 --> n15
n17 --> n25
end
subgraph sg1["Start here to update your field list Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split by object", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch properties from Hubspot"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Define crm_type"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split results", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Transforms the results"]
n5@{ icon: "mdi:database", form: "rounded", label: "Append to Google sheet", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Erase Google sheet", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define array of objects", pos: "b", h: 48 }
n8@{ icon: "mdi:play-circle", form: "rounded", label: "Start here to update your fi..", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Remove hidden and starting w..", pos: "b", h: 48 }
n3 --> n23
n2 --> n3
n0 --> n1
n6 --> n7
n4 --> n5
n7 --> n0
n1 --> n2
n8 --> n6
n23 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n9,n8 trigger
class n15,n23 decision
class n12,n5,n6 database
class n21,n1 api
class n14,n16,n24,n25,n2,n4 code
classDef customIcon fill:none,stroke:none
class n9,n13,n14,n16,n17,n21,n22,n24,n25,n1,n2,n4 customIcon
Varför det här spelar roll: CSV-importer kraschar vid sämsta möjliga tillfälle
De flesta team märker hur sköra HubSpot CSV imports är först när de redan är pressade. Du försöker ladda upp en lista inför en lansering, eller städar upp efter en partneröverlämning, och importverktyget klagar på rubriker, objekttyper eller problem med ”unknown property”. Då hamnar du i den värsta typen av jobb: blind trial and error. Du justerar kolumnnamn, tar bort fält du ”tror” att du inte behöver, laddar upp igen och hoppas att du inte precis flyttade värden till fel egenskaper. Även när det fungerar har du sällan en pålitlig revisionslogg över vad som ändrades.
Friktionen byggs på. Här är var det brukar fallera.
- CSV-rubriker glider över tid, så samma export fungerar en vecka och misslyckas nästa.
- HubSpot har egenskaper du inte ska importera till, och du upptäcker dem oftast först efter ett felmeddelande.
- Fältmappning blir ”tribal knowledge”, vilket betyder att varje kollega hittar på sin egen variant.
- Utan en QA-logg kan du inte snabbt bekräfta vad som importerades, hoppades över eller transformerades.
Vad du bygger: en validerad CSV-importpipeline till HubSpot
Det här workflowet gör ”ladda upp en CSV och håll tummarna” till en kontrollerad process. Det startar när du laddar upp en CSV-fil via ett enkelt n8n-formulär. Workflowet läser första raden för att förstå dina kolumnrubriker, hämtar den aktuella egenskapslistan direkt från HubSpot API och filtrerar bort dolda systemfält (de som ofta skapar förvirring). Därefter validerar det dina inmatade rubriker mot det HubSpot faktiskt accepterar och bygger en mappningstabell så att varje CSV-kolumn hamnar rätt. När mappningen är bekräftad rensar och strukturerar det varje rad, skickar posterna till HubSpot och skriver till sist en tydlig körlogg i Google Sheets för snabb QA och repeterbarhet.
Workflowet börjar med filinläsning och extrahering av rubriker. Sedan jämför det din fil med HubSpots live-lista över egenskaper, skapar en korrekt mappning och importerar poster i batchar. Google Sheets blir ditt ”pappersspår”, så du kan hitta avvikelser utan att gräva i HubSpot-vyer.
Det här bygger du
| Det som automatiseras | Det du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du importerar en kontakt-CSV varje vecka med 2 000 rader och cirka 25 kolumner. Manuellt lägger team ofta ungefär 2 timmar på att fixa rubriker, kontrollera HubSpot-fält och köra om importer efter fel. Med det här workflowet laddar du upp filen på en minut, väntar några minuter medan mappning och validering körs, godkänner sedan mappningen och låter importen gå. Du får tillbaka större delen av de 2 timmarna, och Google Sheets-loggen gör QA till en snabb avstämning i stället för ett detektivarbete.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- HubSpot för att ta emot importer och tillhandahålla metadata om egenskaper.
- Google Sheets för att lagra loggar och QA-utdata.
- HubSpot Private App-token (skapa den i HubSpot-inställningar → Integrations → Private Apps)
Kunskapsnivå: Medel. Du klistrar in API-uppgifter, mappar några fält och testar med en exempel-CSV.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Ladda upp en CSV via ett enkelt formulär. Workflowet använder en n8n form trigger som inmatning, så att vem som helst i teamet kan skicka in en fil utan att redigera noder.
Läs rubriker och parsa filen. n8n extraherar första raden (dina kolumnnamn) och extraherar även hela filinnehållet, som blir importdatasetet.
Hämta HubSpots live-lista över fält och validera. En HTTP Request till HubSpot hämtar de senaste egenskaperna för valt CRM-objekt, sedan filtrerar workflowet bort dolda hs_-fält och kontrollerar om dina CSV-rubriker kan mappas utan problem.
Skapa en mappning och importera poster i batchar. Om rubrikerna ser bra ut bygger n8n en mappningstabell, tilldelar postegenskaper rad för rad och skickar sedan payloaden till HubSpot. Parallellt lägger det till en loggrad i Google Sheets så att du kan granska vad som hände och återanvända upplägget nästa gång.
Du kan enkelt justera valideringsreglerna så att de matchar er namngivningsstandard, eller byta objekttyp (kontakter vs. företag) utifrån behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Det här arbetsflödet startar med en manuell trigger för att förbereda fältlistan innan filinläsning.
- Lägg till noden Manual Field List Start som trigger.
- Koppla Manual Field List Start till Clear Spreadsheet för att starta installationsflödet.
Steg 2: anslut Google Sheets
Google Sheets-noder hanterar fältlistor och lagring av utdata för CRM-mappningsprocessen.
- Öppna Clear Spreadsheet och konfigurera kalkylarket och fliken som ska återställas.
- Öppna Retrieve Sheet Fields och ange fliken som innehåller CRM-fältlistan.
- Öppna Append to Spreadsheet och ange målfliken för mappade fältdata.
- Autentisering krävs: anslut era Google Sheets-autentiseringsuppgifter i Clear Spreadsheet, Retrieve Sheet Fields och Append to Spreadsheet.
⚠️ Vanlig fallgrop: Om någon Google Sheets-nod saknar autentiseringsuppgifter kommer arbetsflödet att misslyckas när det försöker läsa eller skriva fältdata.
Steg 3: konfigurera filintag och fältextraktion
Det här avsnittet hanterar filuppladdning och extraherar rubrik- och datainnehåll parallellt.
- Konfigurera File Upload Intake för att ta emot CRM-importfilen och notera den genererade formulär-URL:en.
- Bekräfta att File Upload Intake skickar utdata till både Extract First Row och Extract File Content parallellt.
- I Extract First Row ställer ni in extraktionen så att rubrikraden fångas för fältmappning.
- I Extract File Content ställer ni in extraktionen så att fullständiga raddata returneras för mappning.
- Koppla Extract First Row till Assign Actual Fields och Extract File Content till Combine Fields and Data.
Tips: Parallell körning säkerställer att rubriker och data behandlas samtidigt för snabbare mappning.
Steg 4: konfigurera fältvalidering och mappning
Det här steget validerar inkommande fält och erbjuder en fallback för mappning när fält inte matchar.
- Konfigurera Assign Actual Fields för att linjera extraherade rubriker med förväntad fältstruktur.
- Koppla Assign Actual Fields och Extract File Content till Combine Fields and Data, och vidare till Retrieve Sheet Fields.
- Konfigurera Validate Input Fields för att kontrollera uppladdade fält mot listan i fliken.
- I Branch on Field Validity bekräftar ni att den giltiga vägen går till Populate Field Values och den ogiltiga vägen går till Create Mapping Table.
- Konfigurera Mapping Setup Form för att samla in manuell fältmappning och koppla den sedan till Populate Field Values B.
- Säkerställ att både Populate Field Values och Populate Field Values B kopplas till Divide Import Records.
Steg 5: bygg CRM-egenskapslistor och spåra utdata
Det här segmentet hämtar HubSpot-egenskaper och loggar användbara fält till kalkylarket.
- Konfigurera Build Object Array för att förbereda objekt för gruppering av CRM-entiteter.
- Bekräfta att Build Object Array kopplas till Divide by Entity och vidare till Retrieve HubSpot Properties.
- I Retrieve HubSpot Properties ställer ni in anropet mot HubSpots endpoint för egenskaper.
- Autentisering krävs: anslut era autentiseringsuppgifter för HTTP Request (t.ex. HubSpot API-token) i Retrieve HubSpot Properties.
- Säkerställ att Retrieve HubSpot Properties kopplas till Set CRM Category och vidare till Segment Output.
- Bekräfta att Segment Output går vidare till Filter Hidden hs_ Fields, sedan Transform Output Data och slutligen Append to Spreadsheet.
⚠️ Vanlig fallgrop: Om dolda HubSpot-fält inte filtreras i Filter Hidden hs_ Fields kan fliken fyllas med interna egenskaper som inte ska mappas.
Steg 6: konfigurera skapande av CRM-poster
Det här steget förbereder varje post och skickar den till HubSpot för import.
- Bekräfta att Divide Import Records delar upp varje mappad post i enskilda items.
- Ställ in Assign Record Properties för att bygga payloaden som HubSpot förväntar sig.
- Konfigurera Send to HubSpot med HubSpots endpoint för create/update.
- Autentisering krävs: anslut era autentiseringsuppgifter för HTTP Request (t.ex. HubSpot API-token) i Send to HubSpot.
- Koppla Send to HubSpot till Response Form Display för att visa status för slutförandet.
Steg 7: testa och aktivera ert arbetsflöde
Verifiera arbetsflödet från början till slut innan ni aktiverar det för produktionsbruk.
- Klicka på Execute Workflow från Manual Field List Start för att verifiera Google Sheets-konfigurationen och hämtning av CRM-fält.
- Skicka in en exempelfil via formulär-URL:en för File Upload Intake och bekräfta att Extract First Row och Extract File Content körs parallellt.
- Kontrollera Append to Spreadsheet för att säkerställa att transformerade utdata skrivs korrekt.
- Verifiera att Response Form Display visar ett lyckat svar efter att Send to HubSpot har körts.
- Växla arbetsflödet till Active när alla noder körs utan fel.
Felsökningstips
- HubSpot-uppgifter kan gå ut eller sakna rätt scopes. Om importer misslyckas, kontrollera först behörigheterna för din Private App-token i HubSpot och uppdatera sedan inloggningen i n8n.
- Om du använder Wait-noder eller extern bearbetning i en modifierad version varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Google Sheets kan fallera utan tydliga fel när arknamnet/fliknamnet ändras eller när ett servicekonto tappar åtkomst. Bekräfta kalkylarkets ID och att det anslutna Google-kontot fortfarande har redigeringsrättigheter.
Snabba svar
Cirka 45 minuter om dina HubSpot- och Google-uppgifter är klara.
Nej. Du kopplar HubSpot och Google Sheets och justerar sedan några inställningar för mappning och validering.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också ta höjd för HubSpot-begränsningar utifrån din plan, eftersom stora importer kan slå i API:ts rate limits.
Två alternativ: n8n Cloud (managed, enklast uppsättning) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du sannolikt göra. Du kan ändra målobjektet genom att justera ”Build Object Array” och begäran som hämtar HubSpot-egenskaper så att den hämtar fält för företag, affärer eller anpassade objekt i stället för kontakter. Vanliga justeringar är att lägga till en dedupliceringsregel före ”Divide Import Records”, tvinga datum-/telefonformatering i transformeringssteget och ändra loggkolumnerna i Google Sheets så att QA matchar er interna checklista. Om du jobbar med flera leverantörer kan du till och med behålla separata mappningspresets genom att duplicera logiken för mappningsformuläret.
Oftast beror det på en utgången eller felaktigt scopad Private App-token. Skapa en ny token (eller uppdatera scopes), byt sedan ut inloggningen i n8n och testa om HTTP Request-noderna. Det kan också vara rate limiting om du skickar en stor batch under hög belastning, så prova mindre batchar via steget ”Divide Import Records”.
En typisk setup kan hantera några tusen rader per körning, och du kan skala högre genom att batcha och lägga in avstånd mellan förfrågningar för att hålla dig under HubSpots rate limits.
Ofta, ja – eftersom CSV-importarbete behöver förgrening, validering och logik för ”stoppa körningen om rubrikerna är fel”. n8n gör den typen av kontroll enkel, och self-hosting undviker prissättning per task när du kör importer ofta. Zapier eller Make kan fortfarande fungera bra för enklare flöden som ”ny rad → skapa kontakt”, men de är inte lika smidiga när du behöver dynamisk hämtning av egenskaper från HubSpot API. Ärligt talat är QA-loggning i Google Sheets också enklare att få stabil i n8n. Prata med en automationsexpert om du är osäker på vad som passar.
När detta är på plats slutar CSV-importer att vara en veckovis chansning. Du får bättre HubSpot-data, snabbare QA och en process som teamet faktiskt kan upprepa.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.