Telegram-support blir rörig snabbt. En kund skickar tre korta meddelanden, din automation triggar tre gånger och plötsligt jonglerar du dubletter, ofullständig kontext och en tråd som känns… stressig.
Den här Redis-batchningen för Telegram träffar supportansvariga först, men driftschefer och byråägare märker det också. Du får ett konsoliderat ”slutmeddelande” per session i stället för en storm av triggers, så du kan svara en gång med hela bilden.
Nedan ser du hur flödet buffrar inkommande chattfragment i Redis, väntar på en lugn stund (eller en tröskel för antal meddelanden), slår ihop dem och lämnar över en enda strukturerad begäran till ditt system.
Så fungerar den här automationen
Se hur detta löser problemet:
n8n Workflow Template: Redis + Telegram: mer strukturerade chatt-svar
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing1", pos: "b", h: 48 }
n2["<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/>get wait seconds"]
n3["<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/redis.svg' width='40' height='40' /></div><br/>Set last_seen"]
n4["<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/redis.svg' width='40' height='40' /></div><br/>Get waiting_reply"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Mod input", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "waiting_reply?", pos: "b", h: 48 }
n7@{ icon: "mdi:play-circle", form: "rounded", label: "When chat message received", pos: "b", h: 48 }
n8["<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/redis.svg' width='40' height='40' /></div><br/>Set waiting_reply"]
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/redis.svg' width='40' height='40' /></div><br/>Get buffer"]
n10["<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/redis.svg' width='40' height='40' /></div><br/>Delete buffer_in"]
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/redis.svg' width='40' height='40' /></div><br/>Delete waiting_reply"]
n12@{ icon: "mdi:cog", form: "rounded", label: "WaitSeconds", 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/redis.svg' width='40' height='40' /></div><br/>Buffer messages"]
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/redis.svg' width='40' height='40' /></div><br/>Set buffer_count increment"]
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/redis.svg' width='40' height='40' /></div><br/>Get last_seen"]
n16["<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/redis.svg' width='40' height='40' /></div><br/>Get buffer_count"]
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map ouput", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Inactivity + Count", pos: "b", h: 48 }
n19["<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/redis.svg' width='40' height='40' /></div><br/>Delete waiting_reply1"]
n20@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing2", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n22@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "Mock input data", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing3", pos: "b", h: 48 }
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config Parameters", pos: "b", h: 48 }
n26["<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/>consolidate buffer"]
n21 --> n18
n5 --> n6
n9 --> n26
n12 --> n15
n15 --> n16
n3 --> n20
n6 --> n20
n6 --> n8
n13 --> n14
n13 --> n3
n13 --> n4
n23 --> n25
n10 --> n24
n16 --> n18
n2 --> n13
n25 --> n2
n4 --> n5
n8 --> n12
n26 --> n17
n26 --> n10
n26 --> n11
n26 --> n19
n11 --> n24
n19 --> n24
n18 --> n9
n18 --> n1
n1 --> n21
n14 --> n20
n7 --> n23
n22 --> n25
n0 --> n23
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,n7,n22 trigger
class n6,n18 decision
class n3,n4,n8,n9,n10,n11,n13,n14,n15,n16,n19 database
class n2,n26 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n8,n9,n10,n11,n13,n14,n15,n16,n19,n26 customIcon
Utmaningen: fragmenterade meddelanden triggar för många svar
Folk skriver inte en prydlig supportförfrågan. De skriver ”Hej”, sedan ”Snabb fråga”, sedan klistrar de in ordernumret och sedan lägger de till själva problemet. Om din Telegram-automation reagerar direkt på varje meddelande hamnar du med flera ärenden, upprepade taggar, dubbla uppföljningar eller, ännu värre, flera AI-anrop som svarar på olika delar av samma problem. Det är inte bara bortkastad tid. Det är den mentala belastningen av att skanna vad som ändrats, lista ut vilket svar som är ”det rätta” och städa upp efteråt.
Inget av detta är ett problem var för sig. Tillsammans är de det.
- Du får dubbla triggers för en konversation, vilket skapar brusiga loggar och förvirrande överlämningar.
- Korta meddelanden kommer utan kontext, så dina svar blir antingen fel eller fulla av följdfrågor.
- Team börjar fördröja svar ”manuellt” bara för att vänta på att kunden ska skriva klart.
- Om du använder AI längre ned i kedjan betalar du för upprepade anrop som borde ha varit en enda förfrågan.
Lösningen: buffra i Redis, svara en gång när de är klara
Det här flödet fungerar som en artig ”skrivbuffert” för Telegram-konversationer. När ett meddelande kommer in sparar det texten i en Redis-lista kopplad till ett sessions-ID (context_id) och uppdaterar en ”senast sedd”-tidsstämpel. Sedan väntar det under ett kort inaktivitetsfönster som justeras baserat på meddelandets längd. Om kunden fortsätter att skicka meddelanden fortsätter flödet inte att svara; det fortsätter att buffra. När användaren slutar (eller när du når en liten batchtröskel) hämtar flödet de buffrade meddelandena, konsoliderar dem med lättviktig JavaScript (ingen extern LLM krävs), rensar Redis-nycklarna och returnerar ett sammanslaget meddelande som du kan svara på utan krångel.
Flödet startar på en inkommande Telegram-chattrigger (eller en test-/manuell trigger när du sätter upp det). Redis lagrar meddelanden, räknar dem och håller en ”väntar”-flagga så att du inte kör konkurrerande svarsslingor. Till sist slår konsolideringsfunktionen ihop och avduplicerar de buffrade texterna och skapar en enda, lugn payload till nästa steg.
Vad som förändras: före vs. efter
| Detta elimineras | Effekten du kommer att märka |
|---|---|
|
|
Effekt i verkligheten
Säg att en kund brukar skicka 3 separata Telegram-meddelanden för att förklara ett problem. Utan batchning blir det 3 flödeskörningar, 3 notifieringar och ofta 3 delvisa svar, vilket lätt kan äta upp cirka 10 minuter av fram-och-tillbaka per ärende. Med det här flödet buffrar du fragmenten och väntar cirka 10–20 sekunder (baserat på meddelandets längd) innan du agerar. Resultatet är en konsoliderad förfrågan och ett strukturerat svar, vilket typiskt sparar några timmar i veckan när volymen ökar.
Krav
- n8n-instans (testa n8n Cloud gratis)
- Självhostat alternativ om du föredrar det (Hostinger fungerar bra)
- Redis för att buffra meddelanden per session.
- Telegram för att ta emot chattmeddelanden och svara.
- Telegram-bottoken (hämta den via BotFather i Telegram).
Svårighetsgrad: Nybörjare. Du kopplar Redis och Telegram och klistrar sedan in en liten kodsnutt som redan ingår i flödet.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).
Flödet, steg för steg
Ett Telegram-meddelande kommer in. Flödet fångar texten och ett context_id (din sessionsidentifierare) så att varje konversation buffras separat.
Redis lagrar fragmenten och timingen. Varje meddelande pushas in i en Redis-lista, en räknare ökar och en ”senast sedd”-tidsstämpel uppdateras. En liten ”väntar på svar”-flagga förhindrar att flera svarsslingor körs samtidigt.
Flödet väntar och kontrollerar om det ska trigga. En konfigurerbar fördröjning (kortare för längre meddelanden, längre för små) ger användaren tid att skriva klart. Om inaktiviteten passerar timeouten eller bufferten når batchtröskeln fortsätter det. Om inte väntar det igen och kontrollerar på nytt.
Meddelanden konsolideras, avdupliceras och returneras. Flödet hämtar den buffrade listan, sorterar efter tidsstämpel, tar bort dubletter, slår ihop texten till ett enda strukturerat meddelande, rensar Redis-nycklar för sessionen och lämnar över slut-payloaden till ditt svars-steg.
Du kan enkelt justera inaktivitetsfönstret och batchtröskeln för att matcha din målgrupp (snabba skrivare vs. långsamma, korta frågor vs. långa). Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Det här arbetsflödet kan startas manuellt, via chattinmatning eller av ett annat arbetsflöde. Konfigurera alla tre trigger-vägarna så att de matchar era behov för test och produktion.
- Lägg till och behåll noden Manual Run Start för manuell testning.
- Konfigurera Incoming Chat Trigger för att ta emot chattinmatning vid skarp användning.
- Konfigurera External Workflow Trigger med indata context_id och message för att tillåta att uppströmsarbetsflöden anropar det här flödet.
- Säkerställ att både Incoming Chat Trigger och Manual Run Start ansluter till Prepare Sample Payload, och att External Workflow Trigger ansluter till Define Config Values.
Steg 2: anslut Redis
Det här arbetsflödet använder Redis i stor utsträckning för buffring, räknare och flaggor. Anslut Redis-inloggningsuppgifter till alla Redis-noder.
- Öppna varje Redis-nod och anslut inloggningsuppgifter: Credential Required: anslut era redis-inloggningsuppgifter.
- Tillämpa inloggningsuppgifter på alla Redis-noder (11 totalt), inklusive Queue Incoming Messages, Increment Buffer Counter, Store Last Seen Time, Fetch Waiting Flag, Set Waiting Flag, Read Last Seen Time, Read Buffer Counter, Retrieve Message Buffer, Remove Buffer List, Clear Waiting Flag och Remove Buffer Counter.
Steg 3: konfigurera logik för meddelandeförberedelse och timing
Dessa noder förbereder meddelandepayloaden och beräknar fördröjningsfönstret baserat på meddelandets längd.
- I Prepare Sample Payload ställer ni in context_id till
{{ $json.sessionId }}och message till{{ $json.chatInput || 'Chat 2'}}. - I Define Config Values ställer ni in minWords till
3, waitLong till10, waitShort till20och batchThreshold till3. - Behåll koden i Compute Delay Seconds som den är så att den beräknar
waitSecondsbaserat på antal ord.
Steg 4: buffra inkommande meddelanden och spåra aktivitet
Det här steget lagrar inkommande meddelanden i Redis, sätter räknare och hanterar väntflaggan.
- I Queue Incoming Messages ställer ni in List till
buffer_in:{{$json.context_id}}och Message Data till{{ JSON.stringify({ "message": $json.message, "timestamp": $now }) }}. - I Increment Buffer Counter ställer ni in Key till
buffer_count:{{$json.context_id}}och Expire till{{$json.waitSeconds + 60}}. - I Store Last Seen Time ställer ni in Key till
last_seen:{{ $json.context_id}}, TTL till{{ $json.waitSeconds + 60 }}och Value till{{$now.toMillis()}}. - I Fetch Waiting Flag ställer ni in Key till
waiting_reply:{{$json.context_id}}och Property Name tillwaiting_reply. - I Assemble Input Fields ställer ni in waiting_reply till
{{ $json.waiting_reply }}, context_id till{{ $('Define Config Values').item.json.context_id }}, message till{{ $('Define Config Values').item.json.message }}och waitSeconds till{{ $('Compute Delay Seconds').item.json.waitSeconds }}. - Bekräfta att Queue Incoming Messages skickar utdata till Increment Buffer Counter, Store Last Seen Time och Fetch Waiting Flag parallellt.
Steg 5: konfigurera vänteläge och inaktivitetskontroller
Dessa noder avgör om flödet ska vänta eller tömma bufferten baserat på inaktivitet eller batchstorlek.
- I Check Waiting Flag behåller ni villkoret
{{ $json.waiting_reply != null}}för att avgöra om en väntan redan pågår. - I Set Waiting Flag ställer ni in Key till
waiting_reply:{{ $json.context_id }}, TTL till{{ $json.waitSeconds }}och Value tilltrue. - I Delay by Seconds ställer ni in Amount till
{{ $json.waitSeconds }}. - I Read Last Seen Time och Read Buffer Counter behåller ni Key-värdena kopplade till
last_seen:{{$json.context_id}}ochbuffer_count:{{ $('Assemble Input Fields').item.json.context_id }}. - I Evaluate Inactivity Or Count behåller ni båda villkoren:
{{$json.count != null && Number($json.count) >= 3}}och{{($now.toMillis() - $('Read Last Seen Time').item.json.last_seen) >= $('Assemble Input Fields').item.json.waitSeconds * 1000}}. - I Hold Until Next Check ställer ni in Amount till
{{ Math.max(0, Math.ceil(( $('Assemble Input Fields').item.json.waitSeconds * 1000 - ($now.toMillis() - $('Read Last Seen Time').item.json.last_seen)) / 1000)) }}för att undvika negativa fördröjningar.
Steg 6: konsolidera och rensa bufferten
När inaktivitet eller batchtröskel uppnås konsolideras bufferten och Redis-nycklar rensas.
- I Retrieve Message Buffer ställer ni in Key till
buffer_in:{{ $('Compute Delay Seconds').item.json.context_id }}och Property Name tillbuffer. - Behåll koden i Consolidate Buffer Data intakt så att den parsar, avduplicerar och sammanfogar buffrade meddelanden.
- I Map Final Payload mappar ni message till
{{ $json.message }}och context_id till{{$('Compute Delay Seconds').item.json.context_id }}. - Bekräfta att Consolidate Buffer Data skickar utdata till Map Final Payload, Remove Buffer List, Clear Waiting Flag och Remove Buffer Counter parallellt.
Idle Placeholder A, Idle Placeholder B och Idle Placeholder C är no-op-noder för routning och kan behållas för tydlighet eller framtida utbyggnad.
Steg 7: testa och aktivera ert arbetsflöde
Verifiera buffertbeteendet end-to-end och aktivera sedan arbetsflödet för användning i produktion.
- Klicka på Manual Run Start och skicka flera meddelanden via Incoming Chat Trigger för att simulera en batch.
- Verifiera att Redis-nycklar skapas:
buffer_in:*,buffer_count:*ochlast_seen:*, och att Evaluate Inactivity Or Count routar till Retrieve Message Buffer när tröskeln eller fördröjningen uppnås. - Bekräfta att den slutliga payloaden visas i Map Final Payload med ett konsoliderat message och context_id.
- Aktivera arbetsflödet och använd Incoming Chat Trigger eller External Workflow Trigger för produktionstrafik.
Se upp för
- Redis TTL-inställningar kan ställa till det om de är för korta. Om buffertar ”försvinner slumpmässigt”, kontrollera nycklarnas utgångstid och bekräfta att klocka/tidszon i din instans är rimlig.
- Om du använder Wait-noder eller extern rendering varierar processtider. Öka väntetiden om noder längre ned i flödet fallerar på tomma svar.
- Telegram-uppgifter och behörigheter kan vara kinkiga. Om svar slutar skickas, kontrollera bottoken igen, bekräfta att boten finns i chatten och titta på felinformationen i Telegram-noden i senaste körningen.
Vanliga frågor
Cirka 30 minuter om Redis och din Telegram-bot är redo.
Ja. Ingen kodning krävs utöver att klistra in den medföljande konsolideringssnutten, och det mesta av arbetet är bara att koppla Redis- och Telegram-uppgifter.
Ja. n8n har ett gratis självhostat 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 kostnad för Redis-hosting (ofta några dollar i månaden på en VPS).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärd och klarar n8n bra. Självhosting ger obegränsade körningar men kräver grundläggande serveradministration.
Det kan du. De flesta team börjar med att redigera noden ”Define Config Values” (minWords, waitShort, waitLong, batchThreshold) för att matcha hur deras kunder skriver. Om du vill ha annan formatering ändrar du join-separatorn i kodenoden ”Consolidate Buffer Data” (till exempel byt från mellanslag till radbrytningar). Du kan också filtrera bort systembrus genom att ignorera tomma texter eller kända bot-meddelanden innan den slutliga sammanslagningen.
Oftast beror det på en felaktig eller roterad bottoken. Uppdatera Telegram-uppgifterna i n8n och bekräfta sedan att boten faktiskt finns i chatten där du testar. Om det fortfarande misslyckas, kontrollera detaljerna för senaste körningen och Telegram-nodens felmeddelande, eftersom det ofta visar om det handlar om behörigheter, chat-ID som inte matchar eller rate limiting.
Om du självhostar n8n finns ingen körningsgräns (det beror på din server). På n8n Cloud beror kapaciteten på din plans månadsvisa antal körningar. Rent praktiskt klarar Redis många korta chatt-skrivningar, och flödet är lättviktigt eftersom konsolideringen görs med inbyggd JavaScript i stället för externa AI-anrop.
Ofta, ja. Zapier och Make är bra för enkla ”meddelande in, åtgärd ut”-flöden, men det här use caset kräver state (buffert, last_seen, räknare) och logik som kontrollerar timing och förhindrar parallella svar. n8n plus Redis hanterar det snyggt, och du kan självhosta för obegränsade körningar när volymen växer. Om du redan har Redis i din stack är integrationen rak och billig att drifta. Om du är osäker på vad som passar ditt team bäst, prata med en automationsexpert så mappar vi det mot din faktiska meddelandevolym.
Strukturerade indata ger bättre support. Sätt upp detta en gång, så slutar dina Telegram-konversationer att kännas som ett rörligt mål.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.