Någon glömmer en födelsedag. Eller en årsdag. Det är aldrig illvilligt, men det landar alltid likadant: pinsam tystnad, följt av ett stressat ”oj då”-meddelande som känns… tunt.
Den här Sheets Chat automation träffar People Ops först, men kontorsansvariga och byråledare märker av den också. Du vill ha konsekventa kulturögonblick utan att behöva vakta en kalender varje morgon.
Det här workflowet skannar ert personalark dagligen, använder Gemini för att skriva en ny gratulationstext, publicerar den i Google Chat och loggar vad som hände så att du inte dubbelpostar. Du får se exakt hur det fungerar, vad du behöver och var team oftast snubblar.
Så fungerar den här automatiseringen
Hela n8n-workflowet, från trigger till slutligt resultat:
n8n Workflow Template: Google Sheets + Google Chat: milstolpeinlägg klara
flowchart LR
subgraph sg0["Scheduled Anniversary Start Flow"]
direction LR
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Anniversary Start", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Anniversary Records", pos: "b", h: 48 }
n6@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Engine 2", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Compose Anniversary Note", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Anniversary Settings", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Capture Today Date", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Post Anniversary Chat"]
n15@{ icon: "mdi:database", form: "rounded", label: "Retrieve Anniversary Dates", 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/>Parse Anniversary Data"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Anniversary Status Check", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Log Anniversary Event", pos: "b", h: 48 }
n11 --> n17
n12 --> n20
n15 --> n11
n20 --> n5
n5 --> n7
n17 --> n18
n9 --> n15
n4 --> n9
n7 --> n12
n18 --> n5
n6 -.-> n7
end
subgraph sg1["Scheduled Automation Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Scheduled Automation Start", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Birthday Status Check", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Birthday Records", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Engine", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Compose Birthday Note", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Birthday Settings", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Post Birthday Chat"]
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/>Parse Birthday Data"]
n16@{ icon: "mdi:database", form: "rounded", label: "Retrieve Birthday Dates", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Log Birthday Event", pos: "b", h: 48 }
n13 --> n19
n10 --> n16
n19 --> n2
n16 --> n14
n14 --> n1
n2 --> n8
n8 --> n13
n0 --> n10
n1 --> n2
n3 -.-> n8
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 n4,n0 trigger
class n7,n8 ai
class n6,n3 aiModel
class n18,n1 decision
class n15,n20,n16,n19 database
class n12,n13 api
class n17,n14 code
classDef customIcon fill:none,stroke:none
class n12,n17,n13,n14 customIcon
Problemet: milstolpar missas (eller känns copy-pastade)
Medarbetarnas milstolpar är ”små” tills de inte är det. En missad födelsedag kan hänga kvar hos någon hela dagen, särskilt i mindre team där uppskattning är en del av att behålla folk. Även när ni kommer ihåg blir det ytterligare en flik att hålla öppen: att skriva en omtänksam hälsning varje gång, i en morgon som redan har för mycket. Och om ni återanvänder förra månadens mall märker folk det. Den värsta varianten är dubbelpostningen: en välmenande uppföljning som förvandlar en gratulation till brus.
Det blir mycket snabbt. Här är var det oftast fallerar i verkliga team.
- Ni kollar samma Google Sheet om och om igen, eftersom ingen litar på att ”någon annan har koll”.
- Meddelanden skrivs i sista minuten, vilket gör att de låter generiska eller lite fel.
- Någon postar manuellt i Google Chat och glömmer sedan att följa upp, så dubletter dyker upp dagen efter.
- Arbetsårsjubileum är lätta att missa eftersom de inte ligger i samma mentala kalender som födelsedagar.
Lösningen: dagliga milstolpskontroller + AI-skrivna inlägg i Google Chat
Det här workflowet fungerar som en automatiserad HR-assistent som aldrig glömmer. Varje morgon hämtar det er milstolpsdata för medarbetare från Google Sheets och jämför mot dagens datum. Om födelsedagar matchar loopar det igenom de raderna, ber Gemini skriva ett varmt, icke-repetitivt meddelande och postar det direkt i ert valda Google Chat-utrymme. Samma sak görs för arbetsårsjubileum enligt en egen daglig körning. Efter varje inlägg loggas händelsen tillbaka till Google Sheets, vilket ger ett enkelt revisionsspår och betydligt färre ”har vi redan gjort det här?”-ögonblick. Ärligt talat är det den typen av bakgrundsautomatisering som får ett team att känna sig mer omhändertaget utan att skapa mer jobb.
Workflowet startar med två schemalagda triggers (en för födelsedagar, en för jubileum). Därefter tolkar det data från arket, kontrollerar status med enkel If-logik, genererar meddelandet med Gemini, postar via en HTTP Request till Google Chat och loggar till sist resultatet så att morgondagens körning håller sig korrekt och spårbar.
Det du får: automatisering vs. resultat
| Det här workflowet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du har 25 anställda och postar firanden i ett Google Chat-utrymme. Manuellt ser rutinen oftast ut så här: kolla arket (cirka 5 minuter), skriva ett meddelande (cirka 10 minuter), posta det och sedan notera någonstans att det är gjort (ytterligare 5 minuter). Det är ungefär 20 minuter per milstolpe, och en typisk månad kanske ni har 6–8 födelsedagar och jubileum tillsammans, så du lägger runt 2 timmar bara på att hålla jämna steg. Med det här workflowet lägger du cirka 10 minuter en gång för att bekräfta kolumnerna i arket och Google Chat Space ID, och sedan kör det dagligen av sig självt.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets som källa för sanning kring medarbetarnas milstolpar.
- Google Chat för att posta firanden i ett Space.
- Google Gemini (PaLM/Gemini)-API-åtkomst för att skriva meddelanden.
- Google Chat API-nyckel/token (från Google Cloud Console API-credentials).
Kunskapsnivå: Nybörjare. Du kopplar konton, klistrar in ID:n/tokens och bekräftar att kolumnerna i arket matchar det workflowet förväntar sig.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett dagligt schema kickar igång. Workflowet körs enligt schema (separat för födelsedagar och jubileum), så att ni inte är beroende av att någon ”kommer ihåg att köra det”.
Er milstolpsdata hämtas från Google Sheets. Det hämtar kolumnerna för födelsedag och anställningsdatum och normaliserar sedan datumen mot ”idag”, så att matchningen blir tillförlitlig även om formateringen i arket är lite inkonsekvent.
Gemini skriver meddelandet för varje person. Raderna bearbetas i batcher och varje milstolpe får ett nytt promptstyrt meddelande. Det är så du undviker att samma slitna formulering dyker upp varje månad.
Google Chat får inlägget och körningen loggas. Workflowet skickar sluttexten till ert valda Space via en HTTP-förfrågan och skriver sedan en loggrad tillbaka till Google Sheets så att du kan se vad som skickats och när.
Du kan enkelt justera ton och stil så att meddelandena matchar er varumärkesröst. Se hela implementeringsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera den schemalagda triggern
Konfigurera de två schematriggrarna så att de körs dagligen, så att arbetsflödet kontrollerar födelsedagar och jubileer vid rätt tidpunkt.
- Öppna Scheduled Automation Start och ställ in schemaregeln att köras vid
9(trigger vid timme 9). - Öppna Scheduled Anniversary Start och ställ in schemaregeln att köras vid
9(trigger vid timme 9). - Bekräfta exekveringsflödet: Scheduled Automation Start → Assign Birthday Settings och Scheduled Anniversary Start → Assign Anniversary Settings.
Steg 2: anslut Google Sheets
Anslut Google Sheets-datakällorna och loggningsdestinationerna för födelsedagar, jubileer och händelsespårning.
- Öppna Retrieve Birthday Dates och välj er Google Sheets-fil och bladlista. Document är
Copy of N8N Wishes Exceloch Sheet ärBirthday List. - Öppna Retrieve Anniversary Dates och välj er Google Sheets-fil och bladlista. Document är
Copy of N8N Wishes Exceloch Sheet ärWork Anni. - Öppna Log Birthday Event och bekräfta att Operation är inställd på
appendmed fälten: TimeStamp ={{ $now }}, Event Type =Birthday, Employee Name ={{ $('Iterate Birthday Records').first().json["EMPLOYEE NAME "] }}. - Öppna Log Anniversary Event och bekräfta att Operation är inställd på
appendmed fälten: TimeStamp ={{ $now }}, Event Type =Anniversary, Employee Name ={{ $('Iterate Anniversary Records').first().json.matches[0].name }}. - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter till Retrieve Birthday Dates, Retrieve Anniversary Dates, Log Birthday Event och Log Anniversary Event.
Steg 3: konfigurera inställningar och dataparsning
Konfigurera organisationsinställningar och säkerställ att logiken för datumparsning är i linje med era kolumnrubriker i arket.
- Öppna Assign Birthday Settings och ställ in: Agency Name till
[YOUR_AGENCY], google chat api key till[CONFIGURE_YOUR_API_KEY], google chat space id till[YOUR_ID]och google chat token till[CONFIGURE_YOUR_TOKEN]. - Öppna Assign Anniversary Settings och ställ in samma fyra fält med era jubileespecifika värden.
- Öppna Capture Today Date och bekräfta att todayIso är inställd på
{{$today}}och att Include Other Fields är aktiverat. - Öppna Parse Birthday Data och verifiera att er kolumnrubrik för födelsedag matchar
Employee DOBi koden. - Öppna Parse Anniversary Data och verifiera att er kolumnrubrik för anställningsdatum matchar
Date Joined \n(dd-MMM-yyyy)ellerDate Joined. - Bekräfta villkorsstyrd routning: Parse Birthday Data → Birthday Status Check och Parse Anniversary Data → Anniversary Status Check.
Employee DOB eller Date Joined \n(dd-MMM-yyyy) kommer parsningnoderna inte att returnera några träffar.Steg 4: konfigurera AI-generering av meddelanden
Anslut Gemini och säkerställ att varje LLM-nod använder rätt prompt och datareferenser.
- Öppna Compose Birthday Note och behåll prompttexten som den är, inklusive uttryck som
{{ $json['EMPLOYEE NAME '] }}och{{ $('Assign Birthday Settings').item.json['Agency Name'] }}. - Öppna Compose Anniversary Note och behåll prompttexten som den är, inklusive uttryck som
{{ $json.matches[0].name }},{{ $json.matches[0].yearsOfService }}och{{ $('Assign Anniversary Settings').first().json['Agency Name'] }}. - Bekräfta språkmodellkopplingarna: Gemini Chat Engine är ansluten till Compose Birthday Note och Gemini Chat Engine 2 är ansluten till Compose Anniversary Note.
- Inloggningsuppgifter krävs: Anslut era googlePalmApi-inloggningsuppgifter till Gemini Chat Engine och Gemini Chat Engine 2. Dessa inloggningsuppgifter läggs till på föräldranoderna, inte kedjenoderna.
Steg 5: konfigurera publicering av meddelanden och loggning
Säkerställ att meddelanden publiceras i Google Chat och att varje händelse loggas för spårbarhet.
- Öppna Post Birthday Chat och bekräfta att URL använder
https://chat.googleapis.com/v1/spaces/{{ $('Assign Birthday Settings').item.json['google chat space id'] }}/messages?key={{ $('Assign Birthday Settings').item.json['google chat api key'] }}&token={{ $('Assign Birthday Settings').item.json['google chat token'] }}. - I Post Birthday Chat ställer ni in Method till
POSToch JSON Body till{"text": {{ JSON.stringify($json.text) }}}. - Öppna Post Anniversary Chat och bekräfta att URL använder
https://chat.googleapis.com/v1/spaces/{{ $('Assign Anniversary Settings').item.json['google chat space id'] }}/messages?key={{ $('Assign Anniversary Settings').item.json['google chat api key'] }}&token={{ $('Assign Anniversary Settings').item.json['google chat token'] }}. - I Post Anniversary Chat ställer ni in Method till
POSToch JSON Body till{"text": {{ JSON.stringify($json.text) }}}. - Verifiera loopordningen: Iterate Birthday Records → Compose Birthday Note → Post Birthday Chat → Log Birthday Event och Iterate Anniversary Records → Compose Anniversary Note → Post Anniversary Chat → Log Anniversary Event.
Steg 6: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera hela flödet end-to-end innan ni schemalägger det för användning i produktion.
- Klicka på Execute Workflow och trigga Scheduled Automation Start eller Scheduled Anniversary Start manuellt för att testa varje gren.
- Bekräfta att en lyckad körning ser ut så här: ett genererat meddelande i Post Birthday Chat eller Post Anniversary Chat, följt av en ny rad i Log Birthday Event eller Log Anniversary Event.
- Om inga händelser hittas, verifiera att Birthday Status Check och Anniversary Status Check matchar korrekt mot
NO_BIRTHDAY_TODAYochNO_ANNIVERSARY_TODAY. - När testerna går igenom växlar ni arbetsflödet till Active så att schemana körs dagligen klockan 09.00.
Vanliga fallgropar
- Google Sheets-autentisering kan löpa ut eller sakna åtkomst till rätt kalkylark. Om det strular: kontrollera först anslutningsstatusen för n8n-credentials och delningsbehörigheterna för arket.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er varumärkesröst tidigt, annars kommer du att redigera utdata i all oändlighet.
Vanliga frågor
Cirka 30 minuter om dina Google-konton och arket är redo.
Nej. Du kopplar främst konton och klistrar in några ID:n och tokens.
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å räkna in kostnader för Gemini API-användning, som vanligtvis är små för korta meddelanden.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja, och det är det bästa. Du kan justera formuleringarna i Gemini chain-noderna “Compose Birthday Note” och “Compose Anniversary Note” och sedan återanvända samma struktur för att posta i ett annat Google Chat Space. Vanliga anpassningar är att lägga till era företagsvärderingar, att använda emojis eller inte och att tagga en chef vid jubileum. Om du vill posta någon annanstans (som Slack) behåller du Google Sheets + datumlogiken och byter ut postenoden.
Oftast är det ett problem med API-nyckel/token eller att Space ID är fel. Skapa om eller dubbelkolla dina Google Chat API-credentials i Google Cloud och uppdatera sedan värdena i workflowets inställningsnoder (de där du anger Space ID, key och token). Bekräfta också att API:t är aktiverat för rätt Google Cloud-projekt. Om det fungerar en gång och sedan fallerar senare kan rate limits dyka upp när du bearbetar många rader i en körning.
För de flesta små team hanterar den hela listan utan problem eftersom den bara postar när datumen matchar. På n8n Cloud Starter kan du köra tusentals körningar per månad, och det här workflowet använder vanligtvis bara några få per dag om du inte har många milstolpar samtidigt. Om du self-hostar finns inget tak för antal körningar (det beror främst på din server). I praktiken är även några hundra anställda helt okej för dagliga scanningar och en liten batch med inlägg.
Ofta, ja, eftersom det här workflowet behöver loopar, villkorskontroller och strukturerad loggning utan att du betalar extra för varje gren. n8n ger dig också ett self-hosting-alternativ, vilket spelar roll när du vill ha förutsägbara kostnader. Zapier eller Make kan fortfarande fungera om du håller det väldigt enkelt, men AI + batchning + loggning blir snabbt rörigt. Om du redan är djupt inne i Google Workspace är n8n:s flexibilitet en tydlig fördel. Prata med en automationsexpert om du vill ha en snabb rekommendation för din setup.
När det här väl rullar slutar milstolpar vara något ni ”försöker komma ihåg”. Workflowet tar hand om de repetitiva delarna, och teamet får den konsekvens de förtjänar.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.