Din leadlista blir egentligen aldrig riktigt ”klar”. Du skrapar en batch, klistrar in den i ett ark, skickar några mejl och tappar sedan bort vem som öppnade, vem som studsade och vem som faktiskt svarade.
Säljansvariga märker det när uppföljningar glider. En person inom marketing ops märker det när rapportering förvandlas till detektivarbete. Och om du driver en byrå är automatisering för Sheets SendGrid leads skillnaden mellan ”vi mejlade dem” och ”vi kan bevisa vad som hände”.
Det här arbetsflödet knyter ihop hela loopen: skrapa Google Maps-leads, lagra dem i Google Sheets, skicka spårad outreach i SendGrid och fånga sedan svar från Gmail och routa dem med AI. Du får se hur det fungerar, vad du behöver och vilka resultat du kan förvänta dig.
Så fungerar automatiseringen
Här är hela arbetsflödet du kommer att sätta upp:
n8n Workflow Template: Google Sheets + SendGrid: spåra leads från start till mål
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n64@{ icon: "mdi:database", form: "rounded", label: "Update DB1", pos: "b", h: 48 }
n65@{ icon: "mdi:database", form: "rounded", label: "Update DB2", pos: "b", h: 48 }
n66@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n67@{ icon: "mdi:swap-vertical", form: "rounded", label: "Forward Emails (Sales Dept)", pos: "b", h: 48 }
n68["<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/>Email Structure"]
n69@{ icon: "mdi:database", form: "rounded", label: "Update DB3", pos: "b", h: 48 }
n70@{ icon: "mdi:message-outline", form: "rounded", label: "Label Interested", pos: "b", h: 48 }
n71@{ icon: "mdi:message-outline", form: "rounded", label: "Label Not Interested", pos: "b", h: 48 }
n72@{ icon: "mdi:message-outline", form: "rounded", label: "Label Misc", pos: "b", h: 48 }
n73@{ icon: "mdi:swap-vertical", form: "rounded", label: "Leads Converted", pos: "b", h: 48 }
n74@{ icon: "mdi:robot", form: "rounded", label: "Create email labels", pos: "b", h: 48 }
n75@{ icon: "mdi:database", form: "rounded", label: "Get Route_Message_Id", pos: "b", h: 48 }
n76@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Only Emails with ID", pos: "b", h: 48 }
n77@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n78@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n79@{ icon: "mdi:database", form: "rounded", label: "Update DB4", pos: "b", h: 48 }
n80["<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/>Extract ID1"]
n81@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n82@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email reply only1", pos: "b", h: 48 }
n83["<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/>Extract unprocessed emails1"]
n84@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing2", pos: "b", h: 48 }
n85@{ icon: "mdi:message-outline", form: "rounded", label: "Get many messages (20)1", pos: "b", h: 48 }
n72 --> n65
n69 --> n73
n80 --> n76
n81 --> n69
n66 --> n67
n68 --> n66
n73 --> n81
n70 --> n79
n82 --> n83
n77 -.-> n74
n78 --> n85
n78 --> n75
n74 --> n70
n74 --> n67
n74 --> n73
n74 --> n71
n74 --> n72
n76 --> n74
n76 --> n84
n75 --> n83
n71 --> n64
n85 --> n82
n83 --> n80
n67 --> n68
end
subgraph sg1["Schedule Flow"]
direction LR
n86@{ icon: "mdi:database", form: "rounded", label: "Grab Lead from DB", pos: "b", h: 48 }
n87["<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/>Pick a random template1"]
n88@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing3", pos: "b", h: 48 }
n89@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Opened Or Clicked", pos: "b", h: 48 }
n90@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Delivered But No Replied", pos: "b", h: 48 }
n91@{ icon: "mdi:swap-horizontal", form: "rounded", label: "5 Days & 10 Days Route", pos: "b", h: 48 }
n92@{ icon: "mdi:swap-vertical", form: "rounded", label: "Personalize Email", pos: "b", h: 48 }
n93@{ icon: "mdi:swap-vertical", form: "rounded", label: "Personalize Email1", pos: "b", h: 48 }
n94["<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/sendGrid.svg' width='40' height='40' /></div><br/>Send an email1"]
n95@{ icon: "mdi:database", form: "rounded", label: "Get Follow-Up Email Template..", pos: "b", h: 48 }
n96@{ icon: "mdi:database", form: "rounded", label: "Get 2nd Follow-Up Email Temp..", pos: "b", h: 48 }
n97@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items4", pos: "b", h: 48 }
n98["<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/>Merge4"]
n99@{ icon: "mdi:cog", form: "rounded", label: "Wait4", pos: "b", h: 48 }
n100["<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/>Pick a random template2"]
n101@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger2", pos: "b", h: 48 }
n102@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items5", pos: "b", h: 48 }
n103["<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/>Merge5"]
n104@{ icon: "mdi:cog", form: "rounded", label: "Wait5", pos: "b", h: 48 }
n105@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing4", pos: "b", h: 48 }
n106["<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/sendGrid.svg' width='40' height='40' /></div><br/>Send an email2"]
n99 --> n97
n104 --> n102
n98 --> n92
n103 --> n93
n94 --> n104
n106 --> n99
n97 --> n95
n97 --> n98
n102 --> n96
n102 --> n103
n86 --> n90
n92 --> n106
n101 --> n86
n93 --> n94
n91 --> n97
n91 --> n102
n89 --> n91
n89 --> n88
n87 --> n103
n100 --> n98
n90 --> n89
n90 --> n105
n95 --> n100
n96 --> n87
end
subgraph sg2["On form submission Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Limit", 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/form.svg' width='40' height='40' /></div><br/>On form submission"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Run an Actor", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get dataset items", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Grab Desired Fields", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n6["<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/markdown.dark.svg' width='40' height='40' /></div><br/>Markdown"]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Grab Desired Fields1", 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/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Parse url/website", 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/code.svg' width='40' height='40' /></div><br/>Remove Query Parameters & Fr.."]
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "User-Agents", pos: "b", h: 48 }
n15["<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/>Website Scraping"]
n16@{ icon: "mdi:cog", form: "rounded", label: "Random Wait", 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/code.svg' width='40' height='40' /></div><br/>Extract Email Address"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Leads with Email only", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n0 --> n5
n9 --> n5
n8 --> n11
n11 --> n7
n6 --> n16
n16 --> n9
n14 --> n15
n2 --> n3
n5 --> n7
n5 --> n12
n5 --> n9
n7 --> n18
n7 --> n17
n7 --> n11
n15 --> n6
n3 --> n4
n12 --> n13
n1 --> n2
n4 --> n0
n10 --> n19
n17 --> n8
n18 --> n10
n13 --> n14
end
subgraph sg3["Flow 4"]
direction LR
n32["<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"]
n33@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n34@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n35@{ icon: "mdi:database", form: "rounded", label: "Original DB Update", pos: "b", h: 48 }
n36@{ icon: "mdi:database", form: "rounded", label: "Follow-Up 1 DB Update", pos: "b", h: 48 }
n37@{ icon: "mdi:database", form: "rounded", label: "Follow-Up 2 DB Update", pos: "b", h: 48 }
n38["<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/>Classify Events"]
n39@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route Email Stages", pos: "b", h: 48 }
n40@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n41["<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/>Classify Engagements"]
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Matching field", pos: "b", h: 48 }
n43["<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/>Prioritize DELIVERED first"]
n44@{ icon: "mdi:database", form: "rounded", label: "Update DB", pos: "b", h: 48 }
n45@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n46@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing1", pos: "b", h: 48 }
n47@{ icon: "mdi:cog", form: "rounded", label: "Wait3", pos: "b", h: 48 }
n48["<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/>Merge3"]
n45 --> n39
n47 --> n44
n48 --> n41
n34 --> n43
n34 --> n40
n34 --> n42
n34 --> n46
n32 --> n33
n33 --> n38
n42 --> n48
n38 --> n34
n39 --> n35
n39 --> n36
n39 --> n37
n40 --> n48
n41 --> n47
n43 --> n45
end
subgraph sg4["Schedule Flow"]
direction LR
n49@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n50["<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/>Extract ID"]
n51@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n52@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Parse items with Extract ID ..", pos: "b", h: 48 }
n53@{ icon: "mdi:database", form: "rounded", label: "Original Email", pos: "b", h: 48 }
n54@{ icon: "mdi:database", form: "rounded", label: "1st Follow-Up Email", pos: "b", h: 48 }
n55@{ icon: "mdi:database", form: "rounded", label: "2nd Follow-Up Email", pos: "b", h: 48 }
n56@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email reply only", pos: "b", h: 48 }
n57@{ icon: "mdi:database", form: "rounded", label: "Get Reply_Message_Id", pos: "b", h: 48 }
n58["<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/>Extract unprocessed emails"]
n59@{ icon: "mdi:database", form: "rounded", label: "Update Email Workflow DB", pos: "b", h: 48 }
n60@{ icon: "mdi:database", form: "rounded", label: "Update Processed Gmail IDs DB", pos: "b", h: 48 }
n61@{ icon: "mdi:message-outline", form: "rounded", label: "Get many messages (20)", pos: "b", h: 48 }
n62@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items3", pos: "b", h: 48 }
n63@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch1", pos: "b", h: 48 }
n63 --> n53
n63 --> n54
n63 --> n55
n50 --> n49
n49 --> n62
n56 --> n58
n62 --> n52
n62 --> n50
n51 --> n61
n51 --> n57
n57 --> n58
n61 --> n56
n58 --> n62
n52 --> n59
n52 --> n63
n52 --> n60
end
subgraph sg5["When clicking âExecute workflowâ Flow"]
direction LR
n20@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking âExecute wor..", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n23@{ icon: "mdi:database", form: "rounded", label: "Parse Email Template from DB", pos: "b", h: 48 }
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/>Pick a random template"]
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/sendGrid.svg' width='40' height='40' /></div><br/>Send an email"]
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "Fix Variables", pos: "b", h: 48 }
n27@{ icon: "mdi:database", form: "rounded", label: "Get Leads", pos: "b", h: 48 }
n28@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Not Sent (Not Delivered)", pos: "b", h: 48 }
n29@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items2", pos: "b", h: 48 }
n30["<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/>Merge2"]
n31@{ icon: "mdi:cog", form: "rounded", label: "Limit1", pos: "b", h: 48 }
n21 --> n29
n31 --> n29
n30 --> n26
n27 --> n28
n26 --> n25
n25 --> n21
n29 --> n23
n29 --> n30
n24 --> n30
n23 --> n24
n28 --> n31
n28 --> n22
n20 --> n27
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 n78,n101,n1,n51,n20 trigger
class n74 ai
class n77 aiModel
class n76,n82,n89,n90,n91,n2,n3,n18,n34,n39,n52,n56,n63,n28 decision
class n64,n65,n69,n75,n79,n86,n95,n96,n19,n35,n36,n37,n40,n44,n53,n54,n55,n57,n59,n60,n23,n27 database
class n15,n32 api
class n68,n80,n87,n100,n13,n17,n38,n41,n43,n50,n24 code
classDef customIcon fill:none,stroke:none
class n68,n80,n83,n87,n94,n98,n100,n103,n106,n1,n6,n9,n11,n13,n15,n17,n32,n38,n41,n43,n48,n50,n58,n24,n25,n30 customIcon
Varför detta är viktigt: leadspårning faller sönder efter utskicket
De flesta ”system” för cold outreach faller isär direkt efter att mejlet skickats. Arket har en rad som säger ”skickat”, men ingen vet om det levererades, studsade eller öppnades tre gånger. Svar landar i en delad inkorg, blir vidarebefordrade till någon och försvinner sedan in i Slack utan någon koppling tillbaka till leadposten. En vecka senare jagar du uppföljningar utifrån minnet och halvfärdiga anteckningar. Ärligt talat är det ingen process. Det är ett kaos som blir värre ju mer volymen växer.
Det eskalerar snabbt. Här är var det brister i verkligheten:
- Du skickar mejl i batchar, men leverans- och bounce-status kommer aldrig tillbaka till Google Sheets.
- Svar hanteras manuellt, så ”Intresserade” leads blir liggande i en inkorg tills någon upptäcker dem.
- Uppföljningar sker sent (eller inte alls) eftersom ingen vill filtrera, sortera och kontrollera datum varje dag.
- Din rapportering blir luddig, eftersom öppningar/klick finns i SendGrid-loggar medan leaddata finns någon annanstans.
Vad du bygger: en leadlivscykelloop från skrapning till svar
Det här arbetsflödet kör din outreach som ett sammanhängande system i stället för sex separata uppgifter. Det börjar med en enkel formulärinlämning (nyckelord, plats, leadgräns) som triggar en Google Maps-skrapning via Apify. Varje företag struktureras, kontrolleras för webbplats och genomsöks efter en offentlig e-postadress. Kvalificerade leads läggs in i ditt Google Sheets-CRM, som blir single source of truth för outreach. Därifrån hämtar flödet en roterande mejlmall, personaliserar den med leaddata, bäddar in ett unikt spårnings-ID och skickar via SendGrid. När SendGrid-händelser kommer in via webhooks (levererat, öppnat, klickat, bounce, avregistrerat) uppdaterar arbetsflödet exakt rätt leadrad med prioriterad status och tidsstämplar. Till sist fångar Gmail-svarspollning svar, undviker dubbletter, använder OpenAI för att klassificera intent och routar ”Intresserad”-svar till ditt team, samtidigt som Sheets uppdateras.
Loopen är enkel att förstå. Nya leads kommer in via Google Maps-skrapning, outreach går ut via SendGrid med inbyggd spårning och varje signal (händelser och svar) pushas snyggt tillbaka till ditt CRM så att uppföljningar sker i tid.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du skrapar 50 lokala leads och kör outreach två gånger i veckan. Manuellt är det lätt att bränna cirka 2 timmar på skrapning/export, ytterligare en timme på att rensa webbplatser/mejl och minst en timme under veckan på att kolla SendGrid-statistik, logga svar och sätta upp uppföljningar. Med det här arbetsflödet skickar du in formuläret på en minut, låter skrapning och extraktion gå i bakgrunden (ofta 20–40 minuter beroende på sajter) och lägger din tid bara på riktiga svar. De flesta team får tillbaka cirka 3 timmar per kampanjcykel, plus färre ”vi glömde följa upp”-ögonblick.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- Google Sheets för ditt CRM och mallar.
- SendGrid för att skicka spårad outreach och ta emot webhookhändelser.
- Apify API-nyckel (hämta den i dina kontoinställningar i Apify).
- Gmail API-inloggningsuppgifter (skapa i Google Cloud Console för svarspollning).
- OpenAI API-nyckel (hämta i OpenAI-dashboarden) för svarsklassificering.
Kunskapsnivå: Medel. Du kodar inte från grunden, men du bör vara bekväm med att koppla konton, mappa fält och testa webhooks.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
En formulärinlämning drar igång allt. Du anger ett affärsnyckelord, en plats och hur många leads du vill ha. Den enda inmatningen triggar Apify Google Maps-skrapningen.
Leaddata struktureras, filtreras och berikas. Flödet tar bort poster utan webbplatser, normaliserar URL:er, roterar user agents och hämtar varje sajts HTML för att leta efter offentliga e-postadresser. Det använder också fördröjningar mellan förfrågningar för att undvika att trigga blockeringar.
Outreach skickas med inbyggd spårning. n8n hämtar ditt mallbibliotek från Google Sheets, väljer ett slumpmässigt alternativ, injicerar leadvariabler och skickar via SendGrid med ett unikt inbäddat ID så att framtida händelser och svar matchar rätt post.
Status, engagemang och svar flödar tillbaka till ditt CRM. SendGrid-webhooks uppdaterar fält för ”levererat/öppnat/klickat/bounce/avregistrerat” med prioriteringslogik, medan Gmail-pollning fångar svar, undviker dubbletter och använder OpenAI för att etikettera intent och vidarebefordra de viktiga till ditt team (Slack/Telegram-routing stöds i arbetsflödet).
Du kan enkelt justera timing för uppföljningar och routing-destinationer utifrån dina behov. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera trigger för formulärinskick
Det här arbetsflödet startar när ett formulär skickas in och inkluderar även schemalagda triggers och webhook-baserade triggers för löpande e-posthantering.
- Lägg till och öppna Form Submission Trigger för att fånga inkommande leads från ert formulär.
- Aktivera vid behov Manual Execution Start för ad hoc-körningar av intaget av leadlistan.
- Konfigurera Scheduled Trigger A och Scheduled Trigger B för att polla Gmail-svar enligt ett schema, samt Scheduled Trigger C för att kontrollera uppföljningar för levererade/inga-svar.
- Aktivera Incoming Webhook om ni planerar att skicka in engagemangshändelser till det här arbetsflödet.
Scheduled Trigger A skickar utdata parallellt till både Fetch Recent Gmail och Get Reply Message ID. Scheduled Trigger B skickar utdata parallellt till både Fetch Recent Gmail B och Get Route Message ID.
Steg 2: anslut Google Sheets
Flera Google Sheets-noder lagrar leadlistor, mallar och statusuppdateringar. Anslut autentiseringsuppgifter en gång och tillämpa dem på alla Sheets-noder.
- Öppna valfri Google Sheets-nod (till exempel Retrieve Lead List eller Append Sheet Row).
- Autentiseringsuppgifter krävs: Anslut era Google Sheets-autentiseringsuppgifter.
- Upprepa valet av autentiseringsuppgifter för alla Google Sheets-noder som hanterar mallar och statusar (22+ noder, inklusive Load Email Template DB, Update Original DB, Update DB Status 1, Update DB Status 2, Update DB Status 3 och Update DB Status 4).
- Verifiera blad-ID:n, intervall och skrivoperationer i noder som Append Sheet Row och Modify Processed IDs DB.
⚠️ Vanlig fallgrop: Saknade Google Sheets-autentiseringsuppgifter gör att alla läs-/skrivsteg misslyckas tyst, särskilt i grenar som Route Email Phases och Filter Items w ID.
Steg 3: konfigurera bearbetning för leaddataförädling
Den här fasen hämtar leads från Apify, rensar URL:er och berikar data via webbsidesförfrågningar.
- Konfigurera Execute Actor Task för att köra er Apify-actor och skicka in leadindata från Form Submission Trigger.
- Autentiseringsuppgifter krävs: Anslut era Apify-autentiseringsuppgifter i Execute Actor Task och Fetch Dataset Items.
- Använd Select Needed Fields och Parse Website URL för att normalisera leadposter innan scraping.
- Rensa och förbered URL:er via Strip URL Extras och ställ sedan in headers i Assign User Agents.
- Konfigurera Web Page Request för att hämta innehållet på leadets webbplats, och formatera det sedan med Render Markdown.
Tips: Render Markdown och Web Page Request är konfigurerade att fortsätta vid fel – säkerställ att era efterföljande steg kan hantera tomt innehåll.
Steg 4: konfigurera utskick av outreach-e-post
Det här steget batchar leads, väljer mallar, personaliserar innehåll och skickar e-post via SendGrid.
- Styr volymen med Cap Records och Batch Iterate Items innan personalisering.
- Normalisera variabler i Normalize Variables efter att mallar har slagits ihop i Combine Streams B.
- Ladda mallar från Load Email Template DB och välj en med Choose Random Template.
- Skicka outreach via Dispatch Email och köa sedan uppföljningstid i Delay Step.
- Autentiseringsuppgifter krävs: Anslut era SendGrid-autentiseringsuppgifter i Dispatch Email, Dispatch Email B och Dispatch Email C.
Dispatch Email skickar utdata till Delay Step, som sedan flödar vidare till Batch Iterate Items B för kontinuerlig batchning.
Steg 5: konfigurera AI-klassificering för Create Email Labels
Inkommande svar etiketteras och routas med textklassificeringsnoden som är ansluten till OpenAI.
- Konfigurera Create Email Labels för att klassificera svar i utfall som Interested, Not Interested eller Misc.
- Koppla OpenAI Chat Engine som språkmodell för Create Email Labels.
- Autentiseringsuppgifter krävs: Anslut era OpenAI-autentiseringsuppgifter i OpenAI Chat Engine (autentiseringsuppgifter läggs till på den överordnade AI-noden, inte Create Email Labels).
Create Email Labels skickar utdata parallellt till Apply Label Interested, Forward Emails to Sales och Process Converted Leads.
Steg 6: konfigurera Gmail-intag och routing
Svarsbearbetning använder schemalagda Gmail-hämtningar, filtrering och routing för att matcha svar med arbetsflöden.
- Autentiseringsuppgifter krävs: Anslut era Gmail-autentiseringsuppgifter i Fetch Recent Gmail, Fetch Recent Gmail B, Send Gmail Message, Apply Label Interested, Apply Label Not Interested och Apply Label Misc.
- Filtrera svar med Filter Reply Emails och Filter Reply Emails B, och slå sedan ihop i Merge Unprocessed Emails och Merge Unprocessed Emails B.
- Extrahera identifierare med Extract Message ID och Extract Route ID innan ni utvärderar Only Emails With ID.
- Routa efter mall med Route by Template, som skickar till Load Original Email, Load Follow-Up Email 1 eller Load Follow-Up Email 2.
Filter Items w ID skickar utdata parallellt till Modify Email Workflow DB, Route by Template och Modify Processed IDs DB.
Steg 7: konfigurera uppföljningslogik och engagemangsuppdateringar
Den här grenen hanterar kategorisering av engagemang, timing för uppföljning och databasuppdateringar för varje fas.
- Bearbeta engagemang med Classify Event Types och routningslogik med Route by Condition.
- Kombinera engagemangsdata via Combine Streams C och poängsätt sedan via Categorize Engagements.
- Använd Check Delivered No Reply och Check Opened Or Clicked för att avgöra uppföljningstid i Route 5 or 10 Days.
- Ladda uppföljningsmallar via Load Follow-Up Template DB och Load Second Follow-Up DB, och personalisera sedan i Personalize Email A och Personalize Email B.
- Skicka uppföljningar via Dispatch Email C och Dispatch Email B, följt av Delay Step D och Delay Step E.
Tips: Väntnoderna (Delay Step A, Delay Step B, Delay Step C, Delay Step D, Delay Step E och Randomized Pause) hjälper till att styra takten i outreach – justera varaktigheter noggrant för att hålla er compliant.
Steg 8: granska no-op-platshållare och felsökningsvägar
No-op-noder finns för att hålla plats för framtida logik eller för felsökning; verifiera om ni behöver ersätta dem med faktiska åtgärder.
- Inspektera No-Op Placeholder, No-Op Placeholder A, No-Op Placeholder B, No-Op Placeholder C och No-Op Placeholder D.
- Avgör om dessa noder ska logga, notifiera eller förgrena till nya åtgärder i ert produktionsarbetsflöde.
Steg 9: testa och aktivera ert arbetsflöde
Validera varje trigger-väg och aktivera sedan arbetsflödet för produktion.
- Använd Manual Execution Start för att köra ett kontrollerat test av Retrieve Lead List och bekräfta att utgående e-post skickas.
- Trigga Form Submission Trigger med exempeldata och verifiera att Apify-, beriknings- och sheet-uppdateringsgrenarna slutförs.
- Kontrollera Gmail-grenarna genom att köra Scheduled Trigger A och Scheduled Trigger B och bekräfta att etiketter och routing tillämpas korrekt.
- En lyckad körning ska resultera i val av mall, leverans via SendGrid och uppdaterade statusar i Google Sheets.
- När allt stämmer, växla arbetsflödet till Active för att köra i produktion.
Felsökningstips
- SendGrid-inloggningsuppgifter och inställningar för webhook-signering kan ställa till det. Om händelser inte uppdaterar Google Sheets, kontrollera SendGrids sida för Event Webhook och bekräfta att n8n-webhook-URL:en är korrekt och aktiverad.
- Om du använder Wait-noder eller extern skrapning varierar processtider. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-klassificeringsnoderna är generiska. Lägg in dina definitioner av ”Intresserad” och ”Inte intresserad” tidigt, annars kommer du att etikettera om svar manuellt.
Snabba svar
Räkna med cirka 60–90 minuter om du redan har dina nycklar och dina Sheets redo.
Nej. Du kommer främst att koppla konton och justera några fältmappningar.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på $20/månad för högre volym. Du behöver också räkna med OpenAI API-kostnader (ofta några dollar i månaden för typisk svarsklassificering) och Apify-användning beroende på skrapvolym.
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) 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 serveradministration.
Ja, och det bör du sannolikt. Du kan byta ut Apify Google Maps-skapern mot en annan Apify actor i steget ”Execute Actor Task”, eller ersätta Google Sheets-CRM:et med Airtable och samtidigt behålla SendGrid-webhooks intakta. Vanliga anpassningar är att ändra uppföljningsschemat (5/10 dagar till din kadens), skriva om mallbiblioteket i Templates-arket och routa ”Intresserad”-svar till en annan plats (Slack, Telegram eller en sälj-inkorg).
Oftast är det ett problem med API-nyckeln eller saknade behörigheter på nyckeln. Uppdatera SendGrid-credential i n8n och verifiera sedan att Event Webhook är aktiverad i SendGrid och skickar de händelsetyper du förväntar dig (levererat, öppning, klick, bounce). Om du ändrade webhook-URL:en efter testning kan SendGrid fortfarande posta till den gamla. Kontrollera även rate limiting om du skickar stora batchar samtidigt.
Om du self-hostar finns ingen körningsgräns (det beror främst på din server, SendGrid-gränser och hur aggressiv din skrapning är). På n8n Cloud styr din plan antalet månadskörningar, så outreach med hög volym innebär oftast att du behöver uppgradera. I praktiken kör de flesta team detta i dagliga batchar om 20–200 leads för att hålla leveransbarheten sund och undvika att webbplatsskrapning blir blockerad.
Ofta, ja. Det här flödet blandar skrapning, batchning, väntesteg, prioriteringslogik för händelsestatusar och AI-klassificering, vilket är där Zapier-scenarier snabbt blir dyra eller klumpiga. n8n ger dig också self-hosting, så du kan köra frekventa webhookuppdateringar utan att räkna varje steg som om det vore en dyr resurs. Om du bara behöver ”ny rad i Sheets → skicka mejl” fungerar Zapier eller Make bra. När du bryr dig om svarsrouting och livscykelspårning är n8n det mer praktiska verktyget. Om du vill ha en second opinion innan du bestämmer dig, prata med en automationsexpert.
När detta väl rullar slutar ditt Google Sheet vara en avlastningsyta och blir en levande pipeline som du faktiskt kan driva. Arbetsflödet tar hand om de repetitiva uppdateringarna, så att du kan fokusera på konversationerna som blir intäkter.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.