Din webbplats svarar redan på de flesta kundfrågor. Problemet är att de svaren inte syns i din inkorg när någon sms:ar dig, så teamet slutar med att skriva om samma förklaringar hela dagen.
Byråägare känner av det när kunder förväntar sig ”omedelbara” svar. En marknadschef märker det när leads kallnar efter kontorstid. Och ett litet supportteam blir snabbt överbelastat. Den här GoHighLevel SMS AI-automationen gör din webbplats till en kunskapsbas som svarar konsekvent via SMS.
Du får lära dig vad workflowet gör, vad du behöver för att köra det och hur delarna hänger ihop så att du kan lita på de svar dina kontakter får.
Så fungerar den här automationen
Här är hela workflowet du kommer att sätta upp:
n8n Workflow Template: GoHighLevel + OpenAI: sms-svar från webbplatsen
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0["<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/html.dark.svg' width='40' height='40' /></div><br/>HTML"]
n1@{ icon: "mdi:memory", form: "rounded", label: "Simple Vector Store", pos: "b", h: 48 }
n2@{ icon: "mdi:vector-polygon", form: "rounded", label: "Embeddings OpenAI", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Default Data Loader", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Recursive Character Text Spl..", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n11["<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/html.dark.svg' width='40' height='40' /></div><br/>HTML1"]
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "BrightData", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Website URL", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "BrightData1", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n20@{ icon: "mdi:memory", form: "rounded", label: "Simple Vector Store2", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Get XML file", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split out links", pos: "b", h: 48 }
n28["<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"]
n29@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates1", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Links", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Links1", pos: "b", h: 48 }
n33["<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/>Get sitemap"]
n0 --> n1
n0 --> n33
n0 --> n9
n19 --> n30
n11 --> n20
n28 --> n29
n10 --> n31
n9 --> n10
n14 --> n0
n31 --> n28
n16 --> n11
n32 --> n28
n33 --> n26
n33 --> n28
n26 --> n27
n30 --> n16
n15 --> n14
n27 --> n32
n13 --> n15
n2 -.-> n1
n2 -.-> n20
n29 --> n30
n3 -.-> n1
n3 -.-> n20
n20 --> n19
n4 -.-> n3
end
subgraph sg1["AI Agent Flow"]
direction LR
n5@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n7@{ icon: "mdi:memory", form: "rounded", label: "Simple Vector Store1", pos: "b", h: 48 }
n8@{ icon: "mdi:vector-polygon", form: "rounded", label: "Embeddings OpenAI1", pos: "b", h: 48 }
n12@{ icon: "mdi:memory", form: "rounded", label: "Redis Chat Memory", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Send SMS via GHL"]
n18["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook from GHL - SMS Reply.."]
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Website URL1", pos: "b", h: 48 }
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/highLevel.svg' width='40' height='40' /></div><br/>Look Up GHL Contact by ID"]
n25@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n25 --> n22
n5 --> n17
n21 --> n5
n6 -.-> n5
n12 -.-> n5
n8 -.-> n7
n7 -.-> n5
n22 --> n21
n18 --> n25
end
subgraph sg2["Flow 3"]
direction LR
n23["<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/>Direct API access via HTTP"]
end
subgraph sg3["Flow 4"]
direction LR
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Direct API access via HTTP1"]
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 n13 trigger
class n3,n4,n5 ai
class n6 aiModel
class n1,n20,n7,n12 ai
class n2,n8 ai
class n10,n25 decision
class n33,n17,n18,n23,n24 api
classDef customIcon fill:none,stroke:none
class n0,n11,n28,n33,n17,n18,n22,n23,n24 customIcon
Varför det här spelar roll: SMS-support blir repetitivt snabbt
SMS-support låter enkelt tills du lever i det. Någon frågar om priser, din garanti, hur bokning fungerar, vad som faktiskt ingår eller om ni täcker deras område. Du svarar, sedan svarar du igen, och igen. Samtidigt uppdateras webbplatsen i det tysta (nya erbjudanden, nya policyer, en ändrad onboardingprocess), och dina svar släpar efter eftersom ingen har tid att träna om teamet eller skriva om standardsvar varje vecka. Ärligt talat är den värsta delen den mentala belastningen. Du gissar hela tiden om ditt senaste svar fortfarande stämmer med vad webbplatsen säger.
Det här bygger snabbt upp. Här är var det oftast faller isär.
- Supportmedarbetare slutar med att söka på den egna sajten mitt i konversationen, vilket gör sms:en långsamma och klumpiga.
- Standardsnuttar blir inaktuella, så du råkar lova saker du inte längre erbjuder.
- Meddelanden efter kontorstid staplas på hög och på morgonen är momentumet i leadet borta.
- När volymen växer försvinner konsekvensen eftersom alla skriver svar på sitt eget sätt.
Det du bygger: SMS-svar i GoHighLevel baserade på webbplatsens innehåll
Det här workflowet kopplar GoHighLevel SMS till en AI-agent som ”studerar” din webbplats enligt ett schema och sedan använder innehållet för att svara på frågor när de kommer in. Först hämtar den webbplatsens innehåll (inklusive sitemap-länkar när de finns), rensar och delar upp texten i användbara segment och lagrar det i ett in-memory vektorlager så att AI:n snabbt kan hitta rätt avsnitt senare. När en kontakt sms:ar till ditt GoHighLevel-nummer plockar workflowet upp meddelandet, hämtar kontakten och skickar frågan till AI-agenten tillsammans med den mest relevanta kontexten från webbplatsen. Slutligen skickar det ett tydligt, varumärkesanpassat svar tillbaka via GoHighLevel SMS. Resultatet är support som ligger i linje med dina live-sidor i stället för ett dammigt FAQ-dokument.
Workflowet börjar med schemalagd webbskrapning för att hålla kunskapsbasen uppdaterad. Därefter bygger det sökbara embeddings så att AI:n kan hämta rätt delar av webbplatsen. Sedan triggar inkommande SMS en fråga-svar-cykel, och GoHighLevel levererar svaret tillbaka till samma konversation.
Det du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du får 25 SMS-frågor per dag. Manuellt är det vanligt att lägga cirka 5 minuter på att läsa, söka på sajten och skriva ett korrekt formaterat svar, alltså ungefär 2 timmar per dag. Med det här workflowet blir din ”insats” snabb översyn: kanske 10 minuter för att stickprovskolla konversationer, medan skrapning och svarsgenerering kör i bakgrunden. Det är cirka 1,5 timmar tillbaka varje dag, utan att låta svaren bli inaktuella.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- GoHighLevel för att ta emot och skicka SMS.
- OpenAI API för att generera svar baserat på innehållet på din webbplats.
- Bright Data för pålitlig webbskrapning (särskilt på skyddade sajter).
- OpenAI API-nyckel (hämta den i din OpenAI-dashboard)
Kunskapsnivå: Medel. Du kopplar OAuth, lägger in API-nycklar och testar några riktiga SMS-konversationer.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Din webbplats hämtas enligt schema. En schemalagd trigger kör, sätter webbplats-URL:en du vill använda och hämtar sidor via Bright Data (eller HTTP-förfrågningar om du anpassar det för enklare sajter).
Innehåll blir sökbar kunskap. Workflowet extraherar HTML-body, delar upp långa sidor i mindre segment och bygger embeddings så att ditt innehåll kan sökas på betydelse, inte bara nyckelord.
Inkommande SMS triggar AI-agenten. En GoHighLevel-webhook tar emot texten, kontrollerar att det är ett riktigt inkommande meddelande, hämtar kontakten och skickar frågan plus relevant webbplatskontext in i fråga-svar-kedjan och chattmodellen.
Svaret går tillbaka till samma konversation. AI-agenten formaterar det slutliga svaret och workflowet skickar det via GoHighLevel SMS så att det landar där teamet redan jobbar.
Du kan enkelt ändra skrapmålen för att fokusera på specifika sidor, eller justera svarsformatet för att matcha din tonalitet beroende på behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera den schemalagda triggern
Ställ in arbetsflödets schema för att uppdatera webbplatskunskap återkommande.
- Öppna Scheduled Run Trigger och ställ in schemaregeln så att den körs var
4dag med triggerAtHour satt till{{ 12 }}. - Bekräfta att triggern skickar output till Assign Website URL som visas i körflödet.
Steg 2: anslut webbplatsinput och första crawl
Ange målwebbplatsen och hämta startsidans HTML för att extrahera text och länkar.
- I Assign Website URL ställer ni in website_url till
https://yourwebsite.com. - Öppna BrightData Fetcher och ställ in url till
{{ $json.website_url }}. - Autentiseringsuppgifter krävs: Anslut era brightdataApi-autentiseringsuppgifter i BrightData Fetcher.
- I HTML Content Parser behåller ni operation som
extractHtmlContentoch säkerställer att dataPropertyName ärbody. - Bekräfta den parallella förgreningen: HTML Content Parser skickar output till både In-Memory Vector Store och Fetch Sitemap File samt Separate Link Items parallellt.
Tips: Den parallella grenen säkerställer att ni både läser in startsidans text och upptäcker länkar samtidigt.
Steg 3: bygg och normalisera länkkällor
Samla länkar från startsidan och sitemap och normalisera dem samt ta bort dubbletter.
- I Fetch Sitemap File ställer ni in url till
{{ $('Assign Website URL').item.json.website_url }}/post-sitemap.xml. - Från Fetch Sitemap File säkerställer ni att XML:en parsas via Parse XML File och därefter delas upp med Split Sitemap Links med fieldToSplitOut satt till
urlset.url. - I Map Link Field ställer ni in link till
{{ $json.loc }}för att linjera sitemap-URL:er. - Från Separate Link Items säkerställer ni att fieldToSplitOut är
linksoch att den skickar output till Filter Link Paths. - I Filter Link Paths behåller ni villkoret som tillåter länkar som börjar med
/eller med{{ $('Assign Website URL').item.json.website_url }}. - I Normalize Link URLs ställer ni in link till
{{ $json.link.startsWith("/") ? $('Assign Website URL').item.json.website_url + $json.link : $json.link }}. - Kombinera båda källorna i Combine Link Sources och ta sedan bort dubbletter med Remove Duplicate Links.
Steg 4: crawla sidor och lägg in kunskap i vektordatabasen
Iterera genom unika länkar, hämta sidans HTML och lägg in sidtexten i vektordatabasen.
- I Iterate Link Batches behåller ni standardinställningarna för batching för att bearbeta länkar sekventiellt.
- I BrightData Page Fetch ställer ni in url till
{{ $json.link }}och behåller format somjson. - Autentiseringsuppgifter krävs: Anslut era brightdataApi-autentiseringsuppgifter i BrightData Page Fetch.
- I HTML Body Extractor behåller ni operation som
extractHtmlContentför att fånga sidans body. - Säkerställ att Vector Store Inserter tar emot sidtext och är satt till mode
insertmed memoryKeyvector_db. - Låt Pause Workflow vara ansluten efter Vector Store Inserter så att batchar kan återupptas via Iterate Link Batches.
Tips: Direct API HTTP Request och Direct API HTTP Request 2 finns för alternativa BrightData API-anrop och kan användas för felsökning eller framtida utbyggnad.
Steg 5: sätt upp AI-inläsning och hämtning av kunskap
Konfigurera embeddings, dokumentinläsning och vektordatabasverktyget som används av AI-agenten.
- I Default Data Ingest ställer ni in jsonData till
{{ $json.raw_text }}och behåller jsonMode somexpressionData. - I Recursive Text Splitter ställer ni in chunkSize till
300. - I In-Memory Vector Store ställer ni in mode till
insert, memoryKey tillvector_dboch clearStore tilltrue. - Autentiseringsuppgifter krävs: Anslut era openAiApi-autentiseringsuppgifter i OpenAI Embedding Builder (detta driver embeddings för In-Memory Vector Store och Vector Store Inserter).
- I Vector Store Tool ställer ni in toolName till
vector_dboch bekräftar att toolDescription beskriver er kunskapsbas. - Autentiseringsuppgifter krävs: Anslut era openAiApi-autentiseringsuppgifter i OpenAI Embedding Builder 2 (detta driver embeddings för Vector Store Tool).
⚠️ Vanlig fallgrop: AI-verktygsnoder som Vector Store Tool använder embeddings från sina anslutna embedding-noder—lägg till autentiseringsuppgifter i OpenAI Embedding Builder och OpenAI Embedding Builder 2, inte i verktygsnoderna.
Steg 6: konfigurera SMS-webhooken och kontaktuppslag
Ta emot inkommande SMS och hämta avsändarens kontaktuppgifter.
- I GHL SMS Reply Webhook behåller ni path satt till
54259c33-52c0-4a19-97fe-3414a153f4d6och aktiverar POST-metoder. - I Inbound Message Check behåller ni villkoret att leftValue
{{ $json.body.type }}är lika medInboundMessage. - I Retrieve GHL Contact ställer ni in contactId till
{{ $json.body.contactId }}och operation tillget. - Autentiseringsuppgifter krävs: Anslut era highLevelOAuth2Api-autentiseringsuppgifter i Retrieve GHL Contact.
- I Apply Website URL ställer ni in website_url till
https://yourwebsite.comför att skicka in den till AI-agenten.
Steg 7: konfigurera AI-svar och SMS-utskick
Koppla AI-agenten till kunskapsbasen och skicka svaret tillbaka via SMS.
- I Conversational AI Agent ställer ni in text till
{{ $('GHL SMS Reply Webhook').item.body.body }}och behåller promptType somdefine. - Säkerställ att OpenAI Chat Engine är ansluten som språkmodell för Conversational AI Agent.
- Autentiseringsuppgifter krävs: Anslut era openAiApi-autentiseringsuppgifter i OpenAI Chat Engine.
- Bekräfta att Redis Conversation Memory är ansluten till Conversational AI Agent med sessionKey satt till
{{ $item("0").$node["GHL SMS Reply Webhook"].json["body"]["contactId"] }}. - Öppna Dispatch SMS via GHL och behåll url som
https://services.leadconnectorhq.com/conversations/messagesoch method somPOST. - I Dispatch SMS via GHL mappar ni contactId till
{{ $('GHL SMS Reply Webhook').item.json.body.contactId }}, message till{{ $json.output }}och toNumber till{{ $('Retrieve GHL Contact').item.json.phone }}. - Autentiseringsuppgifter krävs: Anslut era highLevelOAuth2Api-autentiseringsuppgifter i Dispatch SMS via GHL.
⚠️ Vanlig fallgrop: Om autentiseringsuppgifter för OpenAI Chat Engine saknas kommer Conversational AI Agent att misslyckas med att generera ett svar och inget SMS kommer att skickas.
Steg 8: testa och aktivera ert arbetsflöde
Validera både den schemalagda crawlningen och flödet för inkommande SMS-svar innan ni aktiverar i produktion.
- Använd Execute Workflow för att köra från Scheduled Run Trigger och bekräfta att HTML Content Parser skapar
raw_textochlinks. - Kontrollera att Combine Link Sources och Remove Duplicate Links skickar ut unika URL:er och att Vector Store Inserter tar emot sidinnehåll.
- Skicka ett test-SMS till endpointen för GHL SMS Reply Webhook och verifiera att Inbound Message Check passerar med
InboundMessage. - Bekräfta att Dispatch SMS via GHL returnerar ett lyckat svar och att SMS:et levereras till kontaktens telefonnummer.
- Aktivera arbetsflödet med Active-reglaget för att slå på den schemalagda crawlningen och automatiseringen för inkommande SMS.
Tips för felsökning
- GoHighLevel OAuth-uppgifter kan gå ut eller sakna nödvändiga scopes. Om svar plötsligt slutar komma, kontrollera credential-statusen i n8n och bekräfta att ”conversations/message”-scopes fortfarande är beviljade.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om noder längre fram fallerar på tomma svar.
- Bright Data-skrapning kan misslyckas på bot-skyddade sidor om Web Unlocker inte är korrekt konfigurerad. Kontrollera loggarna i din Bright Data-dashboard först och bekräfta sedan att Authorization-headern fortfarande är giltig i dina HTTP/Bright Data-credentials.
- Standardprompter i AI-noder är generiska. Lägg in din tonalitet tidigt, annars kommer du att redigera output för alltid.
Snabba svar
Cirka 1–2 timmar om din GoHighLevel-app och OpenAI-nyckel är redo.
Nej. Du kopplar konton, klistrar in API-nycklar och justerar några inställningar i n8n.
Ja. n8n har ett gratis alternativ för egen hosting 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å räkna med OpenAI API-kostnader, som vanligtvis är några cent per konversation beroende på meddelandelängd.
Två alternativ: n8n Cloud (hanterad tjänst, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och klarar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det borde du förmodligen. Du kan ändra noden Assign Website URL (Set) för att rikta in dig på en subdomän eller ett specifikt hjälpcenter och sedan justera grenen för sitemap-tolkning för att inkludera eller exkludera vissa sökvägar. Många team redigerar också instruktionerna till AI-agenten för att tvinga fram en kortare SMS-stil, lägga till en compliance-disclaimer eller routa ”pris”-frågor till en människa. Om du hellre vill lagra kunskap långsiktigt kan du byta ut noderna för in-memory vektorlager mot en hostad vektordatabas som Pinecone eller Supabase.
Oftast beror det på utgångna OAuth-uppgifter eller saknade scopes i din GoHighLevel Marketplace-app. Autentisera om HighLevel-credential i n8n och bekräfta att din app fortfarande har ”conversations/message.readonly” och ”conversations/message.write”. Om webhooken triggar men svar inte skickas, kontrollera också de direkta HTTP request-noderna för en ändrad endpoint eller att location/sub-account inte matchar.
På n8n Cloud beror det på din plans månatliga antal körningar; vid egen hosting finns ingen körningsgräns utöver din serverkapacitet. I praktiken kan de flesta team hantera från ett par dussin upp till några hundra SMS-konversationer per dag så länge dina OpenAI- och skrapningsgränser är rimligt satta.
Ofta, ja, eftersom det här inte bara är ”nytt SMS in, skicka SMS ut”. Du underhåller en levande kunskapsbas, skrapar sidor, delar upp text, skapar embeddings och använder retrieval så att svaren förankras i din webbplats. n8n hanterar den typen av förgreningslogik utan att varje extra steg blir ett prissättningsproblem. Zapier eller Make kan fungera om du bara behöver en enkel autosvarare, men de blir snabbt klumpiga när du lägger till crawling, deduplicering av länkar, batchning och minne. Den andra stora faktorn är kontroll: med n8n kan du köra egen hosting och hålla data där du vill ha den. Om du tvekar, prata med en automationsexpert så gör vi en rimlighetskoll av ditt användningsfall.
Sätt upp det en gång och låt sedan din webbplats stå för förklaringen i GoHighLevel. Teamet kan fokusera på de konversationer som faktiskt kräver en människa.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.