Du ber om TRM-kursen och hamnar i samma rutin varje gång: öppnar en webbläsare, letar efter rätt datum, inser att det saknas data och backar sedan dag för dag. Det är irriterande. Och det är förvånansvärt lätt att svara fel när du har bråttom.
Det här drabbar traders och finansadministratörer först, helt ärligt, men även driftansvariga som stöttar LATAM-team känner av det. Med den här TRM-botautomationen skickar du ett meddelande (eller ett röstmeddelande) i Telegram och får ett officiellt TRM-svar för det datumet, plus en trygg reserv när myndighetens dataset saknas den dagen.
Nedan ser du hur arbetsflödet fungerar, vad du får ut av det och vad du behöver för att köra det stabilt i n8n.
Så här fungerar automationen
Hela n8n-arbetsflödet, från trigger till slutlig output:
n8n Workflow Template: Telegram + OpenAI: TRM-svar direkt per datum
flowchart LR
subgraph sg0["Once a Telegram Message is received Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", 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/telegram.svg' width='40' height='40' /></div><br/>Once a Telegram Message is r.."]
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/>Local Current Date and Time"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate if Date is in the p..", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Notify past date"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get TRM"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Valor exists", pos: "b", h: 48 }
n7["<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/telegram.svg' width='40' height='40' /></div><br/>Send message to user"]
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/code.svg' width='40' height='40' /></div><br/>Generate an array with 10 nu.."]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Items for the loop", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get the last 10 responses", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get TRM for past date"]
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/code.svg' width='40' height='40' /></div><br/>Convert date"]
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get non-empty rows", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Sort most recent data", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Get the last data", pos: "b", h: 48 }
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/telegram.svg' width='40' height='40' /></div><br/>Send current TRM"]
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n18["<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/telegram.svg' width='40' height='40' /></div><br/>Send no data"]
n19@{ icon: "mdi:wrench", form: "rounded", label: "Calculator", pos: "b", h: 48 }
n20@{ icon: "mdi:wrench", form: "rounded", label: "Think", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Extractor Agent", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Text only", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "Audio Text", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Text or Audio", pos: "b", h: 48 }
n27["<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/telegram.svg' width='40' height='40' /></div><br/>Download Audio"]
n28@{ icon: "mdi:robot", form: "rounded", label: "Transcribe Audio", pos: "b", h: 48 }
n17 --> n14
n17 --> n18
n20 -.-> n21
n5 --> n6
n22 --> n24
n23 --> n24
n19 -.-> n21
n24 --> n2
n12 --> n11
n27 --> n28
n21 --> n3
n28 --> n23
n15 --> n16
n0 -.-> n21
n13 --> n17
n6 --> n7
n6 --> n8
n11 --> n10
n14 --> n15
n26 --> n27
n26 --> n22
n9 --> n10
n25 -.-> n21
n10 --> n13
n10 --> n12
n2 --> n21
n3 --> n4
n3 --> n5
n8 --> n9
n1 --> n26
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 n1 trigger
class n21,n25,n28 ai
class n0 aiModel
class n19,n20 ai
class n3,n6,n13,n17,n26 decision
class n5,n11 api
class n2,n8,n12 code
classDef customIcon fill:none,stroke:none
class n1,n2,n4,n5,n7,n8,n11,n12,n16,n18,n27 customIcon
Problemet: TRM-uppslag är långsamma, inkonsekventa och lätta att göra fel
TRM-frågor kommer inte i prydliga batcher. De dyker upp mitt i ett samtal, i en kundchatt eller precis innan du ska godkänna en utbetalning. Du slår upp ”TRM för 2024-08-19”, hittar en sida som ser rätt ut men inte är det officiella datasetet, eller upptäcker att datumet saknar publicerat värde. Nu gissar du: använder du föregående bankdag, senaste tillgängliga värdet eller svarar du ”inte tillgängligt”? Multiplicera det med några personer i teamet och några förfrågningar per dag, så får du ett tyst tidstapp plus en rad inkonsekventa svar.
Det blir mycket snabbt. Här är var det faller isär i praktiken.
- Du lägger cirka 10 minuter per förfrågan på att hoppa mellan källor och datum.
- När kursen saknas för en dag hanterar folk det olika, så det ”officiella” svaret varierar beroende på vem som svarar.
- Röstmeddelanden skapar extra friktion eftersom någon måste lyssna, tolka datumet och ändå göra uppslaget.
- Det finns ingen enkel revisionsspårning, vilket gör det svårare att förklara beslut i efterhand.
Lösningen: Telegram frågar, OpenAI plockar ut datumet och n8n returnerar senaste officiella TRM
Det här arbetsflödet gör Telegram till en ”TRM-helpdesk”. En användare skickar ett textmeddelande eller ett röstmeddelande till din Telegram-bot och ber om TRM för ett specifikt datum. OpenAI plockar ut datumet och normaliserar det till ett felfritt YYYY-MM-DD-format, så ”19 augusti”, ”19/08” och ”för i går” kan landa på ett användbart värde. n8n validerar förfrågan (framtida datum får snabbt ett ”inte giltigt”-meddelande), och frågar sedan Colombias öppna data-API på datos.gov.co efter TRM-värdet. Om datasetet har kursen för dagen svarar boten direkt. Om datasetet inte har det, kontrollerar arbetsflödet automatiskt upp till 10 tidigare dagar och returnerar det senaste tillgängliga officiella värdet i stället.
Arbetsflödet startar med en Telegram message trigger. Därifrån routar det text kontra röst, transkriberar röstmeddelanden vid behov och skickar texten via en AI-agent för datumextraktion. Till sist frågar det myndighets-API:t och svarar i Telegram, med en reservsökning som förhindrar återvändsgränder med ”ingen data”.
Det du får: automation kontra resultat
| Vad det här arbetsflödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att ditt team får 10 TRM-förfrågningar per dag i Telegram (vissa text, vissa röst). Manuellt, anta cirka 10 minuter styck: öppna flikar, hitta datumet, bekräfta att det är officiellt och sedan backa om datasetet saknas. Det är ungefär 100 minuter per dag. Med det här arbetsflödet tar det under en minut att skicka förfrågan, och boten svarar oftast inom cirka en minut, även när den måste kontrollera upp till 10 tidigare dagar. Du får tillbaka ungefär en timme om dagen, utan att ändra hur folk redan frågar.
Det här behöver du
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Telegram-bot för att ta emot meddelanden och svara snabbt
- OpenAI för datumextraktion och rösttranskribering
- OpenAI API-nyckel (hämta den från OpenAI-dashboarden)
Kunskapsnivå: Medel. Du kopplar in credentials, testar ett par meddelandetyper och justerar prompts om du vill ha striktare datumhantering.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett Telegram-meddelande startar allt. Arbetsflödet börjar så fort någon skriver till din bot. En switch routar flödet beroende på om det är text eller ett röstmeddelande.
Röst transkriberas, text struktureras. Om det är ljud hämtar n8n Telegrams röstfil och skickar den till OpenAI för transkribering. Båda vägarna mappar till ett normaliserat textfält så att resten av logiken förblir konsekvent.
AI plockar ut ett användbart datum. En OpenAI-driven agent plockar ut avsett datum och formaterar det som YYYY-MM-DD. Arbetsflödet räknar också fram en lokal tidsstämpel så att ”i dag” och ”i går” kan lösas korrekt utifrån din tidszon.
n8n validerar och frågar det officiella datasetet. Om datumet ligger i framtiden svarar boten att det är ogiltigt och stoppar. Annars frågar den datos.gov.co efter TRM-data. När värdet finns får du ett direkt Telegram-svar; om inte kontrollerar den automatiskt tidigare dagar (upp till 10), sorterar resultaten och returnerar det senaste tillgängliga värdet eller ett meddelande om att ”ingen information finns tillgänglig”.
Du kan enkelt ändra beteendet för ”hur långt tillbaka man ska söka” till att kontrollera färre dagar, eller utöka det bortom 10 om ditt behov kräver det. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera Telegram-triggern
Sätt upp startpunkten så att arbetsflödet startar när ett Telegram-meddelande kommer in.
- Lägg till och öppna Telegram Message Trigger.
- Ställ in Updates till
message. - Inloggningsuppgifter krävs: Anslut era
telegramApi-inloggningsuppgifter. - Bekräfta att Telegram Message Trigger skickar utdata till Route Text or Voice.
Steg 2: Anslut Telegram- och OpenAI-tjänster
Säkerställ att alla meddelande- och AI-transkriptionsnoder är auktoriserade innan ni konfigurerar logiken.
- Inloggningsuppgifter krävs: Anslut era
telegramApi-inloggningsuppgifter till Retrieve Voice File, Alert Future Date, Reply With TRM, Send Latest TRM och Notify Missing Data. - Inloggningsuppgifter krävs: Anslut era
openAiApi-inloggningsuppgifter till OpenAI Chat Engine och Transcribe Voice. - I Transcribe Voice, ställ in Resource till
audio, Operation tilltranscribeoch Binary Property Name till=data. - I Transcribe Voice, ställ in Options → Language till
esoch Options → Temperature till0.
Steg 3: Routa text eller röst och normalisera indata
Dela upp Telegram-indatan i text- eller röstflöden och normalisera sedan textfältet för konsekvent bearbetning.
- I Route Text or Voice, behåll de två reglerna som kontrollerar
={{ $json.message.voice }}och={{ $json.message.text }}för att routa ljud kontra text. - Konfigurera Retrieve Voice File med Resource inställt på
fileoch File ID inställt på={{ $json.message.voice.file_id }}. - I Map Text Input, ställ in text till
={{ $json.message.text }}. - I Map Audio Transcript, ställ in text till
={{ $json.text }}. - I Normalize Text Field, ställ in text till
={{ $json.text }}.
message.text eller message.voice, kommer arbetsflödet att gå till fallback-utgången och stanna. Se till att er Telegram-bot tar emot förväntat meddelandeformat.Steg 4: Sätt upp AI för datumextraktion
Använd AI-agenten för att extrahera ett datum från den normaliserade texten och returnera ett strukturerat datumobjekt.
- I Compute Local Timestamp, klistra in den tillhandahållna JavaScript-koden för att generera
fecha_actualochfecha_hora_actual. - I Date Extraction Agent, ställ in Text till
={{ $('Normalize Text Field').item.json.text }}. - I Date Extraction Agent, ställ in Prompt Type till
defineoch behåll Has Output Parser aktiverat. - I Date Extraction Agent, ställ in Options → System Message till den tillhandahållna spanska extraktionsprompten som innehåller
{{ $json.fecha_actual }}. - I Structured Output Formatter, ställ in JSON Schema Example till
{ "date": "2025-04-01" }. - Säkerställ att OpenAI Chat Engine är ansluten som språkmodell för Date Extraction Agent och att Math Utility och Reasoning Helper är anslutna som AI-verktyg.
Steg 5: Konfigurera TRM-hämtning och validering
Validera det extraherade datumet, hämta TRM-data och svara när ett värde finns.
- I Check Date Is Future, jämför
={{ $json.output.date }}mot={{ $('Compute Local Timestamp').item.json.fecha_actual }}med operatorn Date & Time → after. - I Alert Future Date, ställ in Text till
=Fecha posterior a fecha actualoch Chat ID till={{ $('Telegram Message Trigger').item.json.message.from.id }}. - I Retrieve TRM Data, ställ in URL till
=https://www.datos.gov.co/resource/32sa-8pi3.json?vigenciadesde={{ $json.output.date }}. - I Verify Value Presence, behåll villkoret som kontrollerar att
={{ $json.valor }}finns. - I Reply With TRM, ställ in Text till
={{ $json.valor }} TRM del {{ $('Date Extraction Agent').item.json.output.date }}och Chat ID till={{ $('Telegram Message Trigger').item.json.message.from.id }}.
Steg 6: Backfilla senaste TRM och hantera saknad data
Om ingen TRM finns för det begärda datumet söker arbetsflödet de senaste 10 dagarna och skickar det senaste giltiga värdet eller en avisering om saknad data.
- I Build 10-Step Counter, behåll JavaScript-koden som genererar en 1–10-array.
- I Expand Counter Items, ställ in Field to Split Out till
counter. - I Shift Date Backward, behåll koden som beräknar
adjustedDatebaserat på Check Date Is Future. - I Fetch Prior TRM, ställ in URL till
=https://www.datos.gov.co/resource/32sa-8pi3.json?vigenciadesde={{ $json.adjustedDate }}. - I Filter Nonempty Records och Branch on Value, behåll villkoret som kontrollerar att
={{ $json.valor }}finns. - I Sort Latest Entries, ställ in Field Name till
vigenciadesdeoch Order tilldescending. - I Send Latest TRM, ställ in Text till
={{ $json.valor }} TRM del {{ $('Date Extraction Agent').item.json.output.date }}och Chat ID till={{ $('Telegram Message Trigger').item.json.message.from.id }}. - I Notify Missing Data, ställ in Text till
=No existe información para la fecha proporcionada: {{ $('Date Extraction Agent').item.json.output.date }}och Chat ID till={{ $('Telegram Message Trigger').item.json.message.from.id }}.
Steg 7: Testa och aktivera ert arbetsflöde
Verifiera end-to-end-beteendet och slå sedan på arbetsflödet för användning i produktion.
- Klicka på Execute Workflow och skicka ett Telegram-meddelande med ett datum (eller ett röstmeddelande) till boten som är kopplad till Telegram Message Trigger.
- Bekräfta körvägen: Telegram Message Trigger → Route Text or Voice → Normalize Text Field → Compute Local Timestamp → Date Extraction Agent → Check Date Is Future → Retrieve TRM Data.
- Verifiera att en lyckad körning returnerar antingen Reply With TRM eller Send Latest TRM med ett värde i meddelandet.
- Växla arbetsflödet till Active för att aktivera kontinuerlig bearbetning.
Vanliga fallgropar
- Telegram-credentials kan löpa ut eller så kan bot-token roteras. Om meddelanden slutar trigga, kontrollera Telegram-credentials i n8n och bekräfta att boten fortfarande har behörighet att läsa uppdateringar.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om noder längre fram fallerar på tomma svar.
- OpenAI-prompts och strukturerade outputs blir sällan perfekta på första försöket. Lägg in dina förväntade datumformat (och dina antaganden om tidszon) i agenten för datumextraktion, annars kommer du att rätta kantfall för alltid.
Vanliga frågor
Cirka 30 minuter om din Telegram-bot och din OpenAI-nyckel är klara.
Nej. Du kopplar konton och klistrar in en API-nyckel. Den enda ”tekniska” delen är att testa några exempelmeddelanden för att bekräfta att datumet extraheras korrekt.
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 OpenAI API-kostnader, som vanligtvis är några cent per förfrågan för korta meddelanden och en kort transkribering.
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 hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Ja. Delarna ”Build 10-Step Counter” och ”Shift Date Backward” styr hur många tidigare datum som kontrolleras, så du kan utöka sökfönstret eller strama åt det. Vanliga anpassningar är att bara kontrollera bankdagar, tvinga en specifik tidszon i datumlogiken och logga varje förfrågan (datum, frågeställare, returnerad TRM) till Google Sheets.
Oftast beror det på en ogiltig eller roterad bot-token i n8n. Generera en ny token i BotFather vid behov, uppdatera sedan Telegram-credentials och testa Telegram Message Trigger igen. Bekräfta också att boten får ta emot meddelanden (privacy mode kan påverka beteendet i grupper) och att din n8n-instans når Telegrams API från ditt nätverk. Om röstmeddelanden fallerar men text fungerar, handlar det ofta om behörighet att ladda ner filer eller ett saknat steg i flödet ”Retrieve Voice File”.
En typisk uppsättning kan hantera hundratals förfrågningar per dag, och den verkliga gränsen är din n8n-kvot för körningar (i Cloud) plus OpenAI:s rate limits. Om du self-hostar finns ingen fast körningsgräns, men serverstorleken spelar roll. Den tyngre vägen är röstmeddelanden eftersom transkribering tar längre tid och kostar mer än ren text. Om du förväntar dig toppar (som måndagsmorgnar), lägg till enkel throttling eller köhantering så att du inte slår i API-gränser.
Ofta, ja, eftersom det här arbetsflödet behöver förgrening (text kontra röst), strukturerad AI-extraktion och en loop som ”söker bakåt upp till 10 dagar”, vilket är krångligt och dyrt i många no-code-verktyg. n8n ger dig också möjligheten att self-hosta, vilket kan spela roll om användningen växer. Zapier eller Make kan fortfarande fungera om du bara vill ha textmeddelanden och ett enda API-uppslag, utan reservlogik. Om du är osäker, prata med en automationsexpert så får du en rak rekommendation.
När det här är live slutar TRM-förfrågningar att stjäla fokus under dagen. Arbetsflödet sköter de repetitiva uppslagen och du får korrekta svar tillbaka i Telegram när du behöver dem.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.