Att hålla igång ”dagliga yogapåminnelser” låter enkelt tills du letar efter länkar till positioner, formaterar om meddelanden och inser att du glömde skicka igen.
Den här konfigurationen för Sheets LINE reminders träffar yogalärare först, om vi ska vara ärliga. Men studioägare och marknadsförare som driver community-kanaler känner samma friktion. Du får konsekventa, välskrivna påminnelser som går ut enligt schema – utan den kvällliga copy-paste-rutinen.
Nedan ser du hur arbetsflödet hämtar positioner från Google Sheets, använder Azure OpenAI för att vässa formuleringen, bygger ett LINE Flex Message och loggar vad som skickades så att du kan fortsätta förbättra.
Så fungerar den här automatiseringen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: Google Sheets till LINE: yogapåminnelser
flowchart LR
subgraph sg0["Trigger 2130 YogaPosesToday Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model2", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "YogaLog", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model3", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model1", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "PosesDatabase1", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "YogaLog2", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n10@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger 2130 YogaPosesToday", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model5", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Get PoseName", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "WritePosesToday", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "RewritePosesToday", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "WriteJSONflex", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser1", pos: "b", h: 48 }
n19@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model6", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "Azure OpenAI Chat Model4", 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/code.svg' width='40' height='40' /></div><br/>Code"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Line Push with Flex Bubble"]
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "CombineAll", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Fix JSON", pos: "b", h: 48 }
n21 --> n16
n1 --> n6
n6 --> n9
n24 --> n22
n9 --> n8
n23 --> n24
n12 --> n21
n16 --> n13
n7 -.-> n6
n13 --> n14
n14 --> n23
n15 -.-> n16
n4 -.-> n3
n0 -.-> n13
n2 -.-> n6
n20 -.-> n24
n11 -.-> n14
n19 -.-> n18
n5 -.-> n3
n3 -.-> n6
n17 -.-> n18
n18 -.-> n16
n22 --> n1
n10 --> n12
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 n10 trigger
class n3,n5,n6,n13,n14,n16,n17,n18,n24 ai
class n0,n2,n4,n11,n15,n19,n20 aiModel
class n1,n7,n8,n12 database
class n22 api
class n21 code
classDef customIcon fill:none,stroke:none
class n21,n22 customIcon
Problemet: dagliga påminnelser faller isär när de görs manuellt
Dagligt engagemang är tufft när processen hänger på att du kommer ihåg den. En dag skickar du en riktigt bra yogapåminnelse med en korrekt formaterad bild och en hjälpsam länk. Nästa dag är du upptagen, stressar igenom det och meddelandet ser slarvigt ut – eller så blir det inte skickat alls. Över en månad blir de där små missarna till en tyst kanal och en mindre konsekvent praktik för eleverna. Än värre: ”innehållet” finns redan i Google Sheets, men du lägger ändå kvällstid på att göra om rader till något som LINE-användare faktiskt vill trycka på.
Det bygger snabbt upp. Här är var det oftast brister.
- Du skriver om samma typ av påminnelsetext varje kväll och tvekar sedan kring tonläget.
- Bilder och länkar klistras in fel, vilket innebär trasiga tryck och frustrerade användare.
- Utan en sändlogg upprepar du positioner för ofta eller kan inte bevisa vad som gick ut.
- När du vill ha ”en karusell av positioner” i stället för ett enkelt meddelande blir manuell formatering en stor tidstjuv.
Lösningen: Google Sheets → Azure OpenAI → LINE Flex Messages (med loggning)
Det här arbetsflödet gör ditt Google Sheet till en automatiserad motor för dagliga påminnelser i LINE. Vid en schemalagd tid (21:30 Bangkok-tid) hämtar n8n yogapositioner som innehåller positionsnamn, en bild-URL och en referenslänk. Azure OpenAI skriver sedan om meddelandet till något mer lättläst och engagerande, så att du inte skickar en stel databasutskrift. Därefter genererar flödet den JSON som LINE behöver för Flex Messages (de visuella, klickbara ”korten”), dubbelkollar formateringen och skickar den färdiga payloaden till LINE. Efter skickning skriver det tillbaka en strukturerad post till Google Sheets så att du vet vad som levererades och kan finslipa framtida rekommendationer.
Arbetsflödet startar enligt schema, hämtar sedan positionsdata från Google Sheets och omvandlar den till en strukturerad lista. Azure OpenAI sköter text och formatering, och HTTP-anropet skickar en LINE Flex Message-karusell som inkluderar bilder och klickbara länkar. Till sist loggas utskicket tillbaka i ditt ark.
Det här får du: automatisering vs. resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du skickar en påminnelse om ”positioner för i morgon” 5 kvällar i veckan. Manuellt kan du lägga cirka 10 minuter på att välja positioner i Google Sheets, 10 minuter på att skriva ett trevligt meddelande och ytterligare 10 minuter på att bygga ett snyggt LINE-meddelande med bilder och länkar. Det är ungefär 30 minuter per dag, eller cirka 2,5 timmar per vecka. Med det här flödet är ditt ”jobb” att uppdatera arket (kanske 10 minuter totalt) medan den schemalagda triggern, Azure OpenAI-formateringen och LINE-utskicket sker automatiskt.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Google Sheets för din positionsdatabas och sändloggar
- LINE Messaging API för att leverera push-meddelanden till användare
- Azure OpenAI API-åtkomst (hämta nycklar i Azure Portal)
Kunskapsnivå: Mellan. Du kopplar konton, klistrar in API-uppgifter och testar några körningar för att bekräfta att LINE-payloads ser rätt ut.
Vill du inte sätta upp detta själv? Prata med en automatiseringsexpert (gratis 15-minuters konsultation).
Så fungerar det
En schemalagd utskickstid startar allt. n8n kör varje dag 21:30 i Asia/Bangkok, så påminnelsen går ut även när du är upptagen (eller sover).
Positionsdata hämtas från Google Sheets och städas upp. Arbetsflödet hämtar PoseName, bild-URI och URL, och omvandlar det till en strukturerad lista som är enkel att använda för meddelandegenerering.
Azure OpenAI skriver och formaterar innehållet. Ett AI-steg skapar texten för ”vad du ska göra i dag” i en vänlig ton, och ett annat steg förbereder den specifikt för LINE så att meddelandet blir lättläst på mobil.
LINE Flex Message-JSON skapas, normaliseras och skickas. Arbetsflödet bygger Flex-karusellens payload, reparerar automatiskt felaktig JSON vid behov och skickar den via ett HTTP-anrop till LINE Push Message-endpointen. Därefter lägger det till en sändpost tillbaka i Google Sheets.
Du kan enkelt ändra logiken för urval av positioner för att rotera efter svårighetsgrad eller undvika upprepningar baserat på loggen. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera schematriggern
Det här arbetsflödet startar enligt ett tidsschema, så börja med att ställa in triggern.
- Lägg till och öppna Scheduled Pose Trigger.
- Ställ in schemaregeln så att den körs vid Hour
21och Minute30(enligt konfiguration). - Bekräfta att arbetsflödets tidszon i inställningarna är
Asia/Bangkokför konsekvent timing.
Steg 2: Anslut Google Sheets för pose-data och loggar
Dessa noder läser pose-data och skriver loggar till Google Sheets.
- Öppna Retrieve Pose Names och ställ in sheet-intervallet till
B18:D28under Data Location On Sheet. - Välj Sheet Name
NotePadoch ställ in Document ID till ert kalkylark (ersätt[YOUR_ID]). - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Retrieve Pose Names.
- Öppna Yoga Pose Sheet Tool och ställ in Sheet Name till
Yogamed korrekt Document ID. - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Yoga Pose Sheet Tool. Verktyget används av AI Task Orchestrator.
- Öppna Append Pose Log 2 och verifiera kolumnmappningarna: Date
{{ $('Scheduled Pose Trigger').first().json.timestamp }}, Pose{{ $json.name }}, Sequence{{ $json.sequence }}. - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Append Pose Log 2.
- Öppna Append Yoga Log och verifiera mappningarna: Date
{{ $('Scheduled Pose Trigger').first().json.timestamp }}, JSON{{ $('Assemble Line Payload').item.json.LineBody }}, Text{{ $('Format Pose Text').item.json.text }}. - Inloggning krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Append Yoga Log.
⚠️ Vanlig fallgrop: Ersätt alla [YOUR_ID]-platshållare i Google Sheets-noderna med ert faktiska kalkylarks-ID, annars kommer arbetsflödet att misslyckas med att läsa/skriva data.
Steg 3: Transformera pose-data och expandera pose-poster
Det här steget formaterar pose-datan och delar upp den i enskilda poster för loggning.
- Öppna Transform Pose Data och behåll JavaScript-koden som den är för att bygga
outputTextochposeNamesOnly. - Säkerställ att Expand Pose List använder Field to Split Out satt till
output.yogaPoses. - Bekräfta körflödet: Retrieve Pose Names → Transform Pose Data → Generate Flex JSON, och AI Task Orchestrator → Expand Pose List → Append Pose Log 2.
Steg 4: Sätt upp AI- och parsningkedjan
Flera Azure OpenAI-modeller och parsers genererar och rensar meddelandet samt Flex-JSON.
- Konfigurera alla Azure OpenAI-språkmodeller som används i detta arbetsflöde: Azure Chat Engine A, Azure Chat Engine B, Azure Chat Engine C, Azure Chat Engine D, Azure Chat Engine Prime, Azure Chat Engine E och Azure Chat Engine F med modellen
4o. - Inloggning krävs: Anslut era azureOpenAiApi-uppgifter för var och en av Azure Chat Engine-noderna ovan.
- I Compose Pose Message, behåll Text satt till
Let's calm down and focus on these poses today.{{ $('Transform Pose Data').item.json.poseNamesOnly }}have a great practice!. - I Format Pose Text, behåll Text satt till
{{ $json.text }}för att formatera instruktörsmeddelandet. - I Generate Flex JSON, behåll Text satt till
{{ $json.outputText }}och säkerställ att hasOutputParser är aktiverat. - Behåll Structured Parser Main och Auto Repair Parser anslutna till AI Task Orchestrator för att normalisera JSON pose-data.
- Behåll Structured Parser Flex och Auto Repair Flex Parser anslutna till Generate Flex JSON för att reparera och validera Flex-utdata.
Tips: Auto Repair Parser, Structured Parser Main, Structured Parser Flex och Auto Repair Flex Parser är AI-undernoder. Lägg till inloggningsuppgifter i deras överordnade Azure Chat Engine-noder (inte i parser-noderna i sig).
Steg 5: Bygg ihop och skicka Line Flex-meddelandet
Det här avsnittet bygger Line-payloaden, normaliserar JSON och skickar meddelandet.
- I Assemble Line Payload, bekräfta att LineBody är satt till JSON-body som innehåller text och Flex-karusell, inklusive uttrycken:
{{ $json.text.replaceAll("\n","\\n").replaceAll("\n","").removeMarkdown().removeTags().replaceAll('"',"") }}och{{ $('Generate Flex JSON').all().flatMap(item => JSON.stringify(item.json.output)).join(',') }}. - Öppna Normalize JSON Output och behåll Text satt till
Fix this JSON {{ $json.LineBody }}med hasOutputParser aktiverat. - Öppna Send Line Flex Message och ställ in URL till
https://api.line.me/v2/bot/message/pushmed MethodPOSToch JSON Body satt till{{ $json.text }}. - Inloggning krävs: Anslut era httpHeaderAuth-uppgifter i Send Line Flex Message.
- Säkerställ att mottagar-ID:t för meddelandet i Assemble Line Payload är satt till ert Line-användar-ID (ersätt
[YOUR_ID]i fältet"to").
⚠️ Vanlig fallgrop: Om Line-payloadens JSON är ogiltig kommer anropet att misslyckas. Steget Normalize JSON Output förlitar sig på Azure Chat Engine F för att fixa strukturen—säkerställ att inloggningsuppgifter är aktiva och att modellåtkomst är aktiverad.
Steg 6: Testa och aktivera ert arbetsflöde
Validera varje steg innan ni slår på arbetsflödet.
- Kör Scheduled Pose Trigger manuellt för att starta en testkörning.
- Verifiera att Retrieve Pose Names hämtar rader från
NotePadoch att Transform Pose Data ger utoutputTextochposeNamesOnly. - Bekräfta att Generate Flex JSON skapar giltiga Flex-poster och att Compose Pose Message samt Format Pose Text ger ut en slutlig meddelandesträng.
- Kontrollera att Send Line Flex Message får ett
200-svar och att ett Line-meddelande visas i den avsedda chatten. - Bekräfta att loggar läggs till i Append Yoga Log och Append Pose Log 2 med korrekt tidsstämpel och innehåll.
- Aktivera arbetsflödet genom att växla Active till ON för produktionsschemaläggning.
Vanliga fallgropar
- Google Sheets-autentisering kan gå ut eller kräva specifika behörigheter. Om saker slutar fungera, kontrollera först n8n-skärmen Credentials och arkets delningsinställningar.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- LINE Messaging API-anrop misslyckas tyst när din JSON är lite fel. Om sändnoden ger fel, titta på HTTP-svarets body och verifiera sedan strukturen på din Flex-payload och din channel access token.
- Standardprompter i AI-noder är generiska. Lägg in din tonalitet tidigt, annars kommer du att redigera utdata för alltid.
Vanliga frågor
Cirka 45 minuter om dina LINE- och Azure-konton är klara.
Nej. Du kopplar främst autentiseringsuppgifter och klistrar in ID:n och tokens. Den enda ”tekniska” delen är att testa LINE-meddelandets utdata och justera text om du vill ha en specifik stil.
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 Azure OpenAI-användning, som oftast är liten för ett dagligt meddelande men beror på modell och promptstorlek.
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 kör n8n bra. Egen drift ger dig obegränsat antal körningar men kräver grundläggande serverhantering.
Ja, men då vill du använda din sändlogg. Enklast är att justera Google Sheets-hämtningen och logiken för urval av positioner direkt efter ”Retrieve Pose Names”, och sedan filtrera bort positioner som redan finns i ”Append Yoga Log” eller ”Append Pose Log 2”. Vanliga justeringar är att rotera efter svårighetsgrad, prioritera nya positioner och införa ”inga upprepningar på 14 dagar”.
Oftast beror det på en ogiltig eller utgången channel access token. Uppdatera token i autentiseringsuppgifterna för HTTP-anropet, kör sedan en enskild testkörning och granska HTTP-svarets body. Om token är okej är nästa orsak ofta formen på Flex Message-payloaden (LINE är petigt) eller att du skickar till fel användar-/grupp-ID. Rate limits är mer ovanligt vid ett meddelande per dag, men kan dyka upp om du plötsligt broadcastar till många mottagare.
Betydligt fler än de flesta små team behöver. På n8n Cloud beror din månatliga körningsgräns på plan, och varje daglig körning är vanligtvis bara en körning. Om du kör egen drift finns ingen körningsgräns, så de verkliga begränsningarna blir serverstorlek samt throughput i LINE/Azure-API:erna.
Ofta, ja. Det här flödet bygger på strukturerad AI-utdata (inklusive automatisk JSON-reparation) och mer avancerad payload-uppbyggnad, vilket är ett område där n8n brukar kännas mindre begränsat än ”tvåstegs”-verktyg. Du kan också köra egen drift, vilket spelar roll om du inte vill att varje daglig körning ska räknas mot en dyr task-gräns. Zapier eller Make kan fortfarande fungera om du håller meddelandet enkelt och hoppar över Flex-karuseller. Om du är osäker, prata med en automatiseringsexpert så kvalitetssäkrar vi bästa väg framåt.
När det här väl rullar slutar dagliga yogapåminnelser att vara en uppgift du ”försöker komma ihåg”. De bara händer – och du har loggen som bevis.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.