Inventeringar faller isär på samma tråkiga sätt varje gång. Någon hittar ingen penna, någon skriver ”A-12” som ”A/12”, och senare gissar du vad räkningen ens betydde.
Lagercontrollers känner av det först, eftersom det är de som stämmer av röran. Men lagerchefer och små driftteam dras in i det också. Den här Telegram Sheets automation gör röstmeddelanden till korrekt formaterade lageruppdateringar, så att ditt kalkylark hålls aktuellt medan folk fortsätter jobba.
Nedan ser du exakt vad workflowet gör, vilka resultat du kan förvänta dig och vad du behöver för att köra det driftsäkert i ett riktigt lager.
Så fungerar automatiseringen
Hela n8n-workflowet, från trigger till slutlig output:
n8n Workflow Template: Telegram till Google Sheets, handsfree lagerinventering
flowchart LR
subgraph sg0["Telegram Flow"]
direction LR
n0["<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/>Telegram Trigger"]
n1@{ icon: "mdi:robot", form: "rounded", label: "Transcribe Operator Command", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "Model: Information Extraction", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Transcription Error", 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/telegram.svg' width='40' height='40' /></div><br/>Ask to repeat"]
n6@{ icon: "mdi:database", form: "rounded", label: "Update Inventory Quantity", 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/>Error Message: Wrong Location"]
n8@{ icon: "mdi:robot", form: "rounded", label: "Get Location, Qty", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Command", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Collect Remaining Locations", 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/telegram.svg' width='40' height='40' /></div><br/>Collect Audio"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Command Selection", 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/telegram.svg' width='40' height='40' /></div><br/>Help Message"]
n15@{ icon: "mdi:cog", form: "rounded", label: "Remaining Locations", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Number of Locations", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Last Location ?", 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/merge.svg' width='40' height='40' /></div><br/>Combine with Location Records"]
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/telegram.svg' width='40' height='40' /></div><br/>Wrong Command"]
n20@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Audio?", pos: "b", h: 48 }
n21@{ icon: "mdi:database", form: "rounded", label: "Get Locations to Check", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Extract Location IDs", pos: "b", h: 48 }
n23["<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/merge.svg' width='40' height='40' /></div><br/>Merge Transcript With Locati.."]
n24@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Is Location in Scope?", pos: "b", h: 48 }
n25["<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 Instruction: Next Locat.."]
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/telegram.svg' width='40' height='40' /></div><br/>Send Instruction: Last Locat.."]
n27@{ icon: "mdi:cog", form: "rounded", label: "First Location", pos: "b", h: 48 }
n9 --> n12
n9 --> n19
n20 --> n9
n20 --> n11
n20 --> n21
n11 --> n1
n27 --> n25
n17 --> n26
n17 --> n27
n0 --> n20
n12 --> n13
n12 --> n10
n8 --> n4
n16 --> n18
n15 --> n16
n4 --> n5
n4 --> n23
n22 --> n23
n24 --> n6
n24 --> n7
n21 --> n22
n3 -.-> n8
n10 --> n18
n10 --> n15
n1 --> n8
n18 --> n17
n2 -.-> n8
n23 --> n24
end
subgraph sg1["Flow 2"]
direction LR
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
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 trigger
class n1,n3,n8 ai
class n2 aiModel
class n4,n9,n12,n17,n20,n24 decision
class n6,n10,n21 database
classDef customIcon fill:none,stroke:none
class n0,n5,n7,n11,n13,n18,n19,n23,n25,n26 customIcon
Problemet: röstinventeringar hamnar inte i arket
De flesta lager har redan den ”snabba” delen av inventeringar på plats. Gå i gångarna, räkna enheter, gå vidare. Den långsamma delen kommer senare, när räkningarna ska bli en korrekt registrering. Anteckningar skrivs om i slutet av skiftet. Någon tolkar ljudmeddelanden och försöker matcha dem mot plats-ID:n. Sedan upptäcker du att två personer räknade samma fack, eller att en plats hoppades över, så då är du tillbaka ute på golvet igen. Det handlar inte bara om tid. Det handlar om avbrott, att behöva gissa, och lagerdata du inte kan lita på.
Friktionen bygger på. Här brukar det oftast brista.
- Räkningar ligger i någons telefon i timmar eftersom ”jag matar in det senare” blir ”i morgon”.
- Plats-ID:n hörs fel eller skrivs fel, vilket i tysthet korrumperar arket fram till nästa revision.
- Operatörer tappar tempo när de måste stanna, skriva och verifiera format mitt i rundan.
- När en plats redan är räknad räknar man ändå om den, eftersom ingen har en live-lista över ”kvar att räkna” i handen.
Lösningen: prata med Telegram, uppdatera Google Sheets automatiskt
Det här n8n-workflowet gör Telegram till en guidande assistent för inventeringar. En operatör startar processen med ett enkelt kommando, och boten svarar med första lagerplatsen som fortfarande behöver räknas. Operatören går dit, spelar in ett kort röstmeddelande med plats-ID och antal, och skickar det som en vanlig Telegram-ljudnotis. OpenAI:s transkribering gör om ljudet till text, och sedan plockar ett extraktionssteg ut strukturerade fält (ett location_id och ett quantity) så att workflowet kan validera dem. Om meddelandet är otydligt ber boten om en ny inspelning i stället för att skriva in felaktig data. När platsen är giltig och fortfarande väntar på räkning uppdaterar workflowet ditt Google Sheet och frågar direkt efter nästa plats tills inventeringen är klar.
Workflowet startar med Telegram-meddelanden och röstnotiser. AI sköter transkribering och strukturerad extraktion. Google Sheets blir den levande källan till sanning, uppdaterad en bekräftad plats i taget.
Det här får du: automatisering vs. resultat
| Det här automatiserar workflowet | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du har 3 platser att räkna i en snabb mini-inventering (workflow-demot använder tre). Manuellt kan en operatör lägga cirka 2 minuter på att räkna varje plats, och sedan ytterligare 3 minuter totalt på anteckningar, omskrivning och att reda ut vad som sades. Det blir ungefär 10 minuter, och ”skrivdelen” glider ofta senare under skiftet. Med det här workflowet är räknetiden densamma, men administrationen blir en röstnotis på 10 sekunder per plats plus en kort väntan på AI-bearbetning. Du avslutar rundan med arket redan uppdaterat.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
- Telegram för operatörens röstmeddelanden och prompts
- Google Sheets för att lagra väntande platser och antal
- OpenAI API-nyckel (hämta den i OpenAI API-dashboarden)
Kunskapsnivå: Medel. Du kopplar konton, klistrar in API-nycklar och uppdaterar några Sheet-ID:n och promptfält.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Ett Telegram-kommando eller en röstnotis drar igång. Workflowet lyssnar på inkommande Telegram-meddelanden och kontrollerar om det är ett kommando som /start eller ett röstmeddelande som behöver transkriberas.
Väntande platser hämtas från Google Sheets. Workflowet läser din lista över ”ej kontrollerade platser”, summerar vad som återstår och väljer nästa plats att räkna. Om du är på sista platsen ändrar det prompten så att operatören vet att de avslutar.
Röst transkriberas och görs om till strukturerade fält. Ljudklippet laddas ned från Telegram, transkriberas med en OpenAI-nod och skickas sedan till ett AI-extraktionssteg som outputtar en korrekt formaterad JSON-liknande struktur (location_id och quantity). En valideringskontroll fångar stökiga transkriberingar och ber om en ny inspelning.
Arket uppdateras och nästa prompt skickas. Om platsen är giltig och fortfarande ingår uppdateras Google Sheets med antalet. Därefter frågar boten efter nästa plats och använder en kort pause-nod så att meddelanden kommer i en vettig rytm.
Du kan enkelt justera platsnamnstandarden så att den matchar dina lageretiketter utifrån dina behov. Se hela implementeringsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera Telegram-triggern
Konfigurera arbetsflödet så att det lyssnar efter inkommande Telegram-meddelanden och skickar dem vidare till flödet för röstbaserad inventering.
- Lägg till och öppna Telegram Incoming Trigger.
- Under Updates, bekräfta att
messageär valt. - Klicka på Listen for Test Event efter att autentiseringsuppgifterna är anslutna för att validera registreringen av Telegram-webhooken.
Steg 2: Konfigurera kommandoroutning och hjälpsvar
Definiera hur kommandon valideras och hur hjälp eller okända kommandon hanteras.
- I Detect Voice Message, bekräfta att villkoret använder
{{$json.message.voice.file_id}}för att identifiera en röstfil. - I Command Validation, behåll array-kontrollen med
{{ ['/start', '/help'] }}mot{{$json.message.text}}. - I Route Command Choice, verifiera att reglerna jämför
{{$('Telegram Incoming Trigger').item.json.message.text}}med/helpoch/start. - I Help Guidance Reply, behåll Text som hjälpmeddelandet och Chat ID inställt på
{{$('Telegram Incoming Trigger').item.json.message.chat.id}}. - I Unrecognized Command Reply, behåll Text som varningsmeddelandet och Chat ID inställt på
{{$('Telegram Incoming Trigger').item.json.message.chat.id}}.
/start) och inte som ett röstmeddelande.Steg 3: Anslut Google Sheets för platsdata
Dessa noder hämtar och uppdaterar platsrader för inventeringens cykelräkning.
- I Fetch Unchecked Locations, ställ in Sheet Name på
gid=0och Filters påchecked = X. - I Read Pending Locations, ställ in Sheet Name på
gid=0och Filters påchecked = =X. - I Update Sheet Quantity, ställ in Operation på
updateoch mappa kolumner så att location_id är{{$json.output.location_id}}, actual_quantity är{{$json.output.quantity}}och checked ärV. - I Update Sheet Quantity, ställ in Document ID till ert kalkylark (ersätt
[YOUR_ID]).
location_id.Steg 4: Bygg flödet för plats-prompt och parallell aggregering
Den här delen väljer vilken plats som ska efterfrågas och avgör när den sista prompten ska skickas.
- Förstå parallellflödet: Fetch Unchecked Locations skickar output både till Merge Location Records och Aggregate Remaining Sites parallellt.
- I Aggregate Remaining Sites, behåll Fields to Aggregate som mappar location_id till location_ids.
- I Count Remaining Locations, sätt remaining_locations till
{{$json.location_ids.length}}. - I Check Final Location, behåll villkoret
{{$json.remaining_locations}} = {{1}}för att identifiera sista platsen. - I Send Final Location Prompt och Send Next Location Prompt, behåll Chat ID inställt på
{{$('Telegram Incoming Trigger').item.json.message.chat.id}}och det dynamiska plats-id:t i meddelandetexten.
Steg 5: Ställ in rösttranskribering och AI-extraktion
Konfigurera AI-pipelinen som transkriberar röst och extraherar strukturerad plats- och kvantitetsdata.
- I Download Voice Clip, behåll File ID inställt på
{{$json.message.voice.file_id}}och Resource inställt påfile. - I Audio Transcription Task, ställ in Resource på
audio, Operation påtranscribeoch Binary Property Name på=data. - I Extract Location Quantity, ställ in Text på
{{$json.text}}och behåll Has Output Parser aktiverat. - Säkerställ att LLM Extraction Model är ansluten som språkmodell för Extract Location Quantity (använd
gpt-4.1-mini). - Säkerställ att Structured JSON Parser är ansluten som output-parser för Extract Location Quantity med schemaexemplet som visas i noden.
- I Validate Transcription Output, behåll kontrollerna för
{{$json.output.location_id}}och{{$json.output.quantity}}för att routa fel till Request Repeat Message.
Steg 6: Validera platser och uppdatera arket
Det här steget säkerställer att den extraherade platsen fortfarande är giltig och uppdaterar inventeringsräkningen.
- I Read Pending Locations, behåll filtren så att endast ej kontrollerade platser returneras.
- I Aggregate Location IDs, behåll aggregeringen för att bygga location_ids.
- I Join Transcript With List, behåll Mode som
combineBySqlså att transkriptdata joinas mot platslistorna. - I Validate Location Scope, behåll det booleska villkoret
{{$json.location_ids.includes($json.output.location_id)}}för att routa giltiga poster till Update Sheet Quantity och ogiltiga poster till Invalid Location Alert.
Steg 7: Testa och aktivera ert arbetsflöde
Kör ett komplett end-to-end-test för att verifiera Telegram, AI-extraktion och uppdateringar i Google Sheets.
- Klicka på Execute Workflow och skicka
/starti Telegram för att trigga inventeringspromptflödet. - Skicka ett röstmeddelande med en plats och en kvantitet; bekräfta att Audio Transcription Task skapar text och att Extract Location Quantity returnerar JSON.
- Verifiera att Update Sheet Quantity markerar raden som kontrollerad och skriver actual_quantity.
- När allt fungerar, toggla arbetsflödet till Active så att Telegram Incoming Trigger körs i produktion.
Vanliga fallgropar
- Google Sheets-inloggningar kan löpa ut eller kräva specifika behörigheter. Om det slutar fungera, kontrollera först n8n:s status för autentiseringskopplingen och delningsinställningarna för arket.
- Om du använder Wait-noder eller extern bearbetning varierar transkriberingstiderna. Öka väntetiden om nedströms noder fallerar på tomma svar.
- OpenAI-prompter i extraktionsnoder startar generiskt. Lägg in dina riktiga platsformat (som ”A12-03” vs ”A-12-3”) tidigt och tydligt, annars kommer du korrigera output hela veckan.
Vanliga frågor
Cirka 45 minuter om ditt Sheet och din bot är redo.
Nej. Du kopplar mest konton och klistrar in ID:n och API-nycklar. Det hjälper att vara bekväm med att testa och justera prompter.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer startar på 20 USD/månad för högre volym. Du behöver också räkna in OpenAI API-kostnader, som vanligtvis ligger på några cent per röstnotis beroende på längd.
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) 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 serverhantering.
Ja, och det bör du. De flesta anpassningar sker i AI-extraktionsprompten som används för att plocka ut location_id och quantity från transkriberingen, plus valideringslogiken som kontrollerar ”är den här platsen fortfarande väntande?”. Vanliga justeringar är att acceptera flera alias för samma plats, tvinga antal till heltal och avvisa svar som inte innehåller båda fälten.
Oftast beror det på bot-token, webhook eller chattbehörigheter. Skapa en ny Telegram Bot API-token vid behov, uppdatera sedan Telegram-autentiseringsuppgifterna i n8n och testa triggern igen. Bekräfta också att workflowet kan ladda ner röstklipp, eftersom vissa fel bara visar sig när ljudfilen hämtas. Om det fungerar för textmeddelanden men inte för röst är det ledtråden.
Tillräckligt för normala inventeringar. På n8n Cloud är din begränsning främst månatliga exekveringar (varje röstnotis och Sheet-uppdatering räknas), medan self-hosting begränsas av din server. I praktiken kör team detta över dussintals eller hundratals platser så länge Google Sheet är strukturerat och du inte bombarderar boten med samtidiga meddelanden.
Ofta, ja. Rösttranskribering plus validering är där enklare verktyg börjar kännas trånga, eftersom du behöver förgreningslogik, retries och tajtare kontroll över vad som skrivs in i arket. n8n ger dig också ett self-hosting-alternativ, vilket kan spela roll när meddelandevolymen växer. Zapier eller Make kan fortfarande fungera bra för enkel ”meddelande till rad”-loggning, men det här workflowet ligger närmare en guidad process än en enkel synk. Om du vill ha hjälp att välja rätt upplägg för din verksamhet, prata med en automationsexpert.
När detta är på plats slutar inventeringar vara ”räkna nu, fixa senare”. Boten tar hand om det tråkiga, och ditt Google Sheet förblir korrekt medan teamet fortsätter vara i rörelse.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.