Du har matcher som drar igång hela dagen, lineups som ändras sent, och du försöker fortfarande jämföra matchups manuellt. Det är en tidsfälla. Än värre: du fattar beslut på gammal info eftersom du helt enkelt inte hinner uppdatera allt tillräckligt snabbt.
Den här automatiseringen för MLB-picks träffar sportsbettare och DFS-spelare först, om vi ska vara ärliga. Men content marketers som driver “pick of the day”-kanaler och byråoperatörer som bygger sportcommunities känner samma stress. Resultatet är enkelt: en rankad lista över slagarmatchups, uppdaterad varje timme, levererad där du faktiskt ser den.
Du sätter upp ett n8n-workflow som hämtar MLB-schema och lineups, bygger rader för slagman vs. pitcher, skriver rankingar till Google Sheets och skickar sedan toppslagarna till Telegram. Och du lär dig var du justerar trösklar (ERA/OPS) så att dina picks matchar hur du tänker.
Så fungerar den här automatiseringen
Här är det kompletta workflowet du kommer att sätta upp:
n8n Workflow Template: Google Sheets + Telegram: rankade MLB-slagval
flowchart LR
subgraph sg0["11:02 - 8:02 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/code.svg' width='40' height='40' /></div><br/>3. Extract All Player IDs"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>4. Get Batched Player Stats"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>2. Get Daily Games"]
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/code.svg' width='40' height='40' /></div><br/>5. Create Final Matchup Rows"]
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/code.svg' width='40' height='40' /></div><br/>6. Filter for Top Matchups"]
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/code.svg' width='40' height='40' /></div><br/>Column Order"]
n7@{ icon: "mdi:play-circle", form: "rounded", label: "11:02 - 8:02", 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/code.svg' width='40' height='40' /></div><br/>8. 21 Hitters"]
n10@{ icon: "mdi:database", form: "rounded", label: "7. Update Your Sheet", 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/>9. sendToTelegramChatbot"]
n7 --> n2
n5 --> n10
n8 --> n11
n2 --> n0
n10 --> n8
n0 --> n1
n1 --> n3
n4 --> n5
n3 --> n4
end
subgraph sg1["9am Clear Flow"]
direction LR
n6@{ icon: "mdi:play-circle", form: "rounded", label: "9am Clear", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Clear your Sheet", pos: "b", h: 48 }
n6 --> n9
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 n7,n6 trigger
class n10,n9 database
class n1,n2 api
class n0,n3,n4,n5,n8 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n3,n4,n5,n8,n11 customIcon
Varför det här spelar roll: hålla picks aktuella när lineups skiftar
Din “edge” i baseball försvinner snabbt. En trolig pitcher blir struken, en stjärna vilar, vädret vänder en match, och matchupen du gillade för en timme sedan är plötsligt bara medel. Om du sitter och kollar MLB-sidor, kopierar ID:n, letar splits och sedan bygger en snabb ranking i ett kalkylblad, lägger du fokus på mekanik. Det värsta är den mentala belastningen: du frågar hela tiden “missade jag något?” och den osäkerheten smyger sig in i varje beslut du tar efteråt.
Det staplas på snabbt. Här är var det faller isär i verkligheten.
- Du uppdaterar schema- och lineup-sidor om och om igen, och ändå känns det inte “aktuellt” när låstiden närmar sig.
- Manuella matchup-ark glider in i fel eftersom ett inklistrat spelar-ID eller en statrad blir fel.
- Din rankinglogik blir inkonsekvent, eftersom du ändrar vad du “tittar på” beroende på tidspress.
- Du slutar med picks på fem olika ställen, så leverans blir ännu en uppgift i stället för mållinjen.
Vad du bygger: timvisa rankade slagarmatchups till Sheets + Telegram
Det här workflowet körs på schema och bygger om dina rankingar för slagarmatchups automatiskt. Det börjar med att hämta dagens MLB-schema från officiella Stats API (inklusive troliga pitchers och lineup-kontekst), och samlar sedan in spelar-ID:n för de matcher som ingår. Därefter hämtar det säsongsstatistik i batchar via HTTP-förfrågningar så att du inte gör en uppslagning i taget. När datan är på plats sätter workflowet ihop matchup-rader för pitcher vs. slagman, applicerar din urvalslogik (inklusive justerbara trösklar som ERA och OPS) och formaterar resultaten till en korrekt formaterad kolumnordning. Till sist uppdaterar det en flik i Google Sheets och postar ett Telegram-meddelande med toppslagarna, så att du kan titta, besluta och gå vidare.
Morgonkörningen rensar gårdagens sheet så att du börjar med en ren yta. Sedan bygger timkörningen om hela slaten från grunden med senaste schema-/lineup-info, skriver nya rader till Google Sheets och skickar en sammanfattning “Topp 21 slagare” till Telegram. Du får en nästan live-vy utan att behöva passa den.
Det du bygger
| Det som automatiseras | Det du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du vill ha en rankad slaglista för en slate med 10 matcher och att du uppdaterar den 4 gånger per dag (morgon, lunch, sen eftermiddag, före lås). Manuellt kan du lägga cirka 5 minuter per match på att kolla lineups, bekräfta pitchers och rimlighetskolla några stats. Det är ungefär 50 minuter per uppdatering, eller runt 3 timmar under dagen. Med det här workflowet lägger du kanske 10 minuter på morgonen på att kasta ett öga på sheetet och justera trösklar, medan timschemat hanterar ombyggnaderna och pushar topplistan till Telegram.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger funkar bra)
- Google Sheets för att lagra och se rankade matchups.
- Telegram för att ta emot toppvalen för slagare.
- Telegram-bottoken + chatId (skapa en bot i BotFather och hämta sedan ditt chat-ID).
Svårighetsnivå: Mellan. Du bygger ingen full app, men du bör vara bekväm med att klistra in credentials, ändra några värden och testköra.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
En morgonåterställning rensar gårdagens slate. En schemalagd trigger kör en gång på morgonen och använder Google Sheets för att rensa tidigare rader, så att du aldrig blandar gårdagens matchups med dagens matcher.
En timtrigger hämtar dagens matcher. Workflowet anropar MLB Stats API via HTTP Request för att hämta dagens schema, inklusive troliga pitchers och de delar som behövs för att förstå vilka som faktiskt är aktuella.
Spelar-ID:n och statistik batchas. Ett kodsteg samlar alla slag-ID:n som ingår, och sedan hämtar en annan HTTP Request säsongsstatistik i batchar. Det är här workflowet håller sig snabbt, eftersom det inte gör hundratals små uppslag.
Matchups sätts ihop, rankas och skrivs till Sheets. Kodnoder bygger rader för slagman vs. pitcher, ett urvalssteg väljer toppmatchups, och sedan ordnar workflowet slutkolumnerna och uppdaterar din Google Sheet-flik. När sheetet är uppdaterat sammanställer ett annat steg topp 21 slagare och postar dem till Telegram.
Du kan enkelt ändra “Topp N”-antalet för att skicka 10 slagare i stället för 21, eller skärpa ERA/OPS-trösklarna när du vill ha en mindre lista med högre tilltro. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-implementeringsguide
Steg 1: konfigurera schematriggern
Konfigurera de två schematriggrarna som styr den dagliga återställningen av kalkylarket och den timvisa datauppdateringen.
- Öppna Morning Sheet Reset och ställ in schemaregeln så att den körs
09:00och09:15. - Öppna Hourly Schedule Trigger och ställ in cron-uttrycket till
02 11-20 * * *för att köra varje timme mellan 11:02 och 20:02. - Bekräfta körflödet: Morning Sheet Reset → Clear Spreadsheet Data och Hourly Schedule Trigger → Fetch Daily Games.
Steg 2: anslut Google Sheets
Konfigurera kalkylarksnoderna som används för att rensa och uppdatera matchup-rapporten.
- Öppna Clear Spreadsheet Data och ställ in Operation till
clear. - Välj mål-Document ID och Sheet Name för Clear Spreadsheet Data.
- Öppna Update Spreadsheet Rows och ställ in Operation till
appendOrUpdate. - Välj samma Document ID och Sheet Name i Update Spreadsheet Rows för att ta emot de formaterade raderna.
- Autentisering krävs: Anslut era googleSheetsOAuth2Api-uppgifter i både Clear Spreadsheet Data och Update Spreadsheet Rows.
⚠️ Vanlig fallgrop: Fälten Document ID och Sheet Name är tomma som standard. Om ni inte anger dem kommer rensnings- och uppdateringsoperationerna att misslyckas.
Steg 3: konfigurera hämtning av MLB-data
Konfigurera HTTP-förfrågningarna och ID-insamlingen som hämtar dagens matcher och spelarstatistik.
- I Fetch Daily Games ställer ni in URL till
https://statsapi.mlb.com/api/v1/schedule. - I query-parametrarna för Fetch Daily Games ställer ni in sportId till
1, date till{{ $now.toFormat('yyyy-MM-dd') }}och hydrate tillprobablePitcher,lineups. - I Collect All Player IDs behåller ni den medföljande JavaScript-koden för att extrahera pitcher- och lineup-ID:n och generera
playerIdsString. - I Retrieve Batch Player Stats ställer ni in URL till
https://statsapi.mlb.com/api/v1/people. - I query-parametrarna för Retrieve Batch Player Stats ställer ni in personIds till
{{ $json.playerIdsString }}och hydrate tillstats(group=[pitching,hitting,fielding],type=[season]).
Steg 4: konfigurera matchup-bearbetning
Använd kodnoderna för att bygga matchup-rader, välja toppmatchups och ordna den slutliga kolumnordningen.
- I Assemble Matchup Rows behåller ni den medföljande JavaScript-koden för att bygga rader med hjälp av schema-data och spelarstatistik.
- I Select Top Matchups behåller ni filtren och sorteringslogiken som väljer de 9 bästa pitchers baserat på ERA och de 3 bästa batters baserat på OPS, och därefter formaterar
gameStartTimetill Eastern Time. - I Arrange Column Order behåller ni
orderedKeysoch den numeriska formateringen för att tvinga fram kolumnordning och numerisk avrundning. - Bekräfta körflödet: Retrieve Batch Player Stats → Assemble Matchup Rows → Select Top Matchups → Arrange Column Order.
Steg 5: konfigurera utdata och notifieringar
Skicka de formaterade raderna till Google Sheets och publicera en Telegram-sammanfattning av de bästa slagmännen.
- Verifiera att Arrange Column Order skickar utdata direkt till Update Spreadsheet Rows för att lägga till eller uppdatera arket.
- I Compile Top 21 Hitters behåller ni JavaScript-koden som sorterar efter OPS och bygger Telegram-meddelandesträngen.
- I Post Telegram Update ställer ni in Text till
{{ $json.message }}och ställer in Chat ID till er Telegram-chatt, t.ex.[YOUR_ID]. - Autentisering krävs: Anslut era telegramApi-uppgifter i Post Telegram Update.
Tips: Update Spreadsheet Rows är konfigurerad för att försöka igen vid fel och fortsätta vid fel, vilket hjälper till att hålla arbetsflödet igång vid tillfälliga problem med Google Sheets.
Steg 6: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera datahämtning, kalkylarksuppdateringar och Telegram-utdata innan ni aktiverar schemana.
- Klicka på Execute Workflow i Hourly Schedule Trigger för att testa datavägen från Fetch Daily Games till och med Post Telegram Update.
- Bekräfta att Google Sheet tar emot rader från Update Spreadsheet Rows i korrekt kolumnordning.
- Verifiera att ett Telegram-meddelande publiceras korrekt från Post Telegram Update med formatet “Top 21 Batters by OPS”.
- Klicka på Activate för att aktivera schematriggrarna för produktion.
Felsökningstips
- Google Sheets-credentials kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, kolla n8n-sidan Credentials och bekräfta att valt Google-konto fortfarande har åtkomst till det kalkylbladet.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Telegram-botcredentials är lätta att blanda ihop. Dubbelkolla bottoken och chatId i Telegram-noden och skicka sedan ett testmeddelande från n8n innan du litar på timschemat.
Snabba svar
Cirka 30 minuter om dina Google- och Telegram-konton är redo.
Nej. Du kommer mest att klistra in credentials och ändra några värden som fliknamnet i sheetet och chatId.
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 med API-kostnader, även om MLB Stats API-endpoints som används här vanligtvis är gratis.
Två alternativ: n8n Cloud (hanterat, enklast setup) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och hanterar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du. De flesta börjar med att ändra Top N i logiken “Compile Top 21 Hitters”, och justerar sedan ERA/OPS-trösklarna i urvalskoden (noderna som väljer och rankar matchups). Du kan också byta ut Telegram mot e-post eller Slack genom att ersätta noden “Post Telegram Update”, samtidigt som du behåller Google Sheets-utdata.
Oftast är det OAuth-token som löper ut eller att fel Google-konto är anslutet. Anslut Google Sheets på nytt i n8n och bekräfta sedan att kalkylbladet är delat med det kontot och att fliknamnet matchar exakt (extra mellanslag ställer ofta till det). Om workflowet rensar sheetet men inte skriver tillbaka rader, kontrollera att ditt sheet-intervall och rubrikraden inte har ändrats sedan du först testade.
En hel dags slate är inga problem på typiska n8n-uppsättningar.
För det här use caset är n8n oftast bättre, eftersom workflowet bygger på kodbaserade transformationer (bygga matchup-rader, ranka och formatera kolumner) och flerstegslogik med schemalagda grenar. Zapier och Make kan göra det, men du kommer ofta att känna dig begränsad när du behöver batchning, egna rankingregler eller mönstret “rensa och skriv om” i Sheets. Det self-hosted-alternativet är också viktigt om du vill köra varje timme utan att räkna varje task. Om du bara behöver “skicka ett meddelande när ett sheet ändras”, då räcker enklare verktyg. Om du är osäker, prata med en automationsexpert och få en rekommendation baserad på din volym.
När detta väl rullar håller sig ditt sheet uppdaterat och dina picks dyker upp utan att du behöver jaga dem. Du tar fortfarande beslutet, men workflowet gör jaktjobbet.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.