Din leadstatus är bara användbar när den är konsekvent. Men om teamet uppdaterar ett Google Sheet medan din backend ligger i MySQL så glider allt snabbt isär. En rad säger ”Kontaktad”, databasen säger fortfarande ”Ny”, och uppföljningar faller mellan stolarna.
Det här problemet med Sheets MySQL sync slår först mot marketing ops eftersom de lever i kalkylblad hela dagarna. Säljchefer märker det när pipelines ser ”bra” ut ända tills de inte gör det. Och grundare sitter och dubbelkollar rapporter på kvällarna, vilket ärligt talat är en dålig användning av din tid.
Det här arbetsflödet håller Google Sheets och MySQL synkade för leadstatus, enligt schema och vid begäran. Du får se hur det körs, vad det uppdaterar och hur du anpassar det till din egen leadprocess.
Så fungerar automationen
Här är hela arbetsflödet du kommer att sätta upp:
n8n Workflow Template: Synka Google Sheets och MySQL för leadstatus
flowchart LR
subgraph sg0["When clicking "Execute Workflow" Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking 'Execute Workf..", 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/compare.svg' width='40' height='40' /></div><br/>Compare Datasets"]
n2@{ icon: "mdi:cog", form: "rounded", label: "Send Notifications", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Google Sheet Data", pos: "b", h: 48 }
n5["<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/mysql.dark.svg' width='40' height='40' /></div><br/>SQL Get inquiries from Google"]
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/mysql.dark.svg' width='40' height='40' /></div><br/>Add MySQL records"]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Rename GSheet variables", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "No reply too long?", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "DB Status assigned?", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Update GSheet status", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "DB Status in sync?", pos: "b", h: 48 }
n12["<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/mysql.dark.svg' width='40' height='40' /></div><br/>Sync MySQL data"]
n1 --> n6
n1 --> n8
n1 --> n9
n1 --> n11
n3 --> n4
n3 --> n5
n4 --> n7
n11 --> n12
n8 --> n2
n9 --> n10
n7 --> n1
n5 --> n1
n0 --> n4
n0 --> n5
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 n0,n3 trigger
class n8,n9,n11 decision
class n4,n5,n6,n10,n12 database
classDef customIcon fill:none,stroke:none
class n1,n5,n6,n12 customIcon
Varför det här spelar roll: motstridiga leadstatusar
När Google Sheets blir ”receptionen” för leads och MySQL blir ”källan till sanningen” får du två versioner av verkligheten. Någon markerar ett lead som ”Svarat” i arket efter en mejltråd. Samtidigt visar databasen fortfarande ”Inget svar”, så automationer fortsätter att puffa fel person. Det blir värre när flera personer rör samma lead, eftersom det inte finns något pålitligt sätt att avgöra vilken uppdatering som ska gälla. Du lägger energin på att stämma av i stället för att följa upp, rapportera och förbättra konverteringen.
Friktionen byggs på. Här är var det oftast faller isär.
- Statusar uppdateras på ett ställe och glöms sedan på det andra, så varje dashboard blir en diskussion.
- Manuella ”stickprov” tar cirka en timme i veckan och missar ändå specialfall och dubbla rader.
- Timing för uppföljning blir rörig eftersom ”senaste aktivitet” beror på vilket system du tittade i.
- Folk slutar lita på arket, vilket gör att de slutar använda det konsekvent.
Vad du bygger: en tvåvägssynk för leadstatus
Det här arbetsflödet synkar leadposter mellan ett Google Sheet (din flik ”Form Responses 1”) och en MySQL-tabell (i det här fallet ConcertInquiries). Det kan köras enligt ett vardagsschema så att ditt ark och din databas håller sig i synk under kontorstid, och du kan också köra det manuellt när du behöver en omedelbar uppdatering. Arbetsflödet hämtar rader från Google Sheets, hämtar matchande rader från MySQL filtrerade till samma leadkälla och jämför sedan båda datamängderna med hjälp av gemensamma fält som tidsstämpel och källnamn. Om MySQL har den mest uppdaterade statusen skriver arbetsflödet tillbaka den till arkets kolumn ”DB Status”. Om arket indikerar att posten ska markeras som synkad uppdaterar det MySQL-postens källfält så att efterföljande system kan behandla den som avstämd. Det kontrollerar även leads som har väntat för länge utan svar (cirka fyra timmar i det här arbetsflödet) så att du kan trigga notifieringar eller interna åtgärder.
Arbetsflödet startar med att samla in data från båda systemen. Därefter mappar det arkkolumner till ett databasanpassat format, jämför vad som ändrats och applicerar rätt uppdateringar i rätt riktning. Till sist flaggar det fall med ”inget svar” för uppföljning så att de inte blir liggande obemärkta i arket.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du får 30 nya leads om dagen från ett Google Form och att du spårar statusändringar i ett delat ark. Manuellt tar det kanske 2 minuter per lead att söka, jämföra och uppdatera, vilket blir ungefär en timme om dagen när du räknar in misstag och omkontroller. Med det här arbetsflödet lägger du ett par minuter på att verifiera första körningen, sedan synkar det enligt schema mellan 06:00 och 22:00 på vardagar. Uppdateringarna sker i bakgrunden, och ”inget svar på fyra timmar” kan trigga en påminnelse innan leadet kallnar.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Google Sheets för leadintag och statuskolumn.
- MySQL-databas för att lagra och uppdatera leadposter.
- Google-inloggningsuppgifter (konfigureras i n8n Google Sheets-credentials)
Kunskapsnivå: Medel. Du ska känna dig bekväm med att koppla upp credentials och matcha fält som tidsstämplar och statusvärden.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
En schemalagd (eller manuell) körning sätter igång. På vardagar kör arbetsflödet mellan 06:00 och 22:00, och du kan även köra det manuellt när du vill testa eller tvinga fram en uppdatering.
Båda systemen läses in parallellt. n8n hämtar rader från ditt Google Sheet och frågar MySQL efter den delmängd leads där source_name är satt till GoogleForm, så att jämförelserna håller sig relevanta.
Fält struktureras innan jämförelsen. Ett mappningssteg döper om arkkolumner och standardiserar värden (inklusive att sätta ett konsekvent källnamn) så att ”samma lead” verkligen betyder samma lead när datamängderna slås ihop och kontrolleras.
Uppdateringar sker bara när logiken säger att de ska. Om databasstatusen ska gälla uppdateras cellen ”DB Status” i Sheets. Om posten behöver flaggas som synkad uppdateras MySQL-fältet source_name till en synkmarkör som används av ditt system.
Du kan enkelt ändra ”inget svar”-fönstret eller vilka fält som används för matchning baserat på dina behov. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera triggers
Sätt upp både manuell och schemalagd trigger för att starta synken från Google Sheets till MySQL.
- Lägg till och konfigurera Manual Run Trigger för att möjliggöra körning vid behov.
- Lägg till Scheduled Automation Trigger och ställ in Rule → Cron Expression till
*/30 6-22 * * 1-5för att köra var 30:e minut under kontorstid på vardagar. - Koppla båda triggers så att Manual Run Trigger skickar output till Retrieve Sheet Entries och Fetch MySQL Inquiries parallellt, och att Scheduled Automation Trigger skickar output till Retrieve Sheet Entries och Fetch MySQL Inquiries parallellt.
Scheduled Automation Trigger skickar output till både Retrieve Sheet Entries och Fetch MySQL Inquiries parallellt, och Manual Run Trigger skickar output till både Retrieve Sheet Entries och Fetch MySQL Inquiries parallellt.
Steg 2: Anslut Google Sheets
Konfigurera Google Sheets för att läsa formulärsvar och uppdatera statusvärden i databasen.
- Öppna Retrieve Sheet Entries och ställ in Document ID till
https://docs.google.com/spreadsheets/d/[YOUR_ID]och Sheet Name tillForm Responses 1. - I Retrieve Sheet Entries behåller ni Filters med Lookup Column satt till
DB Statusoch aktiverar Return All Matches. - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Retrieve Sheet Entries.
- Öppna Update Sheet Status och ställ in Operation till
update, Document ID tillhttps://docs.google.com/spreadsheets/d/[YOUR_ID], och Sheet Name tillForm Responses 1. - I Update Sheet Status mappar ni DB Status till
{{ $json.different.db_status.inputB }}och Timestamp till{{ $json.keys.timestamp }}, med Matching Columns satt tillTimestamp. - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Update Sheet Status.
Steg 3: Anslut MySQL-datakällor
Sätt upp MySQL-noder för att läsa befintliga förfrågningar och skriva uppdaterade poster.
- Öppna Fetch MySQL Inquiries och ställ in Operation till
selectmed Return All aktiverat. - I Fetch MySQL Inquiries ställer ni in Table till
ConcertInquiriesoch lägger till Where-villkoretsource_name = GoogleForm. - Inloggningsuppgifter krävs: Anslut era mySql-uppgifter i Fetch MySQL Inquiries.
- Öppna Upsert MySQL Rows och ställ in Operation till
upsertmed Column To Match On satt tilltimestampoch Table tillConcertInquiries. - Inloggningsuppgifter krävs: Anslut era mySql-uppgifter i Upsert MySQL Rows.
- Öppna Sync MySQL Records och ställ in Operation till
update, Table tillConcertInquiries, Column To Match On tillid, och Value To Match On till{{ $json.id }}. - I Sync MySQL Records ställer ni in Values To Send → source_name till
{{ $json.source_name }}Sync. - Inloggningsuppgifter krävs: Anslut era mySql-uppgifter i Sync MySQL Records.
Steg 4: Sätt upp datamappning och jämförelse
Transformera och linjera fält från Google Sheets innan de jämförs med poster i databasen.
- Öppna Map Sheet Fields och aktivera Keep Only Set.
- Mappa fält i Map Sheet Fields med dessa uttryck:
{{ $json.Timestamp }},{{ $json["What event are you organizing? "] }},{{ $json["Email Address"] }},{{ DateTime.fromFormat($json["When does the event take place? "], 'M/d/yyyy').toFormat('yyyy-MM-dd') }},{{ $json["Where does the event take place? "] }},{{ $json["Please tell us more about the event. "] }},GoogleForm,{{ $json["DB Status"] }},{{ $json["Your name "] }}. - Konfigurera Compare Data Sets att slå ihop på timestamp och source_name på båda inputs, och ställ in Skip Fields till
record_created,record_updated,id. - Koppla Map Sheet Fields till Compare Data Sets (input A) och Fetch MySQL Inquiries till Compare Data Sets (input B).
Steg 5: Konfigurera villkorlig routing och statusuppdateringar
Definiera logik för notiser, statussynk och databasuppdateringar baserat på jämförelseresultatet.
- Från Compare Data Sets routar ni till Upsert MySQL Rows för att infoga eller uppdatera nya poster.
- Konfigurera Check Reply Delay med villkoret DateTime där Value 1 är
{{ DateTime.fromFormat($json.timestamp, 'MM/d/yyyy HH:mm:ss'); }}och Value 2 är{{ DateTime.now().minus({ hours: 4 }) }}med Operationbefore. - Koppla Check Reply Delay till Dispatch Notifications för poster som är äldre än 4 timmar.
- Konfigurera Validate DB Status med Value 1 satt till
{{ $json.different.db_status.inputB }}och OperationisNotEmpty, och koppla den sedan till Update Sheet Status. - Konfigurera Verify Status Sync med Value 1 satt till
{{ $json.source_name }}och OperationisNotEmpty, och koppla den sedan till Sync MySQL Records.
timestamp och source_name.Steg 6: Testa och aktivera ert arbetsflöde
Kör ett manuellt test, verifiera uppdateringar i båda systemen och aktivera den schemalagda synken.
- Klicka på Execute Workflow och trigga Manual Run Trigger för att köra ett fullständigt test.
- Bekräfta att körningen lyckades genom att kontrollera att Upsert MySQL Rows skriver till
ConcertInquiriesoch att Update Sheet Status uppdaterar kolumnenDB Status. - Verifiera att Sync MySQL Records uppdaterar
source_nameså att det inkluderar suffixetSyncför matchade poster. - Aktivera workflowet för att möjliggöra Scheduled Automation Trigger för löpande användning i produktion.
Tips för felsökning
- Google Sheets-credentials kan löpa ut eller tappa åtkomst till ett specifikt kalkylark. Om det slutar fungera, kontrollera n8n-credential och bekräfta först att Google-kontot kan öppna arket.
- Om du använder Wait-noder eller extern rendering varierar processtider. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- MySQL-uppdateringar kan misslyckas i tysthet när ”matchnyckeln” inte är helt unik. Dubbelkolla din tidsstämpelformatering och säkerställ att din WHERE-sats träffar en rad per lead.
Snabba svar
Cirka 30 minuter om ditt ark och din databas redan är åtkomliga.
Nej. Du kopplar ihop Google Sheets och MySQL och mappar sedan några fält som status och tidsstämpel.
Ja. n8n har ett gratis alternativ för egen drift 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 in vanliga kostnader för databashosting, eftersom MySQL ingår i din stack.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och hanterar n8n bra. Egen drift ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det borde du sannolikt. Du kan ändra schemafönstret i Scheduled Automation Trigger, byta ark/flik i Retrieve Sheet Entries och uppdatera mappningsreglerna i Map Sheet Fields så att de matchar dina kolumnnamn. Många team justerar också regeln för ”inget svar” i Check Reply Delay från fyra timmar till något som passar deras säljcykel, och byter namn på synkmarkören som skrivs till MySQL så att den matchar deras egna konventioner.
Oftast är det en utgången Google auth-token eller att det kopplade kontot tappat behörighet till kalkylarket. Anslut Google Sheets-credential på nytt i n8n och bekräfta att exakt kalkylark och fliknamn fortfarande finns. Om någon duplicerade eller bytte namn på filen kan noden se ”rätt” ut men ändå peka på fel ställe.
Hundratals till några tusen rader per körning är realistiskt för de flesta små team, och begränsningen är oftast din databas och Google API-kvoter, inte n8n i sig.
Ofta, ja, eftersom det här inte bara är ”skicka rad A till verktyg B”. Du jämför två datamängder, gör villkorade uppdateringar och upprätthåller regler som ”skriv bara tillbaka om DB Status är tilldelad”. n8n hanterar förgreningar och dataformning utan att arbetsflödet blir en hög med betalda tasks. Zapier och Make kan fortfarande fungera om din process är väldigt enkel, men de blir klumpiga när du behöver riktig avstämningslogik. Om du är osäker, prata med en automationsexpert och beskriv ditt leadflöde på vanlig svenska. Du får en tydlig rekommendation.
När Sheets och MySQL är överens om leadstatus blir allt annat enklare: uppföljningar, rapportering och överlämningar. Sätt upp det en gång, och låt sedan arbetsflödet göra det tråkiga jobbet.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.